📄 edit.c
字号:
case SCANCODE_HOME: if (sled->editPos == 0) return 0; sled->editPos = 0; if (sled->startPos != 0) { sled->startPos = 0; InvalidateRect (hWnd, NULL, TRUE); } SetCaretPos (hWnd, sled->leftMargin, sled->topMargin); return 0; case SCANCODE_END: { int newStartPos; if (sled->editPos == sled->nr_chars) return 0; sled->editPos = sled->nr_chars; newStartPos = edtGetStartDispPosAtEnd (hWnd, sled); if (sled->startPos != newStartPos) { sled->startPos = newStartPos; InvalidateRect (hWnd, NULL, TRUE); } SetCaretPos (hWnd, DX_CHARS(editPos) - DX_CHARS(startPos) + sled->leftMargin, sled->topMargin); } return 0; case SCANCODE_CURSORBLOCKLEFT: { BOOL bScroll = FALSE; if (sled->editPos == 0) return 0; if (sled->editPos == sled->startPos) { sled->editPos --; sled->startPos = edtGetPosByX (sled, DX_CHARS(editPos) - edtGetOutWidth (hWnd, sled)/4); bScroll = TRUE; } else sled->editPos --; SetCaretPos (hWnd, DX_CHARS(editPos) - DX_CHARS(startPos) + sled->leftMargin, sled->topMargin); if (bScroll) InvalidateRect (hWnd, NULL, TRUE); } return 0; case SCANCODE_CURSORBLOCKRIGHT: { BOOL bScroll = FALSE; int out_width = edtGetOutWidth (hWnd, sled); if (sled->editPos == sled->nr_chars) return 0; if ((DX_CHARS(editPos) - DX_CHARS(startPos) <= out_width) && (sled->dx_chars[sled->editPos + 1] - DX_CHARS(startPos) > out_width)) { bScroll = TRUE; sled->editPos ++; sled->startPos = edtGetPosByX (sled, (DX_CHARS(editPos) - out_width /4)); if ((DX_CHARS(startPos) + out_width) > sled->extent.cx) sled->startPos = edtGetStartDispPosAtEnd (hWnd, sled); } else sled->editPos ++; SetCaretPos (hWnd, DX_CHARS(editPos) - DX_CHARS(startPos) + sled->leftMargin, sled->topMargin); if (bScroll) InvalidateRect (hWnd, NULL, TRUE); } return 0; case SCANCODE_INSERT: sled = (PSLEDITDATA) (pCtrl->dwAddData2); sled->status ^= EST_REPLACE; break; case SCANCODE_REMOVE: { int deleted, i; sled = (PSLEDITDATA) (pCtrl->dwAddData2); if ((dwStyle & ES_READONLY) || (sled->editPos == sled->nr_chars)) return 0; deleted = sled->pos_chars[sled->editPos + 1] - POS_CHARS(editPos); for (i = POS_CHARS(editPos); i < sled->dataEnd - deleted; i++) sled->buffer [i] = sled->buffer [i + deleted]; sled->dataEnd -= deleted; edtGetLineInfo (hWnd, sled); bChange = TRUE; SetCaretPos (hWnd, DX_CHARS(editPos) - DX_CHARS(startPos) + sled->leftMargin, sled->topMargin); InvRect.left = (DX_CHARS(editPos) - DX_CHARS(startPos)) + sled->leftMargin - 1; InvalidateRect (hWnd, &InvRect, TRUE); } break; case SCANCODE_BACKSPACE: { int deleted, i; sled = (PSLEDITDATA) (pCtrl->dwAddData2); if ((dwStyle & ES_READONLY) || (sled->editPos == 0)) { return 0; } deleted = POS_CHARS(editPos) - sled->pos_chars[sled->editPos - 1]; for (i = POS_CHARS(editPos); i < sled->dataEnd; i++) sled->buffer [i - deleted] = sled->buffer [i]; sled->dataEnd -= deleted; if (sled->startPos == sled->editPos) { sled->editPos --; sled->startPos = edtGetPosByX (sled, DX_CHARS(editPos) - edtGetOutWidth (hWnd, sled)/4); } else { sled->editPos --; InvRect.left = (DX_CHARS(editPos) - DX_CHARS(startPos)) + sled->leftMargin - 1; } bChange = TRUE; edtGetLineInfo (hWnd, sled); SetCaretPos (hWnd, DX_CHARS(editPos) - DX_CHARS(startPos) + sled->leftMargin, sled->topMargin); InvalidateRect (hWnd, &InvRect, TRUE); } break; default: break; } if (bChange) NotifyParent (hWnd, pCtrl->id, EN_CHANGE); return 0; } case MSG_CHAR: { unsigned char charBuffer [2]; int i, chars, inserting, olddispLen, out_width; RECT InvRect; BOOL bScroll = FALSE; sled = (PSLEDITDATA) (pCtrl->dwAddData2); InvRect.left = sled->leftMargin - 1; InvRect.top = sled->topMargin; InvRect.right = pCtrl->cr - pCtrl->cl; InvRect.bottom = pCtrl->cb - pCtrl->ct; if (dwStyle & ES_READONLY) { return 0; } if (HIBYTE (wParam)) { charBuffer [0] = LOBYTE (wParam); charBuffer [1] = HIBYTE (wParam); chars = 2; } else { chars = 1; if (dwStyle & ES_UPPERCASE) { charBuffer [0] = toupper (LOBYTE (wParam)); } else if (dwStyle & ES_LOWERCASE) { charBuffer [0] = tolower (LOBYTE (wParam)); } else charBuffer [0] = LOBYTE (wParam); } if (chars == 1) { if (charBuffer [0] < 0x20 || charBuffer [0] == 0x7F) return 0; } if (sled->status & EST_REPLACE) { if (sled->nr_chars == sled->editPos) inserting = chars; else inserting = chars - ( sled->pos_chars[sled->editPos + 1] - POS_CHARS(editPos) ); } else inserting = chars; // check space if (sled->dataEnd + inserting > sled->bufferLen) { Ping (); NotifyParent (hWnd, pCtrl->id, EN_MAXTEXT); return 0; } else if ((sled->hardLimit >= 0) && ((sled->dataEnd + inserting) > sled->hardLimit)) { Ping (); NotifyParent (hWnd, pCtrl->id, EN_MAXTEXT); return 0; } olddispLen = DX_CHARS(editPos) - DX_CHARS(startPos); if (inserting == -1) { for (i = POS_CHARS(editPos); i < sled->dataEnd - 1; i++) sled->buffer [i] = sled->buffer [i + 1]; } else if (inserting > 0) { for (i = sled->dataEnd + inserting - 1; i > POS_CHARS(editPos) + inserting - 1; i--) sled->buffer [i] = sled->buffer [i - inserting]; } for (i = 0; i < chars; i++) sled->buffer [POS_CHARS(editPos) + i] = charBuffer [i]; sled->editPos += 1; sled->dataEnd += inserting; edtGetLineInfo (hWnd, sled); out_width = edtGetOutWidth (hWnd, sled); if (((DX_CHARS(editPos) - DX_CHARS(startPos)) >= out_width) && ((sled->dx_chars[sled->editPos - 1] - DX_CHARS(startPos)) < out_width)) { bScroll = TRUE; sled->startPos = edtGetPosByX (sled, DX_CHARS(editPos) - out_width * 3 / 4); } SetCaretPos (hWnd, DX_CHARS(editPos) - DX_CHARS(startPos) + sled->leftMargin, sled->topMargin); if (!bScroll) InvRect.left = sled->leftMargin + olddispLen - 1; InvalidateRect (hWnd, &InvRect, TRUE); NotifyParent (hWnd, pCtrl->id, EN_CHANGE); return 0; } case MSG_GETTEXTLENGTH: sled = (PSLEDITDATA) (pCtrl->dwAddData2); return sled->dataEnd; case MSG_GETTEXT: { char* buffer = (char*)lParam; int len; sled = (PSLEDITDATA) (pCtrl->dwAddData2); len = MIN ((int)wParam, sled->dataEnd); memcpy (buffer, sled->buffer, len); buffer [len] = '\0'; return len; } case MSG_SETTEXT: { int len; sled = (PSLEDITDATA) (pCtrl->dwAddData2); if (lParam == 0) return -1; len = strlen ((char*)lParam); len = MIN (len, sled->bufferLen); if (sled->hardLimit >= 0) len = MIN (len, sled->hardLimit); sled->dataEnd = len; memcpy (sled->buffer, (char*)lParam, len); edtGetLineInfo (hWnd, sled); sled->editPos = 0; sled->startPos = 0; if (sled->status & EST_FOCUSED) SetCaretPos (hWnd, sled->leftMargin, sled->topMargin); InvalidateRect (hWnd, NULL, TRUE); return 0; } case MSG_LBUTTONDBLCLK: NotifyParent (hWnd, pCtrl->id, EN_DBLCLK); break; case MSG_LBUTTONDOWN: { sled = (PSLEDITDATA) (pCtrl->dwAddData2); sled->editPos = edtGetPosByX (sled, LOSWORD (lParam) + DX_CHARS(startPos)); SetCaretPos (hWnd, DX_CHARS(editPos) - DX_CHARS(startPos) + sled->leftMargin, sled->topMargin); NotifyParent (hWnd, pCtrl->id, EN_CLICKED); break; }#if 0 case MSG_LBUTTONUP: case MSG_MOUSEMOVE: break;#endif case MSG_GETDLGCODE: return DLGC_WANTCHARS | DLGC_HASSETSEL | DLGC_WANTARROWS | DLGC_WANTENTER; case MSG_DOESNEEDIME: if (dwStyle & ES_READONLY) return FALSE; return TRUE; case EM_GETCARETPOS: { int* line_pos = (int *)wParam; int* char_pos = (int *)lParam; sled = (PSLEDITDATA) (pCtrl->dwAddData2); if (line_pos) *line_pos = 0; if (char_pos) *char_pos = sled->editPos; return sled->editPos; } case EM_SETCARETPOS: { int char_pos = (int)lParam; sled = (PSLEDITDATA) (pCtrl->dwAddData2); if (char_pos >= 0 && char_pos <= sled->nr_chars) { sled->editPos = char_pos; if (sled->status & EST_FOCUSED) SetCaretPos (hWnd, DX_CHARS(editPos) - DX_CHARS(startPos) + sled->leftMargin, sled->topMargin); return 0; } return -1; } case EM_SETREADONLY: if (wParam) pCtrl->dwStyle |= ES_READONLY; else pCtrl->dwStyle &= ~ES_READONLY; return 0; case EM_SETPASSWORDCHAR: sled = (PSLEDITDATA) (pCtrl->dwAddData2); if (sled->passwdChar != (int)wParam) { if (dwStyle & ES_PASSWORD) { sled->passwdChar = (int)wParam; InvalidateRect (hWnd, NULL, TRUE); } } return 0; case EM_GETPASSWORDCHAR: { int* passwdchar; sled = (PSLEDITDATA) (pCtrl->dwAddData2); passwdchar = (int*) lParam; *passwdchar = sled->passwdChar; return 0; } case EM_LIMITTEXT: { int newLimit = (int)wParam; if (newLimit >= 0) { sled = (PSLEDITDATA) (pCtrl->dwAddData2); if (sled->bufferLen < newLimit) sled->hardLimit = -1; else sled->hardLimit = newLimit; } return 0; } default: break; } return DefaultControlProc (hWnd, message, wParam, lParam);}#endif /* _CTRL_SLEDIT */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -