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

📄 medit.c

📁 在ADS环境下MiniGUI的源码
💻 C
📖 第 1 页 / 共 5 页
字号:
        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 pos
BOOL 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)

⌨️ 快捷键说明

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