📄 edit.c
字号:
+ pSLEditData->leftMargin, pSLEditData->topMargin); if (bScroll) InvalidateRect (hWnd, NULL, FALSE); } return 0;#if 0 case SCANCODE_INSERT: pCtrl->userdata ^= EST_REPLACE; break;#endif case VK_DELETE: /* SCANCODE_REMOVE: */ if ((pCtrl->userdata & EST_READONLY) || (pSLEditData->editPos == pSLEditData->dataEnd)){ #if 0 /* fix: no ping() */ Ping (); #endif return 0; } if (edtIsACCharAtPosition (pSLEditData->buffer, pSLEditData->dataEnd, pSLEditData->editPos)) deleted = 2; else deleted = 1; for (i = pSLEditData->editPos; i < pSLEditData->dataEnd - deleted; i++) pSLEditData->buffer [i] = pSLEditData->buffer [i + deleted]; pSLEditData->dataEnd -= deleted; bChange = TRUE; InvRect.left = pSLEditData->leftMargin + pSLEditData->caretOff * GetSysCharWidth (hWnd); InvRect.top = pSLEditData->topMargin; InvRect.right = pCtrl->clirect.right - pCtrl->clirect.left; InvRect.bottom = pCtrl->clirect.bottom - pCtrl->clirect.top; InvalidateRect (hWnd, &InvRect, FALSE); break; case VK_BACK: /* SCANCODE_BACKSPACE: */ if ((pCtrl->userdata & EST_READONLY) || (pSLEditData->editPos == 0)) {#if 0 /* fix: no ping */ Ping ();#endif return 0; } if (edtIsACCharBeforePosition (pSLEditData->buffer, pSLEditData->editPos)) deleted = 2; else deleted = 1; for (i = pSLEditData->editPos; i < pSLEditData->dataEnd; i++) pSLEditData->buffer [i - deleted] = pSLEditData->buffer [i]; pSLEditData->dataEnd -= deleted; pSLEditData->editPos -= deleted; bChange = TRUE; pSLEditData->caretOff -= deleted; if (pSLEditData->caretOff == 0 && pSLEditData->editPos != 0) { if (edtIsACCharBeforePosition (pSLEditData->buffer, pSLEditData->editPos)) { pSLEditData->startPos -= 2; pSLEditData->caretOff = 2; } else { pSLEditData->startPos --; pSLEditData->caretOff = 1; } InvRect.left = pSLEditData->leftMargin; InvRect.top = pSLEditData->topMargin; InvRect.right = pCtrl->clirect.right - pCtrl->clirect.left; InvRect.bottom = pCtrl->clirect.bottom - pCtrl->clirect.top; } else { InvRect.left = pSLEditData->leftMargin + pSLEditData->caretOff * GetSysCharWidth (hWnd); InvRect.top = pSLEditData->topMargin; InvRect.right = pCtrl->clirect.right - pCtrl->clirect.left; InvRect.bottom = pCtrl->clirect.bottom - pCtrl->clirect.top; } SetCaretPos (pSLEditData->caretOff * GetSysCharWidth (hWnd) + pSLEditData->leftMargin, pSLEditData->topMargin); InvalidateRect (hWnd, &InvRect, FALSE); break; default: break; } if (bChange) SendMessage (GetParent (hWnd), WM_COMMAND, (WPARAM) MAKELONG (pCtrl->id, EN_CHANGE), (LPARAM) hWnd); } break;#endif case WM_CHAR: { char charBuffer [2]; int i, chars, scrollStep, inserting; RECT InvRect; pSLEditData = (PSLEDITDATA) (pCtrl->userdata2); if (dwStyle & ES_READONLY) {#if 0 /* fix: no ping() */ Ping();#endif return 0; } if (HIBYTE (wParam)) { charBuffer [0] = LOBYTE (wParam); charBuffer [1] = HIBYTE (wParam); chars = 2; } else { charBuffer [0] = LOBYTE (wParam); chars = 1; } if (chars == 1) { 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; } } if (pCtrl->userdata & EST_REPLACE) { if (pSLEditData->dataEnd == pSLEditData->editPos) inserting = chars; else if (edtIsACCharAtPosition (pSLEditData->buffer, pSLEditData->dataEnd, pSLEditData->editPos)) { if (chars == 2) inserting = 0; else inserting = -1; } else { if (chars == 2) inserting = 1; else inserting = 0; } } else inserting = chars; /* check space */ if (pSLEditData->dataEnd + inserting > pSLEditData->bufferLen) {#if 0 /* fix: no ping() */ Ping ();#endif SendMessage (GetParent (hWnd), WM_COMMAND, (WPARAM) MAKELONG (pCtrl->id, EN_MAXTEXT), (LPARAM) hWnd); return 0; } else if ((pSLEditData->hardLimit >= 0) && ((pSLEditData->dataEnd + inserting) > pSLEditData->hardLimit)) {#if 0 /* fix: no ping() */ Ping ();#endif SendMessage (GetParent (hWnd), WM_COMMAND, (WPARAM) MAKELONG (pCtrl->id, EN_MAXTEXT), (LPARAM) hWnd); return 0; } if (inserting == -1) { for (i = pSLEditData->editPos; i < pSLEditData->dataEnd-1; i++) pSLEditData->buffer [i] = pSLEditData->buffer [i + 1]; } else if (inserting > 0) { for (i = pSLEditData->dataEnd + inserting - 1; i > pSLEditData->editPos + inserting - 1; i--) pSLEditData->buffer [i] = pSLEditData->buffer [i - inserting]; } for (i = 0; i < chars; i++) pSLEditData->buffer [pSLEditData->editPos + i] = charBuffer [i]; pSLEditData->editPos += chars; pSLEditData->caretOff += chars; pSLEditData->dataEnd += inserting; if (pSLEditData->caretOff * GetSysCharWidth (hWnd) > edtGetOutWidth (pCtrl)) { if (edtIsACCharAtPosition (pSLEditData->buffer, pSLEditData->dataEnd, pSLEditData->startPos)) scrollStep = 2; else { if (chars == 2) { if (edtIsACCharAtPosition (pSLEditData->buffer, pSLEditData->dataEnd, pSLEditData->startPos + 1)) scrollStep = 3; else scrollStep = 2; } else scrollStep = 1; } pSLEditData->startPos += scrollStep; pSLEditData->caretOff = pSLEditData->editPos - pSLEditData->startPos; InvRect.left = pSLEditData->leftMargin; InvRect.top = pSLEditData->topMargin; InvRect.right = pCtrl->clirect.right - pCtrl->clirect.left; InvRect.bottom = pCtrl->clirect.bottom - pCtrl->clirect.top; } else { InvRect.left = pSLEditData->leftMargin + (pSLEditData->caretOff - chars) * GetSysCharWidth (hWnd); InvRect.top = pSLEditData->topMargin; InvRect.right = pCtrl->clirect.right - pCtrl->clirect.left; InvRect.bottom = pCtrl->clirect.bottom - pCtrl->clirect.top; } SetCaretPos (pSLEditData->caretOff * GetSysCharWidth (hWnd) + pSLEditData->leftMargin, pSLEditData->topMargin); InvalidateRect (hWnd, &InvRect, FALSE); SendMessage (GetParent (hWnd), WM_COMMAND, (WPARAM) MAKELONG (pCtrl->id, EN_CHANGE), (LPARAM) hWnd); } break; case WM_GETTEXTLENGTH: pSLEditData = (PSLEDITDATA) (pCtrl->userdata2); return pSLEditData->dataEnd; case WM_GETTEXT: { char* buffer = (char*)lParam; int len; pSLEditData = (PSLEDITDATA) (pCtrl->userdata2); len = min ((int)wParam, pSLEditData->dataEnd); memcpy (buffer, pSLEditData->buffer, len); buffer [len] = '\0'; return len; } break; case WM_SETTEXT: { int len; if (dwStyle & ES_READONLY) return 0; pSLEditData = (PSLEDITDATA) (pCtrl->userdata2); len = strlen ((char*)lParam); len = min (len, pSLEditData->bufferLen); if (pSLEditData->hardLimit >= 0) len = min (len, pSLEditData->hardLimit); pSLEditData->dataEnd = len; memcpy (pSLEditData->buffer, (char*)lParam, len); pSLEditData->editPos = 0; pSLEditData->caretOff = 0; pSLEditData->startPos = 0; InvalidateRect (hWnd, NULL, FALSE); } break; case WM_LBUTTONDBLCLK: break; case WM_LBUTTONDOWN: { int newOff; pSLEditData = (PSLEDITDATA) (pCtrl->userdata2); newOff = edtGetOffset (hWnd,pSLEditData, LOWORD (lParam)); if (newOff != pSLEditData->caretOff) { pSLEditData->editPos += newOff - pSLEditData->caretOff; pSLEditData->caretOff = newOff; SetCaretPos (pSLEditData->caretOff * GetSysCharWidth (hWnd) + pSLEditData->leftMargin, pSLEditData->topMargin); } } break; case WM_LBUTTONUP: break; case WM_MOUSEMOVE: break; case WM_GETDLGCODE: return DLGC_WANTCHARS | DLGC_HASSETSEL | DLGC_WANTARROWS; case EM_SETREADONLY: if (wParam) pCtrl->style/*dwStyle*/ |= ES_READONLY; else pCtrl->style/*dwStyle*/ &= ~ES_READONLY; return 0; case EM_SETPASSWORDCHAR: pSLEditData = (PSLEDITDATA) (pCtrl->userdata2); if (pSLEditData->passwdChar != (int)wParam) { if (dwStyle & ES_PASSWORD) { pSLEditData->passwdChar = (int)wParam; InvalidateRect (hWnd, NULL, TRUE); } } return 0; case EM_GETPASSWORDCHAR: { int* passwdchar; pSLEditData = (PSLEDITDATA) (pCtrl->userdata2); passwdchar = (int*) lParam; *passwdchar = pSLEditData->passwdChar; } return 0; case EM_LIMITTEXT: { int newLimit = (int)wParam; if (newLimit >= 0) { pSLEditData = (PSLEDITDATA) (pCtrl->userdata2); if (pSLEditData->bufferLen < newLimit) pSLEditData->hardLimit = -1; else pSLEditData->hardLimit = newLimit; } } return 0; default: return DefWindowProc (hWnd, message, wParam, lParam); break; } return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -