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