📄 simedit.c
字号:
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 + -