📄 edit.c
字号:
BOOL refresh = TRUE; mouseX = LOSWORD(lParam); mouseY = HISWORD(lParam); ScreenToClient(hWnd, &mouseX, &mouseY); GetClientRect(hWnd, &rcClient); if(mouseX >= 0 && mouseX < rcClient.right && mouseY >= 0 && mouseY < rcClient.bottom) {//in edit window set_caret_pos (hWnd, sled, mouseX, TRUE); if (sled->editPos == sled->selStart) make_charpos_visible (hWnd, sled, sled->selEnd, NULL); else make_charpos_visible (hWnd, sled, sled->selStart, NULL); } else if (mouseY < 0) { sled->nContX = 0; sled->selStart = 0; sled->selEnd = sled->editPos; } else if(mouseY >= rcClient.bottom) { sled->selStart = sled->editPos; sled->selEnd = sled->content.txtlen; sled->nContX = sled->nContW - (sled->rcCont.right - sled->rcCont.left); } else if (mouseX < 0) { if (sled->selEnd == sled->content.txtlen) { set_caret_pos (hWnd, sled, 0, TRUE); make_charpos_visible (hWnd, sled, sled->selStart, NULL); goto quit; } if (sled->selStart == 0) return 0; shift_one_char_l (selStart); refresh = make_charpos_visible (hWnd, sled, sled->selStart, NULL); } else if (mouseX >= rcClient.right) { if (sled->selStart == 0) { set_caret_pos (hWnd, sled, rcClient.right - 1, TRUE); //make_charpos_visible (hWnd, sled, sled->selEnd, NULL); //goto quit; } if (sled->selEnd == sled->content.txtlen) return 0; shift_one_char_r (selEnd); refresh = make_charpos_visible (hWnd, sled, sled->selEnd, NULL); } quit: check_caret(); if (refresh) InvalidateRect(hWnd, NULL, TRUE); return 0;}static intsleInsertText (HWND hWnd, PSLEDITDATA sled, const char *newtext, int inserting){ int deleted; unsigned char *pIns, *content = sled->content.string; //delete the seleted if(sled->selStart != sled->selEnd) { deleted = sled->selEnd - sled->selStart; memmove (content + sled->selStart, content + sled->selEnd, sled->content.txtlen - sled->selEnd); sled->content.txtlen -= deleted; sled->editPos = sled->selStart; sled->selEnd = sled->selStart; ShowCaret(hWnd); if (!newtext) inserting = 0; } if ( !(sled->status & EST_REPLACE) && inserting > 0 && sled->hardLimit >= 0 && ((sled->content.txtlen + inserting) > sled->hardLimit)) { Ping (); NotifyParent (hWnd, GetDlgCtrlID(hWnd), EN_MAXTEXT); inserting = sled->hardLimit - sled->content.txtlen; //return 0; } else if ( (sled->status & EST_REPLACE) && inserting > 0 && sled->hardLimit >= 0 && (sled->editPos + inserting > sled->hardLimit) ) { Ping (); NotifyParent (hWnd, GetDlgCtrlID(hWnd), EN_MAXTEXT); inserting = sled->hardLimit - sled->editPos; } if (inserting > 0) { content = testr_realloc (&sled->content, sled->content.txtlen + inserting); pIns = content + sled->editPos; if ( !(sled->status & EST_REPLACE) ) memmove (pIns + inserting, pIns, sled->content.txtlen+1 - sled->editPos); memcpy (pIns, newtext, inserting); } else if (inserting < 0) { pIns = content + sled->editPos; memmove (pIns + inserting, pIns, sled->content.txtlen+1 - sled->editPos); content = testr_realloc (&sled->content, sled->content.txtlen + inserting); } if (inserting <= 0 || !(sled->status & EST_REPLACE)) sled->content.txtlen += inserting; else { int add_len = inserting - sled->content.txtlen + sled->editPos; if (add_len > 0) { sled->content.txtlen += add_len; sled->content.string[sled->content.txtlen] = '\0'; } } sled->editPos += inserting; sled->selStart = sled->selEnd = sled->editPos; if (!edtSetCaretPos (hWnd, sled)) InvalidateRect (hWnd, NULL, TRUE); InvalidateRect (hWnd, NULL, TRUE); NotifyParent (hWnd, GetDlgCtrlID(hWnd), EN_CHANGE); return 0;}static int sleInsertCbText (HWND hWnd, PSLEDITDATA sled){ int inserting; unsigned char *txtBuffer; if (GetWindowStyle(hWnd) & ES_READONLY) { return 0; } inserting = GetClipBoardDataLen (CBNAME_TEXT); txtBuffer = ALLOCATE_LOCAL (inserting); GetClipBoardData (CBNAME_TEXT, txtBuffer, inserting); sleInsertText (hWnd, sled, txtBuffer, inserting); DEALLOCATE_LOCAL(txtBuffer); return 0;}static int sleKeyDown (HWND hWnd, WPARAM wParam, LPARAM lParam){ BOOL bChange = FALSE; DWORD dwStyle = GetWindowStyle (hWnd); PCONTROL pCtrl = Control(hWnd); PSLEDITDATA sled = (PSLEDITDATA) (pCtrl->dwAddData2); switch (LOWORD (wParam)) { case SCANCODE_ENTER: NotifyParent (hWnd, pCtrl->id, EN_ENTER); return 0; case SCANCODE_HOME: { BOOL refresh = FALSE; if(lParam & KS_SHIFT) { make_pos_visible (hWnd, sled, 0); sled->selStart = 0; sled->selEnd = sled->editPos; check_caret(); InvalidateRect (hWnd, NULL, TRUE); return 0; } if (sled->selStart != sled->selEnd) { ShowCaret(hWnd); refresh = TRUE; } sled->editPos = 0; sled->selStart = sled->selEnd = 0; if (!edtSetCaretPos (hWnd, sled) && refresh) InvalidateRect (hWnd, NULL, TRUE); return 0; } case SCANCODE_END: { BOOL refresh = FALSE; if(lParam & KS_SHIFT) { sled->selStart = sled->editPos; sled->selEnd = sled->content.txtlen; check_caret(); if (make_charpos_visible (hWnd, sled, sled->selEnd, NULL)) InvalidateRect(hWnd, NULL, TRUE); return 0; } if (sled->selStart != sled->selEnd) { ShowCaret(hWnd); refresh = TRUE; } sled->editPos = sled->content.txtlen; sled->selStart = sled->selEnd = sled->editPos; if (!edtSetCaretPos (hWnd, sled) && refresh) InvalidateRect (hWnd, NULL, TRUE); return 0; } case SCANCODE_CURSORBLOCKLEFT: { BOOL refresh = FALSE; if(lParam & KS_SHIFT) { if (sled->selStart == sled->selEnd) { sled->selStart = sled->selEnd = sled->editPos; } if (sled->selStart < sled->editPos || sled->selStart == sled->selEnd) { if (sled->selStart > 0) shift_one_char_l(selStart); } else { shift_one_char_l(selEnd); } check_caret (); make_charpos_visible (hWnd, sled, sled->selStart, NULL); InvalidateRect (hWnd, NULL, TRUE); return 0; } if (sled->editPos > 0) { shift_one_char_l (editPos); } if (sled->selStart != sled->selEnd) { ShowCaret (hWnd); ActiveCaret (hWnd); refresh = TRUE; } sled->selStart = sled->selEnd = sled->editPos; if (!edtSetCaretPos (hWnd, sled) && refresh) InvalidateRect (hWnd, NULL, TRUE); return 0; } case SCANCODE_CURSORBLOCKRIGHT: { BOOL refresh = FALSE; if(lParam & KS_SHIFT) { if(sled->selStart == sled->selEnd) sled->selStart = sled->selEnd = sled->editPos; if (sled->selStart == sled->selEnd || sled->selEnd > sled->editPos) { if (sled->selEnd < sled->content.txtlen) shift_one_char_r (selEnd); } else { shift_one_char_r (selStart); } check_caret (); make_charpos_visible (hWnd, sled, sled->selStart, NULL); InvalidateRect (hWnd, NULL, TRUE); return 0; } if (sled->editPos < sled->content.txtlen) { shift_one_char_r (editPos); } if (sled->selStart != sled->selEnd) { ShowCaret (hWnd); ActiveCaret (hWnd); refresh = TRUE; } sled->selStart = sled->selEnd = sled->editPos; if (!edtSetCaretPos (hWnd, sled) && refresh) InvalidateRect (hWnd, NULL, TRUE); } return 0; case SCANCODE_REMOVE: { int oldpos = sled->editPos; if ((dwStyle & ES_READONLY)) return 0; if (sled->editPos == sled->content.txtlen && sled->selStart == sled->selEnd) return 0; if (sled->selStart == sled->selEnd && sled->editPos < sled->content.txtlen) { shift_one_char_r(editPos); } sleInsertText (hWnd, sled, NULL, oldpos - sled->editPos); } break;/* case SCANCODE_BACKSPACE: { int del; if (dwStyle & ES_READONLY) return 0; if (sled->editPos == 0 && sled->selStart == sled->selEnd) return 0; del = - CHLENPREV( sled->content.string, (sled->content.string + sled->editPos) ); sleInsertText (hWnd, sled, NULL, del); } break;*/ case SCANCODE_A: { if (lParam & KS_CTRL) { sleSetSel (hWnd, sled, 0, sled->content.txtlen); } return 0; }#ifdef _CLIPBOARD_SUPPORT case SCANCODE_C: case SCANCODE_X: { if (lParam & KS_CTRL && sled->selEnd - sled->selStart > 0) { SetClipBoardData (CBNAME_TEXT, sled->content.string + sled->selStart, sled->selEnd - sled->selStart, CBOP_NORMAL); if (wParam == SCANCODE_X && !(GetWindowStyle(hWnd) & ES_READONLY)) { sleInsertText (hWnd, sled, NULL, 0); } } return 0; } case SCANCODE_V: { if (!(lParam & KS_CTRL)) return 0; return sleInsertCbText (hWnd, sled); }#endif /* _CLIPBOARD_SUPPORT */ case SCANCODE_INSERT: sled->status ^= EST_REPLACE; break; default: break; } //end switch if (bChange) NotifyParent (hWnd, pCtrl->id, EN_CHANGE); return 0;}static int SLEditCtrlProc (HWND hWnd, int message, WPARAM wParam, LPARAM lParam){ DWORD dwStyle; HDC hdc; PSLEDITDATA sled = NULL; dwStyle = GetWindowStyle(hWnd); if (message != MSG_CREATE) sled = (PSLEDITDATA) GetWindowAdditionalData2 (hWnd); switch (message) { case MSG_CREATE: if ( !(sled = calloc (1, sizeof (SLEDITDATA))) ) return -1; if (sledit_init (hWnd, sled) < 0) return -1; break; case MSG_DESTROY: sledit_destroy (hWnd, sled); free (sled); break; case MSG_ERASEBKGND: EditOnEraseBackground (hWnd, (HDC)wParam, (const RECT*)lParam); return 0; case MSG_PAINT: { hdc = BeginPaint (hWnd); slePaint (hWnd, hdc, sled); EndPaint (hWnd, hdc); return 0; } case MSG_FONTCHANGING:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -