📄 simedit.c
字号:
default:
break;
}
if (bChange)
NotifyParent (hWnd, pCtrl->id, EN_CHANGE);
return 0;
}
case MSG_CHAR:
{
unsigned char charBuffer [2];
int i, chars, scrollStep, inserting;
RECT InvRect;
simed = (PSIMEDITDATA) (pCtrl->dwAddData2);
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 0
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;
}
#else
if (charBuffer [0] < 0x20 || charBuffer [0] == 0x7F)
return 0;
#endif
}
if (simed->status & EST_REPLACE) {
if (simed->dataEnd == simed->editPos)
inserting = chars;
else if (edtIsACCharAtPosition (simed->buffer,
simed->dataEnd,
simed->editPos)) {
if (chars == 2)
inserting = 0;
else
inserting = -1;
}
else {
if (chars == 2)
inserting = 1;
else
inserting = 0;
}
}
else
inserting = chars;
// check space
if (simed->dataEnd + inserting > simed->bufferLen) {
Ping ();
NotifyParent (hWnd, pCtrl->id, EN_MAXTEXT);
return 0;
}
else if ((simed->hardLimit >= 0)
&& ((simed->dataEnd + inserting)
> simed->hardLimit)) {
Ping ();
NotifyParent (hWnd, pCtrl->id, EN_MAXTEXT);
return 0;
}
if (inserting == -1) {
for (i = simed->editPos; i < simed->dataEnd-1; i++)
simed->buffer [i] = simed->buffer [i + 1];
}
else if (inserting > 0) {
for (i = simed->dataEnd + inserting - 1;
i > simed->editPos + inserting - 1;
i--)
simed->buffer [i]
= simed->buffer [i - inserting];
}
for (i = 0; i < chars; i++)
simed->buffer [simed->editPos + i]
= charBuffer [i];
simed->editPos += chars;
simed->caretOff += chars;
simed->dataEnd += inserting;
if (simed->caretOff * simed->charWidth
> edtGetOutWidth (pCtrl))
{
if (edtIsACCharAtPosition (simed->buffer,
simed->dataEnd,
simed->startPos))
scrollStep = 2;
else {
if (chars == 2) {
if (edtIsACCharAtPosition (simed->buffer,
simed->dataEnd,
simed->startPos + 1))
scrollStep = 3;
else
scrollStep = 2;
}
else
scrollStep = 1;
}
simed->startPos += scrollStep;
simed->caretOff =
simed->editPos - simed->startPos;
InvRect.left = simed->leftMargin;
InvRect.top = simed->topMargin;
InvRect.right = pCtrl->cr - pCtrl->cl;
InvRect.bottom = pCtrl->cb - pCtrl->ct;
}
else {
InvRect.left = simed->leftMargin
+ (simed->caretOff - chars)
* simed->charWidth;
InvRect.top = simed->topMargin;
InvRect.right = pCtrl->cr - pCtrl->cl;
InvRect.bottom = pCtrl->cb - pCtrl->ct;
}
SetCaretPos (hWnd,
simed->caretOff * simed->charWidth + simed->leftMargin,
simed->topMargin);
InvalidateRect (hWnd, &InvRect, TRUE);
NotifyParent (hWnd, pCtrl->id, EN_CHANGE);
return 0;
}
case MSG_GETTEXTLENGTH:
simed = (PSIMEDITDATA) (pCtrl->dwAddData2);
return simed->dataEnd;
case MSG_GETTEXT:
{
char* buffer = (char*)lParam;
int len;
simed = (PSIMEDITDATA) (pCtrl->dwAddData2);
len = MIN ((int)wParam, simed->dataEnd);
memcpy (buffer, simed->buffer, len);
buffer [len] = '\0';
return len;
}
case MSG_SETTEXT:
{
int len;
simed = (PSIMEDITDATA) (pCtrl->dwAddData2);
len = strlen ((char*)lParam);
len = MIN (len, simed->bufferLen);
if (simed->hardLimit >= 0)
len = MIN (len, simed->hardLimit);
memcpy (simed->buffer, (char*)lParam, len);
simed->dataEnd = len;
if (simed->editPos > len) {
/* reset caret position */
simed->editPos = 0;
simed->caretOff = 0;
simed->startPos = 0;
if (simed->status & EST_FOCUSED)
SetCaretPos (hWnd, simed->leftMargin, simed->topMargin);
}
InvalidateRect (hWnd, NULL, TRUE);
return 0;
}
case MSG_LBUTTONDBLCLK:
NotifyParent (hWnd, pCtrl->id, EN_DBLCLK);
break;
case MSG_LBUTTONDOWN:
{
int newOff;
simed = (PSIMEDITDATA) (pCtrl->dwAddData2);
newOff = edtGetOffset (simed, LOSWORD (lParam));
if (newOff != simed->caretOff) {
simed->editPos += newOff - simed->caretOff;
simed->caretOff = newOff;
SetCaretPos (hWnd,
simed->caretOff * simed->charWidth
+ simed->leftMargin,
simed->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;
simed = (PSIMEDITDATA) (pCtrl->dwAddData2);
if (line_pos) *line_pos = 0;
if (char_pos) *char_pos = simed->editPos;
return simed->editPos;
}
case EM_SETCARETPOS:
{
int char_pos = (int)lParam;
simed = (PSIMEDITDATA) (pCtrl->dwAddData2);
if (char_pos >= 0 && char_pos <= simed->dataEnd) {
simed->editPos = char_pos;
if (simed->status & EST_FOCUSED)
SetCaretPos (hWnd, simed->caretOff * simed->charWidth
+ simed->leftMargin, simed->topMargin);
return 0;
}
return -1;
}
case EM_SETREADONLY:
if (wParam)
pCtrl->dwStyle |= ES_READONLY;
else
pCtrl->dwStyle &= ~ES_READONLY;
return 0;
case EM_SETPASSWORDCHAR:
simed = (PSIMEDITDATA) (pCtrl->dwAddData2);
if (simed->passwdChar != (char)wParam) {
if (dwStyle & ES_PASSWORD) {
simed->passwdChar = (char)wParam;
InvalidateRect (hWnd, NULL, TRUE);
}
}
return 0;
case EM_GETPASSWORDCHAR:
{
simed = (PSIMEDITDATA) (pCtrl->dwAddData2);
return simed->passwdChar;
}
case EM_LIMITTEXT:
{
int newLimit = (int)wParam;
if (newLimit >= 0) {
simed = (PSIMEDITDATA) (pCtrl->dwAddData2);
if (simed->bufferLen < newLimit)
simed->hardLimit = -1;
else
simed->hardLimit = newLimit;
}
return 0;
}
default:
break;
}
return DefaultControlProc (hWnd, message, wParam, lParam);
}
#endif /* _CTRL_SIMEDIT */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -