📄 edit.c
字号:
if (bScroll)
InvalidateRect (hWnd, NULL, FALSE);
}
return 0;
#if 0
case SCANCODE_INSERT:
pCtrl->userdata ^= EST_REPLACE;
break;
#endif
case VK_DELETE: /* SCANCODE_REMOVE: */
if ((pCtrl->userdata & EST_READONLY)
|| (pSLEditData->editPos == pSLEditData->dataEnd)){
#if 0 /* fix: no ping() */
Ping ();
#endif
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 (hWnd);
InvRect.top = pSLEditData->topMargin;
InvRect.right = pCtrl->clirect.right - pCtrl->clirect.left;
InvRect.bottom = pCtrl->clirect.bottom - pCtrl->clirect.top;
InvalidateRect (hWnd, &InvRect, FALSE);
break;
case VK_BACK: /* SCANCODE_BACKSPACE: */
if ((pCtrl->userdata & EST_READONLY)
|| (pSLEditData->editPos == 0)) {
#if 0 /* fix: no ping */
Ping ();
#endif
return 0;
}
if (edtIsACCharBeforePosition (pSLEditData->buffer,
pSLEditData->editPos))
deleted = 2;
else
deleted = 1;
for (i = pSLEditData->editPos;
i < pSLEditData->dataEnd;
i++)
pSLEditData->buffer [i - deleted]
= pSLEditData->buffer [i];
pSLEditData->dataEnd -= deleted;
pSLEditData->editPos -= deleted;
bChange = TRUE;
pSLEditData->caretOff -= deleted;
if (pSLEditData->caretOff == 0
&& pSLEditData->editPos != 0) {
if (edtIsACCharBeforePosition (pSLEditData->buffer,
pSLEditData->editPos)) {
pSLEditData->startPos -= 2;
pSLEditData->caretOff = 2;
}
else {
pSLEditData->startPos --;
pSLEditData->caretOff = 1;
}
InvRect.left = pSLEditData->leftMargin;
InvRect.top = pSLEditData->topMargin;
InvRect.right = pCtrl->clirect.right -
pCtrl->clirect.left;
InvRect.bottom = pCtrl->clirect.bottom -
pCtrl->clirect.top;
}
else {
InvRect.left = pSLEditData->leftMargin
+ pSLEditData->caretOff * GetSysCharWidth (hWnd);
InvRect.top = pSLEditData->topMargin;
InvRect.right = pCtrl->clirect.right -
pCtrl->clirect.left;
InvRect.bottom = pCtrl->clirect.bottom -
pCtrl->clirect.top;
}
SetCaretPos (pSLEditData->caretOff * GetSysCharWidth (hWnd)
+ pSLEditData->leftMargin, pSLEditData->topMargin);
InvalidateRect (hWnd, &InvRect, FALSE);
break;
default:
break;
}
if (bChange)
SendMessage (GetParent (hWnd), WM_COMMAND,
(WPARAM) MAKELONG (pCtrl->id, EN_CHANGE), (LPARAM) hWnd);
}
break;
#endif
case WM_CHAR:
{
char charBuffer [2];
int i, chars, scrollStep, inserting;
RECT InvRect;
pSLEditData = (PSLEDITDATA) (pCtrl->userdata2);
if (dwStyle & ES_READONLY) {
#if 0 /* fix: no ping() */
Ping();
#endif
return 0;
}
if (HIBYTE (wParam)) {
charBuffer [0] = LOBYTE (wParam);
charBuffer [1] = HIBYTE (wParam);
chars = 2;
}
else {
charBuffer [0] = LOBYTE (wParam);
chars = 1;
}
if (chars == 1) {
switch (charBuffer [0])
{
case 0x00: /* NULL */
case 0x07: /* BEL */
case 0x08: /* BS */
case 0x09: /* HT */
case 0x0A: /* LF */
case 0x0B: /* VT */
case 0x0C: /* FF */
case 0x0D: /* CR */
case 0x1B: /* Escape */
return 0;
}
}
if (pCtrl->userdata & EST_REPLACE) {
if (pSLEditData->dataEnd == pSLEditData->editPos)
inserting = chars;
else if (edtIsACCharAtPosition (pSLEditData->buffer,
pSLEditData->dataEnd,
pSLEditData->editPos)) {
if (chars == 2)
inserting = 0;
else
inserting = -1;
}
else {
if (chars == 2)
inserting = 1;
else
inserting = 0;
}
}
else
inserting = chars;
/* check space */
if (pSLEditData->dataEnd + inserting > pSLEditData->bufferLen) {
#if 0 /* fix: no ping() */
Ping ();
#endif
SendMessage (GetParent (hWnd), WM_COMMAND,
(WPARAM) MAKELONG (pCtrl->id, EN_MAXTEXT), (LPARAM) hWnd);
return 0;
}
else if ((pSLEditData->hardLimit >= 0)
&& ((pSLEditData->dataEnd + inserting)
> pSLEditData->hardLimit)) {
#if 0 /* fix: no ping() */
Ping ();
#endif
SendMessage (GetParent (hWnd), WM_COMMAND,
(WPARAM) MAKELONG (pCtrl->id, EN_MAXTEXT), (LPARAM) hWnd);
return 0;
}
if (inserting == -1) {
for (i = pSLEditData->editPos; i < pSLEditData->dataEnd-1; i++)
pSLEditData->buffer [i] = pSLEditData->buffer [i + 1];
}
else if (inserting > 0) {
for (i = pSLEditData->dataEnd + inserting - 1;
i > pSLEditData->editPos + inserting - 1;
i--)
pSLEditData->buffer [i]
= pSLEditData->buffer [i - inserting];
}
for (i = 0; i < chars; i++)
pSLEditData->buffer [pSLEditData->editPos + i]
= charBuffer [i];
pSLEditData->editPos += chars;
pSLEditData->caretOff += chars;
pSLEditData->dataEnd += inserting;
if (pSLEditData->caretOff * GetSysCharWidth (hWnd)
> edtGetOutWidth (pCtrl))
{
if (edtIsACCharAtPosition (pSLEditData->buffer,
pSLEditData->dataEnd,
pSLEditData->startPos))
scrollStep = 2;
else {
if (chars == 2) {
if (edtIsACCharAtPosition (pSLEditData->buffer,
pSLEditData->dataEnd,
pSLEditData->startPos + 1))
scrollStep = 3;
else
scrollStep = 2;
}
else
scrollStep = 1;
}
pSLEditData->startPos += scrollStep;
pSLEditData->caretOff =
pSLEditData->editPos - pSLEditData->startPos;
InvRect.left = pSLEditData->leftMargin;
InvRect.top = pSLEditData->topMargin;
InvRect.right = pCtrl->clirect.right - pCtrl->clirect.left;
InvRect.bottom = pCtrl->clirect.bottom - pCtrl->clirect.top;
}
else {
InvRect.left = pSLEditData->leftMargin
+ (pSLEditData->caretOff - chars)
* GetSysCharWidth (hWnd);
InvRect.top = pSLEditData->topMargin;
InvRect.right = pCtrl->clirect.right - pCtrl->clirect.left;
InvRect.bottom = pCtrl->clirect.bottom - pCtrl->clirect.top;
}
SetCaretPos (pSLEditData->caretOff * GetSysCharWidth (hWnd)
+ pSLEditData->leftMargin, pSLEditData->topMargin);
InvalidateRect (hWnd, &InvRect, FALSE);
SendMessage (GetParent (hWnd), WM_COMMAND,
(WPARAM) MAKELONG (pCtrl->id, EN_CHANGE), (LPARAM) hWnd);
}
break;
case WM_GETTEXTLENGTH:
pSLEditData = (PSLEDITDATA) (pCtrl->userdata2);
return pSLEditData->dataEnd;
case WM_GETTEXT:
{
char* buffer = (char*)lParam;
int len;
pSLEditData = (PSLEDITDATA) (pCtrl->userdata2);
len = min ((int)wParam, pSLEditData->dataEnd);
memcpy (buffer, pSLEditData->buffer, len);
buffer [len] = '\0';
return len;
}
break;
case WM_SETTEXT:
{
int len;
if (dwStyle & ES_READONLY)
return 0;
pSLEditData = (PSLEDITDATA) (pCtrl->userdata2);
len = strlen ((char*)lParam);
len = min (len, pSLEditData->bufferLen);
if (pSLEditData->hardLimit >= 0)
len = min (len, pSLEditData->hardLimit);
pSLEditData->dataEnd = len;
memcpy (pSLEditData->buffer, (char*)lParam, len);
pSLEditData->editPos = 0;
pSLEditData->caretOff = 0;
pSLEditData->startPos = 0;
InvalidateRect (hWnd, NULL, FALSE);
}
break;
case WM_LBUTTONDBLCLK:
break;
case WM_LBUTTONDOWN:
{
int newOff;
pSLEditData = (PSLEDITDATA) (pCtrl->userdata2);
newOff = edtGetOffset (hWnd,pSLEditData, LOWORD (lParam));
if (newOff != pSLEditData->caretOff)
{
pSLEditData->editPos += newOff - pSLEditData->caretOff;
pSLEditData->caretOff = newOff;
SetCaretPos (pSLEditData->caretOff * GetSysCharWidth (hWnd)
+ pSLEditData->leftMargin, pSLEditData->topMargin);
}
}
break;
case WM_LBUTTONUP:
break;
case WM_MOUSEMOVE:
break;
case WM_GETDLGCODE:
return DLGC_WANTCHARS | DLGC_HASSETSEL | DLGC_WANTARROWS;
case EM_SETREADONLY:
if (wParam)
pCtrl->style/*dwStyle*/ |= ES_READONLY;
else
pCtrl->style/*dwStyle*/ &= ~ES_READONLY;
return 0;
case EM_SETPASSWORDCHAR:
pSLEditData = (PSLEDITDATA) (pCtrl->userdata2);
if (pSLEditData->passwdChar != (int)wParam) {
if (dwStyle & ES_PASSWORD) {
pSLEditData->passwdChar = (int)wParam;
InvalidateRect (hWnd, NULL, TRUE);
}
}
return 0;
case EM_GETPASSWORDCHAR:
{
int* passwdchar;
pSLEditData = (PSLEDITDATA) (pCtrl->userdata2);
passwdchar = (int*) lParam;
*passwdchar = pSLEditData->passwdChar;
}
return 0;
case EM_LIMITTEXT:
{
int newLimit = (int)wParam;
if (newLimit >= 0) {
pSLEditData = (PSLEDITDATA) (pCtrl->userdata2);
if (pSLEditData->bufferLen < newLimit)
pSLEditData->hardLimit = -1;
else
pSLEditData->hardLimit = newLimit;
}
}
return 0;
default:
return DefWindowProc (hWnd, message, wParam, lParam);
break;
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -