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

📄 simedit.c

📁 MiniGUI for uCOS 移植实验全部源码
💻 C
📖 第 1 页 / 共 3 页
字号:
                    pCtrl->dwStyle &= ~WS_DISABLED;
                else
                    pCtrl->dwStyle |=  WS_DISABLED;

                InvalidateRect (hWnd, NULL, TRUE);
            }
            return 0;

        case MSG_PAINT:
        {
            int     dispLen;
            char*   dispBuffer;
            RECT    rect;
            
            simed = (PSIMEDITDATA) (pCtrl->dwAddData2);

            GetClientRect (hWnd, &rect);

            /* only implemented ES_LEFT align format for single line edit. */
            rect.left += simed->leftMargin;
            rect.top += simed->topMargin;
            rect.right -= simed->rightMargin;
            rect.bottom -= simed->bottomMargin;
    
            hdc = BeginPaint (hWnd);

            if (dwStyle & ES_BASELINE) {
                SetPenColor (hdc, GetWindowElementColorEx (hWnd, FGC_CONTROL_NORMAL));
                DrawHDotLine (hdc, 
                            simed->leftMargin, 
                            simed->topMargin + GetSysFontHeight (SYSLOGFONT_FIXED) + 1,
                            RECTW (rect) - simed->leftMargin - simed->rightMargin);
            }

            dispLen = edtGetDispLen (pCtrl);
            if (dispLen == 0) {
                EndPaint (hWnd, hdc);
                break;
            }

            if (dwStyle & ES_PASSWORD) {
                /* dispBuffer = ALLOCATE_LOCAL (dispLen); */
                dispBuffer = FixStrAlloc (dispLen);
                memset (dispBuffer, simed->passwdChar, dispLen);
            }
            else
                dispBuffer = simed->buffer + simed->startPos;

            ClipRectIntersect (hdc, &rect);

            if (dwStyle & WS_DISABLED)
                SetTextColor (hdc, GetWindowElementColorEx (hWnd, FGC_CONTROL_DISABLED));
            else
                SetTextColor (hdc, GetWindowElementColorEx (hWnd, FGC_CONTROL_NORMAL));
            SetBkMode (hdc, BM_TRANSPARENT);

            TextOutLen (hdc, simed->leftMargin, simed->topMargin, dispBuffer, dispLen);

            if (dwStyle & ES_PASSWORD) {
                FreeFixStr (dispBuffer);
                /* DEALLOCATE_LOCAL (dispBuffer); */
            }

            EndPaint (hWnd, hdc);
            return 0;
        }

        case MSG_KEYDOWN:
        {
            BOOL    bChange = FALSE;
            int     i;
            RECT    InvRect;
            int     deleted;

            simed = (PSIMEDITDATA) (pCtrl->dwAddData2);
        
            switch (LOWORD (wParam))
            {
                case SCANCODE_ENTER:
                    NotifyParent (hWnd, pCtrl->id, EN_ENTER);
                return 0;

                case SCANCODE_HOME:
                    if (simed->editPos == 0)
                        return 0;

                    simed->editPos  = 0;
                    simed->caretOff = 0;
                    
                    SetCaretPos (hWnd, 
                        simed->caretOff * simed->charWidth + simed->leftMargin, 
                        simed->topMargin);

                    if (simed->startPos != 0)
                        InvalidateRect (hWnd, NULL, TRUE);
                    
                    simed->startPos = 0;
                return 0;
           
                case SCANCODE_END:
                {
                    int newStartPos;
                   
                    if (simed->editPos == simed->dataEnd)
                        return 0;

                    newStartPos = edtGetStartDispPosAtEnd (pCtrl, simed);
                    
                    simed->editPos = simed->dataEnd;
                    simed->caretOff = simed->editPos - newStartPos;
                    
                    SetCaretPos (hWnd, 
                        simed->caretOff * simed->charWidth + simed->leftMargin, 
                        simed->topMargin);

                    if (simed->startPos != newStartPos)
                        InvalidateRect (hWnd, NULL, TRUE);
                    
                    simed->startPos = newStartPos;
                }
                return 0;

                case SCANCODE_CURSORBLOCKLEFT:
                {
                    BOOL bScroll = FALSE;
                    int  scrollStep;
                    
                    if (simed->editPos == 0)
                        return 0;

                    if (edtIsACCharBeforePosition (simed->buffer, 
                            simed->editPos)) {
                        scrollStep = 2;
                        simed->editPos -= 2;
                    }
                    else {
                        scrollStep = 1;
                        simed->editPos --;
                    }

                    simed->caretOff -= scrollStep;
                    if (simed->caretOff == 0 
                            && simed->editPos != 0) {

                        bScroll = TRUE;

                        if (edtIsACCharBeforePosition (simed->buffer, 
                                simed->editPos)) {
                            simed->startPos -= 2;
                            simed->caretOff = 2;
                        }
                        else {
                            simed->startPos --;
                            simed->caretOff = 1;
                        }
                    }
                    else if (simed->caretOff < 0) {
                        simed->startPos = 0;
                        simed->caretOff = 0;
                    }
                        
                    SetCaretPos (hWnd, 
                        simed->caretOff * simed->charWidth + simed->leftMargin, 
                        simed->topMargin);

                    if (bScroll)
                        InvalidateRect (hWnd, NULL, TRUE);
                }
                return 0;
                
                case SCANCODE_CURSORBLOCKRIGHT:
                {
                    BOOL bScroll = FALSE;
                    int  scrollStep, moveStep;

                    if (simed->editPos == simed->dataEnd)
                        return 0;

                    if (edtIsACCharAtPosition (simed->buffer, 
                                simed->dataEnd,
                                simed->startPos)) {
                        if (edtIsACCharAtPosition (simed->buffer, 
                                    simed->dataEnd,
                                    simed->editPos)) {
                            scrollStep = 2;
                            moveStep = 2;
                            simed->editPos  += 2;
                        }
                        else {
                            scrollStep = 2;
                            moveStep = 1;
                            simed->editPos ++;
                        }
                    }
                    else {
                        if (edtIsACCharAtPosition (simed->buffer, 
                                    simed->dataEnd,
                                    simed->editPos)) {
                                    
                            if (edtIsACCharAtPosition (simed->buffer, 
                                    simed->dataEnd,
                                    simed->startPos + 1))
                                scrollStep = 3;
                            else
                                scrollStep = 2;

                            moveStep = 2;
                            simed->editPos += 2;
                        }
                        else {
                            scrollStep = 1;
                            moveStep = 1;
                            simed->editPos ++;
                        }
                    }

                    simed->caretOff += moveStep;
                    if (simed->caretOff * simed->charWidth > edtGetOutWidth (pCtrl)) {
                        bScroll = TRUE;
                        simed->startPos += scrollStep;

                        simed->caretOff = 
                            simed->editPos - simed->startPos;
                    }

                    SetCaretPos (hWnd, 
                        simed->caretOff * simed->charWidth + simed->leftMargin, 
                        simed->topMargin);

                    if (bScroll)
                        InvalidateRect (hWnd, NULL, TRUE);
                }
                return 0;
                
                case SCANCODE_INSERT:
                    simed = (PSIMEDITDATA) (pCtrl->dwAddData2);
                    simed->status ^= EST_REPLACE;
                break;

                case SCANCODE_REMOVE:
                    simed = (PSIMEDITDATA) (pCtrl->dwAddData2);
                    if ((dwStyle & ES_READONLY)
                            || (simed->editPos == simed->dataEnd)){
                        return 0;
                    }
                    
                    if (edtIsACCharAtPosition (simed->buffer, 
                                    simed->dataEnd,
                                    simed->editPos))
                        deleted = 2;
                    else
                        deleted = 1;
                        
                    for (i = simed->editPos; 
                            i < simed->dataEnd - deleted;
                            i++)
                        simed->buffer [i] 
                            = simed->buffer [i + deleted];

                    simed->dataEnd -= deleted;
                    bChange = TRUE;
                    
                    InvRect.left = simed->leftMargin + simed->caretOff * simed->charWidth;
                    InvRect.top = simed->topMargin;
                    InvRect.right = pCtrl->cr - pCtrl->cl;
                    InvRect.bottom = pCtrl->cb - pCtrl->ct;
                    
                    InvalidateRect (hWnd, &InvRect, TRUE);
                break;

                case SCANCODE_BACKSPACE:
                    simed = (PSIMEDITDATA) (pCtrl->dwAddData2);
                    if ((dwStyle & ES_READONLY)
                            || (simed->editPos == 0)) {
                        return 0;
                    }

                    if (edtIsACCharBeforePosition (simed->buffer, 
                                    simed->editPos))
                        deleted = 2;
                    else
                        deleted = 1;
                        
                    for (i = simed->editPos; 
                            i < simed->dataEnd;
                            i++)
                        simed->buffer [i - deleted] 
                            = simed->buffer [i];

                    simed->dataEnd -= deleted;
                    simed->editPos -= deleted;
                    bChange = TRUE;
                    
                    simed->caretOff -= deleted;
                    if (simed->caretOff == 0 
                            && simed->editPos != 0) {
                        if (edtIsACCharBeforePosition (simed->buffer, 
                                simed->editPos)) {
                            simed->startPos -= 2;
                            simed->caretOff = 2;
                        }
                        else {
                            simed->startPos --;
                            simed->caretOff = 1;
                        }
                        
                        InvRect.left = simed->leftMargin;
                        InvRect.top = simed->topMargin;
                        InvRect.right = pCtrl->cr - pCtrl->cl;
                        InvRect.bottom = pCtrl->cb - pCtrl->ct;
                    }
                    else {
                        InvRect.left = simed->leftMargin
                                    + simed->caretOff * simed->charWidth;
                        InvRect.top = simed->topMargin;
                        InvRect.right = pCtrl->cr - pCtrl->cl;
                        InvRect.bottom = pCtrl->cb - pCtrl->ct;
                    }
                        
                    SetCaretPos (hWnd, 
                        simed->caretOff * simed->charWidth + simed->leftMargin, 
                        simed->topMargin);

                    InvalidateRect (hWnd, &InvRect, TRUE);
                break;

⌨️ 快捷键说明

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