⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 medit.c

📁 miniucgui1.30版本的源码
💻 C
📖 第 1 页 / 共 5 页
字号:
    {        int off=0;        off1 = MIN (strlen(caption),LEN_MLEDIT_BUFFER);        if (off1 && (char)caption[off1-1] == '\r')            off = off1-1;        else            off = off1;        if (pMLEditData->curtotalLen + MIN (off,LEN_MLEDIT_BUFFER) >= pMLEditData->totalLimit)        {            pLineData->dataEnd = pMLEditData->totalLimit-pMLEditData->curtotalLen;            if (pLineData->dataEnd-2 > 0 && (char)caption[pLineData->dataEnd-2] == '\r')                pLineData->dataEnd -= 2;            else if (pLineData->dataEnd-1 > 0 && (char)caption[pLineData->dataEnd-1] == '\n')                pLineData->dataEnd --;            memcpy(pLineData->buffer,caption, pLineData->dataEnd);            pLineData->buffer[pLineData->dataEnd] = '\0';        }else {            memcpy(pLineData->buffer,caption,off1);            if (off1 && pLineData->buffer[off1-1] == '\r')                pLineData->buffer[off1-1] = '\0';            else                pLineData->buffer[off1] = '\0';            pLineData->dataEnd         = strlen(pLineData->buffer);             pLineData->next            = NULL;         }        pMLEditData->curtotalLen += pLineData->dataEnd;        if (pMLEditData->curtotalLen == pMLEditData->totalLimit-1)            pMLEditData->curtotalLen = pMLEditData->totalLimit;        if (!pLineData->dataEnd)        {            pLineData->nwrapline = 1;            pLineData->wrapStartPos[0] = 0;            pLineData->wrapStartPos[1] = 0;        } else              calcLineInfo (hWnd, pMLEditData, pLineData);        pMLEditData->wraplines += pLineData->nwrapline;        pLineData->lineNO = lineNO++;    }    pMLEditData->lines      = lineNO;     if (dwStyle & ES_AUTOWRAP)        pMLEditData->linesDisp     =  MIN (pMLEditData->wraplines, pMLEditData->MaxlinesDisp);    else        pMLEditData->linesDisp     =  MIN (lineNO , pMLEditData->MaxlinesDisp);    pMLEditData->EndlineDisp = pMLEditData->StartlineDisp + pMLEditData->linesDisp -1;}PLINEDATA GetLineData(PMLEDITDATA pMLEditData,int lineNO){    PLINEDATA pLineData=pMLEditData->head;    for (; pLineData; pLineData=pLineData->next)    {        if(pLineData->lineNO==lineNO)            return pLineData;    }    return NULL;}int GetMaxLen (HWND hWnd, PMLEDITDATA pMLEditData){    int i;    PLINEDATA pLineData = pMLEditData->head;        i = 0;    while (pLineData)    {        edtGetLineInfo (hWnd, pLineData);        if (pMLEditData->sz.cx > i)             i = pMLEditData->sz.cx;        pLineData = pLineData->next;    }    return i;}// get the valid unit position in the array // according to the pos // which is relative to the original point of current line (0)  static int  edtGetNewvPos (HWND hWnd, PLINEDATA pLineData , int pos){    int i = 0;    int dist = MAX_IMPOSSIBLE;    int newdist = 0;        PMLEDITDATA pMLEditData = (PMLEDITDATA) GetWindowAdditionalData2(hWnd);    edtGetLineInfo (hWnd, pLineData);    if (pos < 0) return -1;    if (pos > pMLEditData->sz.cx) return -2;    for (i=0; i<pMLEditData->fit_chars + 1; i++) {        newdist = pos - pMLEditData->dx_chars[i];        if (newdist > 0 && newdist < dist)            dist = newdist;        else              return i;    }    return 0;}static void edtSetScrollInfo (HWND hWnd, PMLEDITDATA pMLEditData, BOOL fRedraw){    SCROLLINFO     si;    PLINEDATA     pLineData;    RECT         rc;    int         viLn;    // Vscroll    GetClientRect (hWnd, &rc);    viLn = (rc.bottom - rc.top - pMLEditData->topMargin - pMLEditData->bottomMargin) / pMLEditData->lineHeight;        si.fMask = SIF_RANGE | SIF_PAGE | SIF_POS;        if ((GetWindowStyle(hWnd)) & ES_AUTOWRAP)         si.nMax = pMLEditData->wraplines - 1;    else        si.nMax = pMLEditData->lines - 1;    si.nMin = 0;    si.nPage = MIN (pMLEditData->EndlineDisp - pMLEditData->StartlineDisp + 1, viLn);        si.nPos = pMLEditData->StartlineDisp;        if ((si.nMax < viLn) && (!si.nPos)) {        si.nMax = 100;        si.nMin = 0;        si.nPage = 10;        si.nPos = 0;        SetScrollInfo (hWnd, SB_VERT, &si, fRedraw);//        EnableScrollBar (hWnd, SB_VERT, FALSE);    } else {        SetScrollInfo (hWnd, SB_VERT, &si, fRedraw);//        EnableScrollBar (hWnd, SB_VERT, TRUE);    }        if ((GetWindowStyle(hWnd)) & ES_AUTOWRAP)     {        EnableScrollBar (hWnd, SB_HORZ, FALSE);        return;    }    // Hscroll    pLineData = GetLineData(pMLEditData, pMLEditData->editLine);    si.nMax = GetMaxLen(hWnd, pMLEditData) - 1;    si.nMin = 0;    si.nPage = edtGetOutWidth (hWnd);    edtGetLineInfo (hWnd, pLineData);    si.nPos = pMLEditData->dispPos;                if (si.nMax < si.nPage && (!si.nPos)) {        si.nMax = 100;        si.nMin = 0;        si.nPage = 10;        si.nPos = 0;        SetScrollInfo (hWnd, SB_HORZ, &si, fRedraw);//        EnableScrollBar (hWnd, SB_HORZ, FALSE);    } else {        SetScrollInfo (hWnd, SB_HORZ, &si, fRedraw);//        EnableScrollBar (hWnd, SB_HORZ, TRUE);    }}int edtGetLineNums (PMLEDITDATA pMLEditData, int curline, int* line, int* wrapLine){       PLINEDATA      pLineData = pMLEditData->head;    int startline = 0;    if (!curline)    {        *line = 0;        *wrapLine = 0;        return 0;    }    for (; pLineData; pLineData=pLineData->next)    {        if (startline+pLineData->nwrapline-1 >= curline)        {            *line = pLineData->lineNO;            *wrapLine = curline - startline;            return 0;        }        startline +=pLineData->nwrapline;    }    return -1;}// to set the Caret to a valid posBOOL edtGetCaretValid (HWND hWnd, int lineNO, int olddispPos, int newOff/*of caret*/){    int line, wrapline;    int dist = MAX_IMPOSSIBLE;    int i, newdist = 0;    PLINEDATA temp;    PMLEDITDATA pMLEditData =(PMLEDITDATA) GetWindowAdditionalData2(hWnd);            if (GetWindowStyle(hWnd) & ES_AUTOWRAP)    {        edtGetLineNums (pMLEditData, lineNO, &line, &wrapline);        temp = GetLineData (pMLEditData, line);        edtGetLineInfo (hWnd, temp);        if( newOff >= pMLEditData->dx_chars[temp->wrapStartPos[wrapline+1]]                            - pMLEditData->dx_chars[temp->wrapStartPos[wrapline]])        {            if (wrapline < temp->nwrapline-1)                pMLEditData->veditPos = temp->wrapStartPos[wrapline+1]-1;            else                pMLEditData->veditPos = temp->wrapStartPos[wrapline+1];        }else {            newOff += pMLEditData->dx_chars[temp->wrapStartPos[wrapline]];            for (i=temp->wrapStartPos[wrapline]; i<temp->wrapStartPos[wrapline+1]+1; i++) {                newdist = newOff - pMLEditData->dx_chars[i];                if (newdist > 0 && newdist < dist)                    dist = newdist;                else {                       pMLEditData->veditPos =i;                    return FALSE;                }            }        }    }else {                temp = GetLineData (pMLEditData, lineNO);        edtGetLineInfo (hWnd, temp);        if( olddispPos > pMLEditData->sz.cx )         {            pMLEditData->veditPos = pMLEditData->fit_chars;               pMLEditData->vdispPos = edtGetStartDispPosAtEnd (hWnd, temp);            return TRUE;        }else {            pMLEditData->veditPos = edtGetNewvPos (hWnd, temp, newOff);            if (pMLEditData->veditPos == -2)                pMLEditData->veditPos = pMLEditData->fit_chars;            pMLEditData->vdispPos = edtGetNewvPos (hWnd, temp, olddispPos);            if (olddispPos != pMLEditData->dx_chars[pMLEditData->vdispPos])                return TRUE;        }    }    return FALSE;}void edtSetCaretPos (HWND hWnd){    int line = 0, wrapline = 0;    PMLEDITDATA pMLEditData =(PMLEDITDATA) GetWindowAdditionalData2(hWnd);    PLINEDATA temp;    if (GetWindowStyle(hWnd) & ES_AUTOWRAP)    {        edtGetLineNums (pMLEditData, pMLEditData->editLine, &line, &wrapline);        temp = GetLineData (pMLEditData, line);        edtGetLineInfo (hWnd, temp);        SetCaretPos (hWnd,                 pMLEditData->dx_chars[pMLEditData->veditPos]                     - pMLEditData->dx_chars[temp->wrapStartPos[wrapline]]                    + pMLEditData->leftMargin,                 (pMLEditData->editLine-pMLEditData->StartlineDisp) * pMLEditData->lineHeight                    + pMLEditData->topMargin);            }else {        temp = GetLineData (pMLEditData, pMLEditData->editLine);        edtGetLineInfo (hWnd, temp);        SetCaretPos (hWnd,                 pMLEditData->dx_chars[pMLEditData->veditPos]                     - pMLEditData->dx_chars[pMLEditData->vdispPos]                    + pMLEditData->leftMargin,                 (pMLEditData->editLine-pMLEditData->StartlineDisp) * pMLEditData->lineHeight                    + pMLEditData->topMargin);    }}void edtPosProc (HWND hWnd){    int line, wrapline;    PMLEDITDATA pMLEditData =(PMLEDITDATA) GetWindowAdditionalData2(hWnd);    PLINEDATA pLineData;    if (pMLEditData->diff) {        pMLEditData->editLine = pMLEditData->realeditLine;        pMLEditData->vdispPos = pMLEditData->realdispPos;        pMLEditData->dispPos = pMLEditData->dx_chars[pMLEditData->vdispPos];        pMLEditData->StartlineDisp = pMLEditData->realStartLine;        pMLEditData->EndlineDisp   = pMLEditData->realEndLine;        pMLEditData->diff = FALSE;        if (GetWindowStyle(hWnd) & ES_AUTOWRAP)        {            edtGetLineNums (pMLEditData, pMLEditData->editLine, &line, &wrapline);            pLineData = GetLineData(pMLEditData, line);        }else            pLineData= GetLineData(pMLEditData, pMLEditData->editLine);           edtGetLineInfo (hWnd, pLineData);        ActiveCaret (hWnd);        pMLEditData->bSCROLL = TRUE;    }else        pMLEditData->bSCROLL = FALSE;}/* add end*/static void edtOnEraseBackground (HWND hWnd, DWORD dwStyle, HDC hdc, const RECT* pClipRect){    int i;    RECT rcTemp;    BOOL fGetDC = FALSE;    PMLEDITDATA pMLEditData = (PMLEDITDATA) GetWindowAdditionalData2(hWnd);    if (hdc == 0) {        hdc = GetClientDC (hWnd);        fGetDC = TRUE;    }    GetClientRect (hWnd, &rcTemp);    if (pClipRect)        ClipRectIntersect (hdc, pClipRect);    if (dwStyle & WS_DISABLED) {        SetBrushColor (hdc, PIXEL_lightgray);    }    else {        SetBrushColor (hdc, PIXEL_lightwhite);    }    FillBox (hdc, rcTemp.left, rcTemp.top,                  RECTW (rcTemp), RECTH (rcTemp));    if (dwStyle & ES_BASELINE) {        SetPenColor (hdc, PIXEL_black);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -