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

📄 simedit.c

📁 在ADS环境下MiniGUI的源码
💻 C
📖 第 1 页 / 共 3 页
字号:
                default:
                break;
            }
       
            if (bChange)
                NotifyParent (hWnd, pCtrl->id, EN_CHANGE);
            return 0;
        }

        case MSG_CHAR:
        {
            unsigned char charBuffer [2];
            int  i, chars, scrollStep, inserting;
            RECT InvRect;

            simed = (PSIMEDITDATA) (pCtrl->dwAddData2);

            if (dwStyle & ES_READONLY) {
                return 0;
            }
            
            if (HIBYTE (wParam)) {
                charBuffer [0] = LOBYTE (wParam);
                charBuffer [1] = HIBYTE (wParam);
                chars = 2;
            }
            else {
                chars = 1;

                if (dwStyle & ES_UPPERCASE) {
                    charBuffer [0] = toupper (LOBYTE (wParam));
                }
                else if (dwStyle & ES_LOWERCASE) {
                    charBuffer [0] = tolower (LOBYTE (wParam));
                }
                else
                    charBuffer [0] = LOBYTE (wParam);
            }
            
            if (chars == 1) {
#if 0
                switch (charBuffer [0])
                {
                    case 0x00:  // NULL
                    case 0x07:  // BEL
                    case 0x08:  // BS
                    case 0x09:  // HT
                    case 0x0A:  // LF
                    case 0x0B:  // VT
                    case 0x0C:  // FF
                    case 0x0D:  // CR
                    case 0x1B:  // Escape
                    return 0;
                }
#else
                if (charBuffer [0] < 0x20 || charBuffer [0] == 0x7F)
                    return 0;
#endif
            }

            if (simed->status & EST_REPLACE) {
                if (simed->dataEnd == simed->editPos)
                    inserting = chars;
                else if (edtIsACCharAtPosition (simed->buffer, 
                                simed->dataEnd,
                                simed->editPos)) {
                    if (chars == 2)
                        inserting = 0;
                    else
                        inserting = -1;
                }
                else {
                    if (chars == 2)
                        inserting = 1;
                    else
                        inserting = 0;
                }
            }
            else
                inserting = chars;

            // check space
            if (simed->dataEnd + inserting > simed->bufferLen) {
                Ping ();
                NotifyParent (hWnd, pCtrl->id, EN_MAXTEXT);
                return 0;
            }
            else if ((simed->hardLimit >= 0) 
                        && ((simed->dataEnd + inserting) 
                            > simed->hardLimit)) {
                Ping ();
                NotifyParent (hWnd, pCtrl->id, EN_MAXTEXT);
                return 0;
            }

            if (inserting == -1) {
                for (i = simed->editPos; i < simed->dataEnd-1; i++)
                    simed->buffer [i] = simed->buffer [i + 1];
            }
            else if (inserting > 0) {
                for (i = simed->dataEnd + inserting - 1; 
                        i > simed->editPos + inserting - 1; 
                        i--)
                    simed->buffer [i] 
                            = simed->buffer [i - inserting];
            }

            for (i = 0; i < chars; i++)
                    simed->buffer [simed->editPos + i] 
                        = charBuffer [i];
            
            simed->editPos += chars;
            simed->caretOff += chars;
            simed->dataEnd += inserting;

            if (simed->caretOff * simed->charWidth
                            > edtGetOutWidth (pCtrl))
            {
                if (edtIsACCharAtPosition (simed->buffer, 
                                simed->dataEnd,
                                simed->startPos))
                    scrollStep = 2;
                else {
                    if (chars == 2) {
                        if (edtIsACCharAtPosition (simed->buffer, 
                                simed->dataEnd,
                                simed->startPos + 1))
                            scrollStep = 3;
                        else
                            scrollStep = 2;
                    }
                    else
                        scrollStep = 1;
                }
                    
                simed->startPos += scrollStep;

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

                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 - chars)
                                        * 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);

            NotifyParent (hWnd, pCtrl->id, EN_CHANGE);
            return 0;
        }

        case MSG_GETTEXTLENGTH:
            simed = (PSIMEDITDATA) (pCtrl->dwAddData2);
            return simed->dataEnd;
        
        case MSG_GETTEXT:
        {
            char*   buffer = (char*)lParam;
            int     len;

            simed = (PSIMEDITDATA) (pCtrl->dwAddData2);

            len = MIN ((int)wParam, simed->dataEnd);

            memcpy (buffer, simed->buffer, len);
            buffer [len] = '\0';

            return len;
        }

        case MSG_SETTEXT:
        {
            int len;
            simed = (PSIMEDITDATA) (pCtrl->dwAddData2);
            
            len = strlen ((char*)lParam);
            len = MIN (len, simed->bufferLen);
            
            if (simed->hardLimit >= 0)
                len = MIN (len, simed->hardLimit);
           
            memcpy (simed->buffer, (char*)lParam, len);
            simed->dataEnd = len;
            if (simed->editPos > len) {
                /* reset caret position */
                simed->editPos = 0;
                simed->caretOff = 0;
                simed->startPos = 0;
                if (simed->status & EST_FOCUSED)
	                SetCaretPos (hWnd, simed->leftMargin, simed->topMargin);
            }
			InvalidateRect (hWnd, NULL, TRUE);
            return 0;
        }

        case MSG_LBUTTONDBLCLK:
            NotifyParent (hWnd, pCtrl->id, EN_DBLCLK);
            break;
        
        case MSG_LBUTTONDOWN:
        {
            int newOff;
            
            simed = (PSIMEDITDATA) (pCtrl->dwAddData2);
            
            newOff = edtGetOffset (simed, LOSWORD (lParam));
            
            if (newOff != simed->caretOff) {
                simed->editPos += newOff - simed->caretOff;
                simed->caretOff = newOff;
                SetCaretPos (hWnd, 
                        simed->caretOff * simed->charWidth
                            + simed->leftMargin, 
                        simed->topMargin);
            }

            NotifyParent (hWnd, pCtrl->id, EN_CLICKED);
            break;
        }

