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

📄 simedit.c

📁 linux下的图形界面开发minigui最新源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
                    else {                        InvRect.left = simed->leftMargin                                    + simed->caretOff * GetSysCharWidth ();                        InvRect.top = simed->topMargin;                        InvRect.right = pCtrl->cr - pCtrl->cl;                        InvRect.bottom = pCtrl->cb - pCtrl->ct;                    }                                            SetCaretPos (hWnd,                         simed->caretOff * GetSysCharWidth ()                             + simed->leftMargin,                         simed->topMargin);                    InvalidateRect (hWnd, &InvRect, TRUE);                break;                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 * GetSysCharWidth ()                             > 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)                                        * GetSysCharWidth ();                InvRect.top = simed->topMargin;                InvRect.right = pCtrl->cr - pCtrl->cl;                InvRect.bottom = pCtrl->cb - pCtrl->ct;            }            SetCaretPos (hWnd,                         simed->caretOff * GetSysCharWidth ()                             + 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 * GetSysCharWidth ()                             + 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 * GetSysCharWidth ()                                     + 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 != (int)wParam) {                if (dwStyle & ES_PASSWORD) {                    simed->passwdChar = (int)wParam;                    InvalidateRect (hWnd, NULL, TRUE);                }            }            return 0;            case EM_GETPASSWORDCHAR:        {            int* passwdchar;                        simed = (PSIMEDITDATA) (pCtrl->dwAddData2);            passwdchar = (int*) lParam;            *passwdchar = simed->passwdChar;            return 0;        }            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 + -