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

📄 medit.c

📁 这是针对 Linux (i386)平台的 minigui 3.6.2 开发包(MiniGUI-Processes 运行模式)。
💻 C
📖 第 1 页 / 共 5 页
字号:
    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);        //FIXME           edtGetLineInfo (hWnd, pLineData);        ActiveCaret (hWnd);        pMLEditData->bSCROLL = TRUE;    }else        pMLEditData->bSCROLL = FALSE;}/* add end*/static int edtOnCreate (HWND hWnd){    PMLEDITDATA pMLEditData = NULL;    DWORD dwStyle     = GetWindowStyle(hWnd);    if (!(pMLEditData = malloc (sizeof (MLEDITDATA)))) {        return -1;    }    SetWindowAdditionalData2 (hWnd,(DWORD)pMLEditData);    pMLEditData->lineHeight = GetWindowFont (hWnd)->size;    if (dwStyle & ES_BASELINE)        pMLEditData->lineHeight += 2;            if (!CreateCaret (hWnd, NULL, 1, pMLEditData->lineHeight))    {        free (pMLEditData);        return -1;    }    pMLEditData->status         = 0;    pMLEditData->curtotalLen    = 0;    pMLEditData->totalLimit     = 100*LEN_MLEDIT_BUFFER;    pMLEditData->lineLimit      = LEN_MLEDIT_BUFFER;    pMLEditData->editLine       = 0;    pMLEditData->veditPos       = 0;    pMLEditData->dispPos        = 0;    pMLEditData->vdispPos       = 0;    pMLEditData->MaxlinesDisp   = 0;    pMLEditData->linesDisp      = 0;    pMLEditData->StartlineDisp  = 0;    pMLEditData->EndlineDisp    = 0;        MLEditInitBuffer (hWnd, pMLEditData, GetWindowCaption(hWnd), dwStyle);    #if 0    pMLEditData->selStartPos    = 0;    pMLEditData->selEndPos      = 0;#endif    pMLEditData->passwdChar     = '*';    pMLEditData->leftMargin     = MARGIN_MEDIT_LEFT;    pMLEditData->topMargin      = MARGIN_MEDIT_TOP;    pMLEditData->rightMargin    = MARGIN_MEDIT_RIGHT;    pMLEditData->bottomMargin   = MARGIN_MEDIT_BOTTOM;    pMLEditData->pos_chars = (int*)malloc(LEN_MLEDIT_BUFFER*sizeof(int));    pMLEditData->dx_chars = (int*)malloc(LEN_MLEDIT_BUFFER*sizeof(int));    memset (pMLEditData->pos_chars, 0, LEN_MLEDIT_BUFFER*sizeof(int));    memset (pMLEditData->dx_chars , 0, LEN_MLEDIT_BUFFER*sizeof(int));    pMLEditData->fit_chars      = 0;    pMLEditData->realdispPos    = 0;    pMLEditData->realStartLine  = 0;    pMLEditData->realEndLine    = 0;    pMLEditData->diff           = FALSE;    pMLEditData->bSCROLL        = FALSE;    pMLEditData->wraplines      = 0;        //SetWindowAdditionalData2 (hWnd,(DWORD)pMLEditData);    return 0;}static void edtOnSizeChanged (HWND hWnd, RECT *clientRect){    DWORD dwStyle     = GetWindowStyle(hWnd);    PMLEDITDATA pMLEditData =(PMLEDITDATA) GetWindowAdditionalData2(hWnd);    pMLEditData->MaxlinesDisp   = (RECTHP(clientRect) - pMLEditData->topMargin                                    - pMLEditData->bottomMargin)                                / pMLEditData->lineHeight;    if (pMLEditData->MaxlinesDisp < 0)        pMLEditData->MaxlinesDisp = 0;    if (dwStyle & ES_AUTOWRAP && pMLEditData->head)    {        PLINEDATA  pLineData = pMLEditData->head;        pMLEditData->wraplines = 0;        for (; pLineData; pLineData = pLineData->next)        {            calcLineInfo (hWnd, pMLEditData, pLineData);            pMLEditData->wraplines += pLineData->nwrapline;        }    }    if (dwStyle & ES_AUTOWRAP)        pMLEditData->linesDisp    = MIN (pMLEditData->MaxlinesDisp, pMLEditData->wraplines);    else        pMLEditData->linesDisp    = MIN (pMLEditData->MaxlinesDisp, pMLEditData->lines);    pMLEditData->StartlineDisp  = 0;    pMLEditData->EndlineDisp    = pMLEditData->StartlineDisp + pMLEditData->linesDisp - 1;    pMLEditData->editLine       = 0;    pMLEditData->dispPos        = 0;        edtSetScrollInfo (hWnd, pMLEditData, TRUE);}static void edtOnPaint (HWND hWnd){    int     i;    char    dispBuffer [LEN_MLEDIT_BUFFER+1];    RECT    rect;    DWORD dwStyle     = GetWindowStyle(hWnd);    PMLEDITDATA pMLEditData =(PMLEDITDATA) GetWindowAdditionalData2(hWnd);    HDC hdc;    PLINEDATA   pLineData;        hdc = BeginPaint (hWnd);    GetClientRect (hWnd, &rect);    if (dwStyle & ES_BASELINE) {

⌨️ 快捷键说明

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