📄 edit.c
字号:
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->cr - pCtrl->cl; InvRect.bottom = pCtrl->cb - pCtrl->ct; } else { InvRect.left = pSLEditData->leftMargin + pSLEditData->caretOff * GetSysCharWidth (); InvRect.top = pSLEditData->topMargin; InvRect.right = pCtrl->cr - pCtrl->cl; InvRect.bottom = pCtrl->cb - pCtrl->ct; } SetCaretPos (hWnd, pSLEditData->caretOff * GetSysCharWidth () + pSLEditData->leftMargin, pSLEditData->topMargin); InvalidateRect (hWnd, &InvRect, FALSE); break; default: break; } if (bChange) NotifyParent (hWnd, pCtrl->id, EN_CHANGE); return 0; } case MSG_CHAR: { char charBuffer [2]; int i, chars, scrollStep, inserting; RECT InvRect; pSLEditData = (PSLEDITDATA) (pCtrl->dwAddData2); if (dwStyle & ES_READONLY) { Ping(); 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 (pSLEditData->status & 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) { Ping (); NotifyParent (hWnd, pCtrl->id, EN_MAXTEXT); return 0; } else if ((pSLEditData->hardLimit >= 0) && ((pSLEditData->dataEnd + inserting) > pSLEditData->hardLimit)) { Ping (); NotifyParent (hWnd, pCtrl->id, EN_MAXTEXT); 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 () > 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->cr - pCtrl->cl; InvRect.bottom = pCtrl->cb - pCtrl->ct; } else { InvRect.left = pSLEditData->leftMargin + (pSLEditData->caretOff - chars) * GetSysCharWidth (); InvRect.top = pSLEditData->topMargin; InvRect.right = pCtrl->cr - pCtrl->cl; InvRect.bottom = pCtrl->cb - pCtrl->ct; } SetCaretPos (hWnd, pSLEditData->caretOff * GetSysCharWidth () + pSLEditData->leftMargin, pSLEditData->topMargin); InvalidateRect (hWnd, &InvRect, FALSE); NotifyParent (hWnd, pCtrl->id, EN_CHANGE); } return 0; case MSG_GETTEXTLENGTH: pSLEditData = (PSLEDITDATA) (pCtrl->dwAddData2); return pSLEditData->dataEnd; return 0; case MSG_GETTEXT: { char* buffer = (char*)lParam; int len; pSLEditData = (PSLEDITDATA) (pCtrl->dwAddData2); len = min ((int)wParam, pSLEditData->dataEnd); memcpy (buffer, pSLEditData->buffer, len); buffer [len] = '\0'; return len; } break; case MSG_SETTEXT: { int len; if (dwStyle & ES_READONLY) return 0; pSLEditData = (PSLEDITDATA) (pCtrl->dwAddData2); 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); } return 0; case MSG_LBUTTONDBLCLK: NotifyParent (hWnd, pCtrl->id, EN_DBLCLK); break; case MSG_LBUTTONDOWN: { int newOff; pSLEditData = (PSLEDITDATA) (pCtrl->dwAddData2); newOff = edtGetOffset (pSLEditData, LOWORD (lParam)); if (newOff != pSLEditData->caretOff) { pSLEditData->editPos += newOff - pSLEditData->caretOff; pSLEditData->caretOff = newOff; SetCaretPos (hWnd, pSLEditData->caretOff * GetSysCharWidth () + pSLEditData->leftMargin, pSLEditData->topMargin); } NotifyParent (hWnd, pCtrl->id, EN_CLICKED); } break; case MSG_LBUTTONUP: break; case MSG_MOUSEMOVE: break; case MSG_GETDLGCODE: return DLGC_WANTCHARS | DLGC_HASSETSEL | DLGC_WANTARROWS; case EM_SETREADONLY: if (wParam) pCtrl->dwStyle |= ES_READONLY; else pCtrl->dwStyle &= ~ES_READONLY; return 0; case EM_SETPASSWORDCHAR: pSLEditData = (PSLEDITDATA) (pCtrl->dwAddData2); 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->dwAddData2); passwdchar = (int*) lParam; *passwdchar = pSLEditData->passwdChar; } return 0; case EM_LIMITTEXT: { int newLimit = (int)wParam; if (newLimit >= 0) { pSLEditData = (PSLEDITDATA) (pCtrl->dwAddData2); if (pSLEditData->bufferLen < newLimit) pSLEditData->hardLimit = -1; else pSLEditData->hardLimit = newLimit; } } return 0; default: break; } return DefaultControlProc (hWnd, message, wParam, lParam);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -