📄 edit.c
字号:
pSLEditData->hardLimit = -1;
/* undo information */
pSLEditData->lastOp = EDIT_OP_NONE;
pSLEditData->lastPos = 0;
pSLEditData->affectedLen = 0;
pSLEditData->undoBufferLen = LEN_SLEDIT_UNDOBUFFER;
pSLEditData->undoBuffer [0] = '\0';
pSLEditData->dataEnd = strlen (pCtrl->szTitle);
memcpy (pSLEditData->buffer, pCtrl->szTitle,
min (LEN_SLEDIT_BUFFER, pSLEditData->dataEnd));
pCtrl->userdata2 = (DWORD) pSLEditData;
pCtrl->userdata = 0;
break;
case WM_DESTROY:
DestroyCaret ();
free ((void*)pCtrl->userdata2);
break;
#if 0
case WM_CHANGESIZE:
{
pCtrl->cl = pCtrl->left + WIDTH_EDIT_BORDER;
pCtrl->ct = pCtrl->top + WIDTH_EDIT_BORDER;
pCtrl->cr = pCtrl->right - WIDTH_EDIT_BORDER;
pCtrl->cb = pCtrl->bottom - WIDTH_EDIT_BORDER;
}
break;
#endif
#if 1 /* jmt: for edit: chinese support */
case WM_SETFONT:
{
pSLEditData = (PSLEDITDATA) (pCtrl->userdata2);
pSLEditData->hFont = (HFONT)wParam;
ShowWindow(hWnd, SW_HIDE);
ShowWindow(hWnd, SW_SHOWNA);
if(LOWORD(lParam))
InvalidateRect(hWnd,NULL,TRUE);
}
return (LRESULT)0;
case WM_GETFONT:
pSLEditData = (PSLEDITDATA) (pCtrl->userdata2);
return (LRESULT)pSLEditData->hFont;
#endif
#if 0
case WM_SETCURSOR:
if (dwStyle & WS_DISABLED)
{
SetCursor (GetSystemCursor (IDC_ARROW));
return 0;
}
break;
#endif
case WM_KILLFOCUS:
pCtrl->userdata &= ~EST_FOCUSED;
HideCaret (hWnd);
DestroyCaret ();
SendMessage (GetParent (hWnd), WM_COMMAND,
(WPARAM) MAKELONG (pCtrl->id, EN_KILLFOCUS), (LPARAM)hWnd);
break;
case WM_SETFOCUS:
if (pCtrl->userdata & EST_FOCUSED)
return 0;
pCtrl->userdata |= EST_FOCUSED;
pSLEditData = (PSLEDITDATA) (pCtrl->userdata2);
/* only implemented for ES_LEFT align format. */
CreateCaret (hWnd, NULL, 1 /*+ GetSysCharWidth(hWnd)*/,
hWnd->clirect.bottom-hWnd->clirect.top-2);
SetCaretPos (pSLEditData->caretOff * GetSysCharWidth (hWnd)
+ pSLEditData->leftMargin, pSLEditData->topMargin);
ShowCaret (hWnd);
SendMessage (GetParent (hWnd), WM_COMMAND,
(WPARAM) MAKELONG (pCtrl->id, EN_SETFOCUS), (LPARAM) hWnd);
break;
case WM_ENABLE:
if ( (!(dwStyle & WS_DISABLED) && !wParam)
|| ((dwStyle & WS_DISABLED) && wParam) ) {
if (wParam)
pCtrl->style &= ~WS_DISABLED;
else
pCtrl->style |= WS_DISABLED;
InvalidateRect (hWnd, NULL, FALSE);
}
break;
case WM_NCCALCSIZE:
{
LPNCCALCSIZE_PARAMS lpnc;
/* calculate client rect from passed window rect in rgrc[0]*/
lpnc = (LPNCCALCSIZE_PARAMS)lParam;
if(GetWindowLong(hWnd, GWL_STYLE) & WS_BORDER)
InflateRect(&lpnc->rgrc[0], -2, -2);
}
break;
case WM_NCPAINT:
hdc = wParam? (HDC)wParam: GetWindowDC (hWnd);
GetWindowRect(hWnd, &rc);
if (dwStyle & WS_BORDER)
Draw3dInset(hdc, rc.left, rc.top,
rc.right-rc.left, rc.bottom-rc.top);
if (!wParam)
ReleaseDC (hWnd, hdc);
break;
case WM_PAINT:
{
int dispLen;
char* dispBuffer;
RECT rect,rc;
PAINTSTRUCT ps;
HGDIOBJ oldfont;
oldfont=NULL;
hdc = BeginPaint (hWnd,&ps);
GetClientRect (hWnd, &rect);
if (dwStyle & WS_DISABLED)
{
#if 0
SetBrushColor (hdc, LTGRAY/*COLOR_lightgray*/);
FillBox (hdc, 0, 0, rect.right, rect.bottom);
#else
rc.left=0; rc.top=0; rc.bottom=rect.bottom; rc.right=rect.right;
FillRect(hdc,&rc,GetStockObject(LTGRAY_BRUSH));
#endif
SetBkColor (hdc, LTGRAY/*COLOR_lightgray*/);
}
else
{
#if 0
SetBrushColor (hdc, WHITE/*COLOR_lightwhite*/);
FillBox (hdc, 0, 0, rect.right, rect.bottom);
#else
rc.left=0; rc.top=0; rc.bottom=rect.bottom; rc.right=rect.right;
FillRect(hdc,&rc,GetStockObject(WHITE_BRUSH));
#endif
SetBkColor (hdc, WHITE/*COLOR_lightwhite*/);
}
SetTextColor (hdc, BLACK/*COLOR_black*/);
dispLen = edtGetDispLen (pCtrl);
if (dispLen == 0)
{
EndPaint (hWnd, &ps);
break;
}
pSLEditData = (PSLEDITDATA) (pCtrl->userdata2);
#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;
#if 0 /* FIXME no ClipRectIntersect() */
#if 0
ClipRectIntersect (hdc, &rect);
#else
GdSetClipRects(hdc->psd,1,&rect); /*??==ClipRectIntersect??*/
#endif
#endif
#ifdef USE_BIG5
oldfont=SelectObject(hdc,CreateFont(12,
0,0,0,0,0,0,0,0,0,0,0,
FF_DONTCARE|DEFAULT_PITCH,
"HZXFONT"));
#else
SelectObject(hdc, pSLEditData->hFont);
#endif
TextOut (hdc, pSLEditData->leftMargin, pSLEditData->topMargin,
dispBuffer,-1);
#ifdef USE_BIG5
DeleteObject(SelectObject(hdc,oldfont));
#endif
EndPaint (hWnd, &ps);
FREEA(dispBuffer);
}
break;
#if 1 /* jmt+ */
case WM_KEYDOWN:
{
BOOL bChange = FALSE;
int i;
RECT InvRect;
int deleted;
pSLEditData = (PSLEDITDATA) (pCtrl->userdata2);
switch ((int)(wParam)) /* (LOWORD (wParam)) */
{
#if 0
case SCANCODE_ENTER:
SendMessage (GetParent (hWnd), WM_COMMAND,
(WPARAM) MAKELONG (pCtrl->id, EN_ENTER), (LPARAM) hWnd);
return 0;
case SCANCODE_HOME:
if (pSLEditData->editPos == 0)
return 0;
pSLEditData->editPos = 0;
pSLEditData->caretOff = 0;
SetCaretPos (pSLEditData->caretOff * GetSysCharWidth (hWnd)
+ 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 (pSLEditData->caretOff * GetSysCharWidth (hWnd)
+ pSLEditData->leftMargin, pSLEditData->topMargin);
if (pSLEditData->startPos != newStartPos)
InvalidateRect (hWnd, NULL, FALSE);
pSLEditData->startPos = newStartPos;
}
return 0;
#endif
case VK_LEFT: /* 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 (pSLEditData->caretOff * GetSysCharWidth (hWnd)
+ pSLEditData->leftMargin, pSLEditData->topMargin);
if (bScroll)
InvalidateRect (hWnd, NULL, FALSE);
}
return 0;
case VK_RIGHT: /* 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 (hWnd)
> edtGetOutWidth (pCtrl))
{
bScroll = TRUE;
pSLEditData->startPos += scrollStep;
pSLEditData->caretOff =
pSLEditData->editPos - pSLEditData->startPos;
}
SetCaretPos (pSLEditData->caretOff * GetSysCharWidth (hWnd)
+ pSLEditData->leftMargin, pSLEditData->topMargin);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -