📄 simedit.c
字号:
pCtrl->dwStyle &= ~WS_DISABLED; else pCtrl->dwStyle |= WS_DISABLED; InvalidateRect (hWnd, NULL, TRUE); } return 0; case MSG_PAINT: { int dispLen; char* dispBuffer; RECT rect; simed = (PSIMEDITDATA) (pCtrl->dwAddData2); 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; hdc = BeginPaint (hWnd); if (dwStyle & ES_BASELINE) { SetPenColor (hdc, GetWindowElementColorEx (hWnd, FGC_CONTROL_NORMAL)); DrawHDotLine (hdc, simed->leftMargin, simed->topMargin + GetSysFontHeight (SYSLOGFONT_FIXED) + 1, RECTW (rect) - simed->leftMargin - simed->rightMargin); } dispLen = edtGetDispLen (pCtrl); if (dispLen == 0) { EndPaint (hWnd, hdc); break; } if (dwStyle & ES_PASSWORD) { /* dispBuffer = ALLOCATE_LOCAL (dispLen); */ dispBuffer = FixStrAlloc (dispLen); memset (dispBuffer, simed->passwdChar, dispLen); } else dispBuffer = simed->buffer + simed->startPos; ClipRectIntersect (hdc, &rect); if (dwStyle & WS_DISABLED) SetTextColor (hdc, GetWindowElementColorEx (hWnd, FGC_CONTROL_DISABLED)); else SetTextColor (hdc, GetWindowElementColorEx (hWnd, FGC_CONTROL_NORMAL)); SetBkMode (hdc, BM_TRANSPARENT); TextOutLen (hdc, simed->leftMargin, simed->topMargin, dispBuffer, dispLen); if (dwStyle & ES_PASSWORD) { FreeFixStr (dispBuffer); /* DEALLOCATE_LOCAL (dispBuffer); */ } 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 * simed->charWidth + 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 * simed->charWidth + 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 * simed->charWidth + 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 * simed->charWidth > edtGetOutWidth (pCtrl)) { bScroll = TRUE; simed->startPos += scrollStep; simed->caretOff = simed->editPos - simed->startPos; } SetCaretPos (hWnd, simed->caretOff * simed->charWidth + 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 * simed->charWidth; 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; } else { InvRect.left = simed->leftMargin + simed->caretOff * simed->charWidth; InvRect.top = simed->topMargin; InvRect.right = pCtrl->cr - pCtrl->cl; InvRect.bottom = pCtrl->cb - pCtrl->ct; } SetCaretPos (hWnd, simed->caretOff * simed->charWidth + simed->leftMargin, simed->topMargin); InvalidateRect (hWnd, &InvRect, TRUE); break; default:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -