📄 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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -