📄 simedit.c
字号:
if (simed->status & EST_FOCUSED) break; simed->status |= EST_FOCUSED; /* only implemented for ES_LEFT align format. */ SetCaretPos (hWnd, simed->caretOff * GetSysCharWidth () + simed->leftMargin, simed->topMargin); ShowCaret (hWnd); ActiveCaret (hWnd); NotifyParent (hWnd, pCtrl->id, EN_SETFOCUS); break; case MSG_ENABLE: if ( (!(dwStyle & WS_DISABLED) && !wParam) || ((dwStyle & WS_DISABLED) && wParam) ) { if (wParam) pCtrl->dwStyle &= ~WS_DISABLED; else pCtrl->dwStyle |= WS_DISABLED; InvalidateRect (hWnd, NULL, TRUE); } return 0; case MSG_NCPAINT: if (wParam) hdc = wParam; else hdc = GetDC (hWnd); if (lParam) ClipRectIntersect (hdc, (RECT*)lParam); if (dwStyle & WS_BORDER)#ifdef _FLAT_WINDOW_STYLE DrawFlatControlFrameEx (hdc, 0, 0, pCtrl->right - pCtrl->left - 1, pCtrl->bottom - pCtrl->top - 1, PIXEL_invalid, 1, -1);#else Draw3DDownFrame (hdc, 0, 0, pCtrl->right - pCtrl->left - 1, pCtrl->bottom - pCtrl->top - 1, PIXEL_invalid);#endif if (!wParam) ReleaseDC (hdc); return 0; case MSG_PAINT: { int dispLen; char* dispBuffer; RECT rect; simed = (PSIMEDITDATA) (pCtrl->dwAddData2); dispLen = edtGetDispLen (pCtrl); if (dispLen == 0) break; GetClientRect (hWnd, &rect); /* only implemented ES_LEFT align format for single line edit. */ rect.left += simed->leftMargin; rect.top += simed->topMargin; rect.right -= simed->rightMargin; rect.bottom -= simed->bottomMargin; if (dwStyle & ES_PASSWORD) { dispBuffer = alloca (dispLen); memset (dispBuffer, '*', dispLen); } else dispBuffer = simed->buffer + simed->startPos; hdc = BeginPaint (hWnd); if (dwStyle & WS_DISABLED) { SetBrushColor (hdc, PIXEL_lightgray); SetBkColor (hdc, PIXEL_lightgray); } else { SetBrushColor (hdc, PIXEL_lightwhite); SetBkColor (hdc, PIXEL_lightwhite); } SetTextColor (hdc, PIXEL_black); ClipRectIntersect (hdc, &rect); TextOutLen (hdc, simed->leftMargin, simed->topMargin, dispBuffer, dispLen); EndPaint (hWnd, hdc); return 0; } case MSG_KEYDOWN: { BOOL bChange = FALSE; int i; RECT InvRect; int deleted; simed = (PSIMEDITDATA) (pCtrl->dwAddData2); switch (LOWORD (wParam)) { case SCANCODE_ENTER: NotifyParent (hWnd, pCtrl->id, EN_ENTER); return 0; case SCANCODE_HOME: if (simed->editPos == 0) return 0; simed->editPos = 0; simed->caretOff = 0; SetCaretPos (hWnd, simed->caretOff * GetSysCharWidth () + simed->leftMargin, simed->topMargin); if (simed->startPos != 0) InvalidateRect (hWnd, NULL, TRUE); simed->startPos = 0; return 0; case SCANCODE_END: { int newStartPos; if (simed->editPos == simed->dataEnd) return 0; newStartPos = edtGetStartDispPosAtEnd (pCtrl, simed); simed->editPos = simed->dataEnd; simed->caretOff = simed->editPos - newStartPos; SetCaretPos (hWnd, simed->caretOff * GetSysCharWidth () + simed->leftMargin, simed->topMargin); if (simed->startPos != newStartPos) InvalidateRect (hWnd, NULL, TRUE); simed->startPos = newStartPos; } return 0; case SCANCODE_CURSORBLOCKLEFT: { BOOL bScroll = FALSE; int scrollStep; if (simed->editPos == 0) return 0; if (edtIsACCharBeforePosition (simed->buffer, simed->editPos)) { scrollStep = 2; simed->editPos -= 2; } else { scrollStep = 1; simed->editPos --; } simed->caretOff -= scrollStep; if (simed->caretOff == 0 && simed->editPos != 0) { bScroll = TRUE; if (edtIsACCharBeforePosition (simed->buffer, simed->editPos)) { simed->startPos -= 2; simed->caretOff = 2; } else { simed->startPos --; simed->caretOff = 1; } } else if (simed->caretOff < 0) { simed->startPos = 0; simed->caretOff = 0; } SetCaretPos (hWnd, simed->caretOff * GetSysCharWidth () + simed->leftMargin, simed->topMargin); if (bScroll) InvalidateRect (hWnd, NULL, TRUE); } return 0; case SCANCODE_CURSORBLOCKRIGHT: { BOOL bScroll = FALSE; int scrollStep, moveStep; if (simed->editPos == simed->dataEnd) return 0; if (edtIsACCharAtPosition (simed->buffer, simed->dataEnd, simed->startPos)) { if (edtIsACCharAtPosition (simed->buffer, simed->dataEnd, simed->editPos)) { scrollStep = 2; moveStep = 2; simed->editPos += 2; } else { scrollStep = 2; moveStep = 1; simed->editPos ++; } } else { if (edtIsACCharAtPosition (simed->buffer, simed->dataEnd, simed->editPos)) { if (edtIsACCharAtPosition (simed->buffer, simed->dataEnd, simed->startPos + 1)) scrollStep = 3; else scrollStep = 2; moveStep = 2; simed->editPos += 2; } else { scrollStep = 1; moveStep = 1; simed->editPos ++; } } simed->caretOff += moveStep; if (simed->caretOff * GetSysCharWidth () > edtGetOutWidth (pCtrl)) { bScroll = TRUE; simed->startPos += scrollStep; simed->caretOff = simed->editPos - simed->startPos; } SetCaretPos (hWnd, simed->caretOff * GetSysCharWidth () + simed->leftMargin, simed->topMargin); if (bScroll) InvalidateRect (hWnd, NULL, TRUE); } return 0; case SCANCODE_INSERT: simed = (PSIMEDITDATA) (pCtrl->dwAddData2); simed->status ^= EST_REPLACE; break; case SCANCODE_REMOVE: simed = (PSIMEDITDATA) (pCtrl->dwAddData2); if ((dwStyle & ES_READONLY) || (simed->editPos == simed->dataEnd)){ return 0; } if (edtIsACCharAtPosition (simed->buffer, simed->dataEnd, simed->editPos)) deleted = 2; else deleted = 1; for (i = simed->editPos; i < simed->dataEnd - deleted; i++) simed->buffer [i] = simed->buffer [i + deleted]; simed->dataEnd -= deleted; bChange = TRUE; InvRect.left = simed->leftMargin + simed->caretOff * GetSysCharWidth (); InvRect.top = simed->topMargin; InvRect.right = pCtrl->cr - pCtrl->cl; InvRect.bottom = pCtrl->cb - pCtrl->ct; InvalidateRect (hWnd, &InvRect, TRUE); break; case SCANCODE_BACKSPACE: simed = (PSIMEDITDATA) (pCtrl->dwAddData2); if ((dwStyle & ES_READONLY) || (simed->editPos == 0)) { return 0; } if (edtIsACCharBeforePosition (simed->buffer, simed->editPos)) deleted = 2; else deleted = 1; for (i = simed->editPos; i < simed->dataEnd; i++) simed->buffer [i - deleted] = simed->buffer [i]; simed->dataEnd -= deleted; simed->editPos -= deleted; bChange = TRUE; simed->caretOff -= deleted; if (simed->caretOff == 0 && simed->editPos != 0) { if (edtIsACCharBeforePosition (simed->buffer, simed->editPos)) { simed->startPos -= 2; simed->caretOff = 2; } else { simed->startPos --; simed->caretOff = 1; } InvRect.left = simed->leftMargin; InvRect.top = simed->topMargin; InvRect.right = pCtrl->cr - pCtrl->cl; InvRect.bottom = pCtrl->cb - pCtrl->ct; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -