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