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

📄 medit.c

📁 这是ARM嵌入式系统的实验教程中的MINIGUI的实验源代码!
💻 C
📖 第 1 页 / 共 5 页
字号:
{
    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) {
        SetPenColor (hdc, GetWindowElementColorEx (hWnd, FGC_CONTROL_DEF));
        for (i = 0; i < pMLEditData->MaxlinesDisp; i++)
            DrawHDotLine (hdc, 
                    pMLEditData->leftMargin, 
                    pMLEditData->topMargin + pMLEditData->lineHeight * (i + 1) - 1,
                    RECTW (rect) - pMLEditData->leftMargin - pMLEditData->rightMargin);
    }

    rect.left    += pMLEditData->leftMargin;
    rect.top     += pMLEditData->topMargin ;
    rect.right   -= pMLEditData->rightMargin;
    rect.bottom  -= pMLEditData->bottomMargin;

    ClipRectIntersect (hdc, &rect);

    if (dwStyle & WS_DISABLED)
        SetTextColor (hdc, GetWindowElementColorEx (hWnd, FGC_CONTROL_DIS));
    else
        SetTextColor (hdc, GetWindowElementColorEx (hWnd, FGC_CONTROL_DEF));
    SetBkMode (hdc, BM_TRANSPARENT);

    for (i = pMLEditData->StartlineDisp; 
            i <= pMLEditData->EndlineDisp; i++) {
        int y, line=i, wrapline=0;
        if (dwStyle & ES_AUTOWRAP)
            edtGetLineNums (pMLEditData, i, &line, &wrapline);
    
        pLineData= GetLineData(pMLEditData, line);
        if (pLineData == NULL)
            break;

        edtGetLineInfo (hWnd, pLineData);
        if (dwStyle & ES_AUTOWRAP) {
             if (pMLEditData->fit_chars == 0 && 
                            pMLEditData->EndlineDisp >= pMLEditData->wraplines) {
                //FIXME
                continue;
                }
        }
        else {
             if (pMLEditData->fit_chars == 0 && 
                            pMLEditData->EndlineDisp >= pMLEditData->lines) {
                //FIXME
                continue;
                }
        }

        if (dwStyle & ES_PASSWORD)
            memset (dispBuffer, pMLEditData->passwdChar, pLineData->dataEnd);
            memcpy (dispBuffer, 
                   pLineData->buffer,
                pLineData->dataEnd);
               dispBuffer[pLineData->dataEnd] = '\0';

        y = pMLEditData->lineHeight*
                        (i - pMLEditData->StartlineDisp)
                    + pMLEditData->topMargin;
        //fprint (stderr, "textOut-buffer = %s\n", dispBuffer+pLineData->wrapStartPos[wrapline]);
        if (dwStyle & ES_AUTOWRAP)
            TextOutLen (hdc, 
                pMLEditData->leftMargin - pMLEditData->dispPos, 
                y,
                dispBuffer+pMLEditData->pos_chars[pLineData->wrapStartPos[wrapline]],
                pMLEditData->pos_chars[pLineData->wrapStartPos[wrapline+1]]
                    -pMLEditData->pos_chars[pLineData->wrapStartPos[wrapline]]);
        else
            TextOut(hdc, 
                pMLEditData->leftMargin - pMLEditData->dispPos, y,
                dispBuffer);
    }

    EndPaint (hWnd, hdc);
}

/* ----------------------------------- key process --------------------------------------- */
static int edtKeyEnter (HWND hWnd)
{
    DWORD dwStyle     = GetWindowStyle(hWnd);
    PMLEDITDATA pMLEditData =(PMLEDITDATA) GetWindowAdditionalData2(hWnd);
    PLINEDATA   pLineData;
    int     line, wrapline;
    char *  tempP = NULL;
    PLINEDATA temp = NULL;
    RECT    InvRect; 

    GetClientRect (hWnd, &InvRect);
    InvRect.left = pMLEditData->leftMargin - 1;

    if (dwStyle & ES_READONLY) {
        Ping();
        return 0;
    }

    edtPosProc (hWnd); 

    if ((pMLEditData->totalLimit >= 0) 
            && ((pMLEditData->curtotalLen + 1) > pMLEditData->totalLimit)) {
        Ping ();
        NotifyParent (hWnd, GetDlgCtrlID(hWnd), EN_MAXTEXT);
        return 0;
    }else
        pMLEditData->curtotalLen++;

    if (dwStyle & ES_AUTOWRAP)
    {
        edtGetLineNums (pMLEditData, pMLEditData->editLine, &line, &wrapline);
        pLineData = GetLineData(pMLEditData, line);
    }else
        pLineData = GetLineData(pMLEditData,pMLEditData->editLine);
    

    if (dwStyle & ES_AUTOWRAP)
    {
        edtGetLineInfo (hWnd, pLineData);

        if (pMLEditData->veditPos < pMLEditData->fit_chars)
            tempP = pLineData->buffer + 
                    pMLEditData->pos_chars[pMLEditData->veditPos];
        temp = pLineData->next;
        pLineData->next = malloc( sizeof(LINEDATA) );
        pLineData->next->previous = pLineData;
        pLineData->next->next = temp;
    
        if(temp)
            temp->previous = pLineData->next;
    
        temp = pLineData->next;
        temp->lineNO = line + 1;
        if(tempP) {
            memcpy(temp->buffer,tempP,strlen(tempP));
            temp->dataEnd = strlen(tempP);
        }
        else
            temp->dataEnd = 0;
        temp->buffer[temp->dataEnd] = '\0'; 
        pLineData->dataEnd = pMLEditData->pos_chars[pMLEditData->veditPos];
        pLineData->buffer[pLineData->dataEnd]='\0';
        temp = temp->next;
        while (temp)
        {
            temp->lineNO++;
            temp = temp->next;
        }
        if (!((pMLEditData->veditPos == pLineData->wrapStartPos[wrapline])
               && (wrapline)))
            pMLEditData->editLine++;
        pMLEditData->wraplines -= pLineData->nwrapline;
        calcLineInfo (hWnd, pMLEditData, pLineData);
        calcLineInfo (hWnd, pMLEditData, pLineData->next);
        edtGetLineInfo (hWnd, pLineData->next);
        pMLEditData->lines++;
        pMLEditData->wraplines += pLineData->nwrapline + pLineData->next->nwrapline;
        pMLEditData->veditPos=0;

        if (pMLEditData->editLine > pMLEditData->EndlineDisp)
        {
            pMLEditData->EndlineDisp = pMLEditData->editLine;
            if (pMLEditData->EndlineDisp > 
                            pMLEditData->StartlineDisp+pMLEditData->MaxlinesDisp-1)
            {
                pMLEditData->StartlineDisp = pMLEditData->EndlineDisp
                                            -pMLEditData->MaxlinesDisp + 1;
            }else {
                InvRect.top  = (pMLEditData->editLine 
                                - pMLEditData->StartlineDisp -1) 
                                    * pMLEditData->lineHeight
                                  + pMLEditData->topMargin;
                InvRect.bottom  -=  pMLEditData->lineHeight;
            }
        }else {
            pMLEditData->EndlineDisp = pMLEditData->StartlineDisp + MIN (pMLEditData->wraplines 
                                                                        - pMLEditData->StartlineDisp, 
                                                                    pMLEditData->MaxlinesDisp) - 1;
        }
        pMLEditData->linesDisp = pMLEditData->EndlineDisp 
                                - pMLEditData->StartlineDisp + 1;
        NotifyParent (hWnd, GetDlgCtrlID(hWnd), EN_CHANGE);
        InvalidateRect (hWnd, &InvRect, TRUE);
        edtSetCaretPos (hWnd);
        edtSetScrollInfo (hWnd, pMLEditData, TRUE);
        if (pMLEditData->bSCROLL)
            InvalidateRect (hWnd, NULL, TRUE);
        return 0;
    }

    edtGetLineInfo (hWnd, pLineData);
    
    if (pMLEditData->veditPos < pMLEditData->fit_chars)
        tempP = pLineData->buffer + pMLEditData->pos_chars[pMLEditData->veditPos];
    temp = pLineData->next;
    pLineData->next = malloc( sizeof(LINEDATA) );
    pLineData->next->previous = pLineData;
    pLineData->next->next = temp;
    
    if(temp)
        temp->previous = pLineData->next;
    
    temp = pLineData->next;
    temp->lineNO  = pMLEditData->editLine + 1;
    if(tempP) {
        memcpy(temp->buffer,tempP,strlen(tempP));
        temp->dataEnd = strlen(tempP);
    }
    else
        temp->dataEnd = 0;
    temp->buffer[temp->dataEnd] = '\0'; 
    pLineData->dataEnd = pMLEditData->pos_chars[pMLEditData->veditPos];
    pLineData->buffer[pLineData->dataEnd]='\0';
    temp = temp->next;
    while (temp)
    {
        temp->lineNO++;
        temp = temp->next;
    }
    // added by leon to optimize display
    if ((pMLEditData->editLine - pMLEditData->StartlineDisp + 1) 
                    < pMLEditData->MaxlinesDisp) {
        if (!(pMLEditData->dx_chars[pMLEditData->veditPos] - pMLEditData->leftMargin
                 > edtGetOutWidth (hWnd))) {
            InvRect.top  = (pMLEditData->editLine - pMLEditData->StartlineDisp -1) 
                                * pMLEditData->lineHeight
                                  + pMLEditData->topMargin;
        }
                
     }else {
        if ((pMLEditData->vdispPos == 0) 
                && (pMLEditData->vdispPos == pMLEditData->veditPos))         
            InvRect.bottom  -=  pMLEditData->lineHeight;
     }
    // added by leon to optimize display
    pMLEditData->veditPos = 0;
    pMLEditData->vdispPos = 0;

    if(pMLEditData->linesDisp < pMLEditData->MaxlinesDisp)
    {
        pMLEditData->EndlineDisp++;
        pMLEditData->linesDisp++;
    }
    else if(pMLEditData->editLine == pMLEditData->EndlineDisp) 
    {
        pMLEditData->StartlineDisp++;
        pMLEditData->EndlineDisp++;
    }
    pMLEditData->editLine++;
    edtGetLineInfo (hWnd, GetLineData(pMLEditData,pMLEditData->editLine));    
    pMLEditData->lines++;
    
    pMLEditData->dispPos = 0;

    pMLEditData->dispPos = pMLEditData->dx_chars[pMLEditData->vdispPos];
    edtSetCaretPos (hWnd);
    edtSetScrollInfo (hWnd, pMLEditData, TRUE);
    InvalidateRect (hWnd, &InvRect, TRUE); // modified by leon

    NotifyParent (hWnd, GetDlgCtrlID(hWnd), EN_CHANGE);
    if (pMLEditData->bSCROLL)
        InvalidateRect (hWnd, NULL, TRUE);

    return 0;
}