#if 0
        case MSG_LBUTTONUP:
        case MSG_MOUSEMOVE:
        break;
#endif
        
        case MSG_GETDLGCODE:
            return DLGC_WANTCHARS | DLGC_HASSETSEL | DLGC_WANTARROWS | DLGC_WANTENTER;

        case MSG_DOESNEEDIME:
            if (dwStyle & ES_READONLY)
                return FALSE;
            return TRUE;
        
        case EM_GETCARETPOS:
        {
            int* line_pos = (int *)wParam;
            int* char_pos = (int *)lParam;

            simed = (PSIMEDITDATA) (pCtrl->dwAddData2);

            if (line_pos) *line_pos = 0;
            if (char_pos) *char_pos = simed->editPos;

            return simed->editPos;
        }

        case EM_SETCARETPOS:
        {
            int char_pos = (int)lParam;

            simed = (PSIMEDITDATA) (pCtrl->dwAddData2);

            if (char_pos >= 0 && char_pos <= simed->dataEnd) {
                simed->editPos = char_pos;
                if (simed->status & EST_FOCUSED)
	                SetCaretPos (hWnd, simed->caretOff * simed->charWidth
                                    + simed->leftMargin, simed->topMargin);
                return 0;
            }

            return -1;
        }

        case EM_SETREADONLY:
            if (wParam)
                pCtrl->dwStyle |= ES_READONLY;
            else
                pCtrl->dwStyle &= ~ES_READONLY;
            return 0;
        
        case EM_SETPASSWORDCHAR:
            simed = (PSIMEDITDATA) (pCtrl->dwAddData2);

            if (simed->passwdChar != (char)wParam) {
                if (dwStyle & ES_PASSWORD) {
                    simed->passwdChar = (char)wParam;
                    InvalidateRect (hWnd, NULL, TRUE);
                }
            }
            return 0;
    
        case EM_GETPASSWORDCHAR:
        {
            simed = (PSIMEDITDATA) (pCtrl->dwAddData2);

            return simed->passwdChar;
        }
    
        case EM_LIMITTEXT:
        {
            int newLimit = (int)wParam;
            
            if (newLimit >= 0) {
                simed = (PSIMEDITDATA) (pCtrl->dwAddData2);
                if (simed->bufferLen < newLimit)
                    simed->hardLimit = -1;
                else
                    simed->hardLimit = newLimit;
            }
            return 0;
        }
    
        default:
            break;
    } 

    return DefaultControlProc (hWnd, message, wParam, lParam);
}

#endif /* _CTRL_SIMEDIT */

⌨️ 快捷键说明

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