static int edtKeyCursorblockLeft (HWND hWnd)
{
    DWORD dwStyle     = GetWindowStyle(hWnd);
    PMLEDITDATA pMLEditData =(PMLEDITDATA) GetWindowAdditionalData2(hWnd);
    BOOL         bScroll = FALSE;
    int          newStartPos, line, wrapline;
    PLINEDATA    temp;
    PLINEDATA    pLineData;

    edtPosProc (hWnd); 
    if (dwStyle & ES_AUTOWRAP)
    {
        edtGetLineNums (pMLEditData, pMLEditData->editLine, &line, &wrapline);
        pLineData = GetLineData(pMLEditData, line);
    }
    else
        pLineData = GetLineData(pMLEditData,pMLEditData->editLine);

    if (dwStyle & ES_AUTOWRAP)
    {
        if (!pMLEditData->veditPos && !pMLEditData->editLine) return 0;
        edtGetLineInfo (hWnd, pLineData);
        if (!pMLEditData->veditPos)
        {
            if (pMLEditData->editLine == pMLEditData->StartlineDisp) {
                bScroll = TRUE;
                pMLEditData->StartlineDisp--;
                if (pMLEditData->EndlineDisp >= pMLEditData->MaxlinesDisp)
                    pMLEditData->EndlineDisp--;
            }
            pMLEditData->editLine--;
            temp = pLineData->previous;
            edtGetLineInfo (hWnd, temp);
            pMLEditData->veditPos = temp->wrapStartPos[temp->nwrapline];
        }else if (pMLEditData->veditPos == pLineData->wrapStartPos[wrapline]) {
            if (pMLEditData->editLine == pMLEditData->StartlineDisp) {
                bScroll = TRUE;
                pMLEditData->StartlineDisp--;
                if (pMLEditData->EndlineDisp >= pMLEditData->MaxlinesDisp)
                    pMLEditData->EndlineDisp--;
            }
            pMLEditData->editLine--;
            pMLEditData->veditPos--; 
        }else 
            pMLEditData->veditPos--;

        pMLEditData->linesDisp = pMLEditData->EndlineDisp 
                                - pMLEditData->StartlineDisp + 1;
        edtSetCaretPos (hWnd);
        if (bScroll)
        {
            edtSetScrollInfo (hWnd, pMLEditData, TRUE);
            InvalidateRect(hWnd,NULL,TRUE);    
        }
        if (pMLEditData->bSCROLL)
            InvalidateRect (hWnd, NULL, TRUE);
        return 0;
    }

    
    if (!pMLEditData->veditPos)
    {
        temp = pLineData->previous;
        if (!temp) return 0;
        if(pMLEditData->editLine > 0 )
        {
            if (pMLEditData->editLine == pMLEditData->StartlineDisp) {
                bScroll = TRUE;
                pMLEditData->StartlineDisp--;
                if (pMLEditData->EndlineDisp >= pMLEditData->MaxlinesDisp)
                    pMLEditData->EndlineDisp--;
            }
            pMLEditData->editLine --;
            edtGetLineInfo (hWnd, GetLineData (pMLEditData, pMLEditData->editLine));
            pMLEditData->veditPos = pMLEditData->fit_chars; 
            newStartPos = edtGetStartDispPosAtEnd (hWnd, temp);
            if (pMLEditData->vdispPos != newStartPos)
            {
                pMLEditData->vdispPos = newStartPos;
                bScroll = TRUE;
            }
        }
    }
    else
    {    
        if (pMLEditData->veditPos == pMLEditData->vdispPos){
            pMLEditData->veditPos--;
            if (edtGetNewvPos (hWnd,
                                GetLineData(pMLEditData,pMLEditData->editLine),
                                pMLEditData->dx_chars[pMLEditData->veditPos] 

⌨️ 快捷键说明

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