📄 newedit.c
字号:
{ PSLEDITDATA pSLEditData = (PSLEDITDATA) (hWnd->userdata2); pSLEditData->selStart = 0; pSLEditData->selEnd = pSLEditData->dataEnd; neInvalidateClient(hWnd);}/* * Hadle WM_TIMER message for selection scrolling */static voidneTimerMessage(HWND hWnd, WPARAM wParam){ PSLEDITDATA pSLEditData = (PSLEDITDATA) (hWnd->userdata2); int lastpos = pSLEditData->editPos; if (wParam == IDTM_SELSCROLLLEFT) { if (pSLEditData->editPos > 0) pSLEditData->editPos--; } else if (wParam == IDTM_SELSCROLLRIGHT) { if (pSLEditData->editPos < pSLEditData->dataEnd) pSLEditData->editPos++; } if (lastpos != pSLEditData->editPos) { neMoveSelection(pSLEditData); if (neRecalcScrollPos(hWnd, NULL, pSLEditData, FALSE)) neInvalidateClient(hWnd); }}/* * Delete the text in the selection */static BOOLneCutSelectedText(HWND hWnd, BOOL bCopyToClipb){ PSLEDITDATA pSLEditData = (PSLEDITDATA) (hWnd->userdata2); int count; if (bCopyToClipb) neCopyToCliboard(hWnd, pSLEditData); if (pSLEditData->selStart < pSLEditData->selEnd) { if (pSLEditData->selStart < 0) pSLEditData->selStart = 0; if (pSLEditData->selEnd > pSLEditData->dataEnd) pSLEditData->selEnd = pSLEditData->dataEnd; count = pSLEditData->selEnd - pSLEditData->selStart; memmove(pSLEditData->buffer + pSLEditData->selStart, pSLEditData->buffer + pSLEditData->selEnd, pSLEditData->dataEnd - pSLEditData->selEnd); pSLEditData->dataEnd -= count; pSLEditData->editPos = pSLEditData->selStart; if (pSLEditData->editPos > pSLEditData->dataEnd) pSLEditData->editPos = pSLEditData->dataEnd; neRecalcScrollPos(hWnd, NULL, pSLEditData, FALSE); neInvalidateClient(hWnd); pSLEditData->selStart = pSLEditData->selEnd = 0; neCheckBufferSize(hWnd, pSLEditData); return TRUE; } return FALSE;}/* * A Control character has been pressed */static intneKeyDown(HWND hWnd, WPARAM wParam, LPARAM lParam){ PSLEDITDATA pSLEditData = (PSLEDITDATA) (hWnd->userdata2); int lastPos = pSLEditData->editPos; RECT InvRect; BOOL bRedraw = FALSE; BOOL onWord = FALSE; DWORD dwStyle = hWnd->style; //DPRINTF( "KEYDOWN: %08X %08X\n", (int)wParam, (int)lParam ); // If key isn't a control key, exit if (!(lParam & (1 << 24)) && (wParam != VK_BACK)) return 0; if (wParam == VK_TAB) { PostMessage(GetParent(hWnd), WM_KEYDOWN, wParam, lParam); return 0; } switch (wParam) { case VK_LEFT: if (pSLEditData->editPos > 0) pSLEditData->editPos--; if ((hWnd->userdata & EST_CTRL) && (pSLEditData->editPos < pSLEditData->dataEnd)) { onWord = neIsWord(pSLEditData->buffer[pSLEditData->editPos]); while ((pSLEditData->editPos > 0) && (neIsWord(pSLEditData->buffer[pSLEditData->editPos]) == onWord)) pSLEditData->editPos--; } if ((hWnd->userdata & EST_SHIFT)) bRedraw = neMoveSelection(pSLEditData); else { bRedraw = (pSLEditData->selStart < pSLEditData->selEnd); pSLEditData->selStart = pSLEditData->selEnd = pSLEditData->editPos; } break; case VK_RIGHT: if (pSLEditData->editPos < pSLEditData->dataEnd) pSLEditData->editPos++; if ((hWnd->userdata & EST_CTRL) && (pSLEditData->editPos < pSLEditData->dataEnd)) { onWord = neIsWord(pSLEditData-> buffer[pSLEditData->editPos]); while ((pSLEditData->editPos < pSLEditData->dataEnd) && (neIsWord (pSLEditData->buffer[pSLEditData->editPos]) == onWord)) pSLEditData->editPos++; } if ((hWnd->userdata & EST_SHIFT)) bRedraw = neMoveSelection(pSLEditData); else { bRedraw = (pSLEditData->selStart < pSLEditData->selEnd); pSLEditData->selStart = pSLEditData->selEnd = pSLEditData->editPos; } break; case VK_UP: case VK_DOWN: if (!(dwStyle & ES_MULTILINE)) break; pSLEditData->epX = pSLEditData->caretX + pSLEditData->scrollX; pSLEditData->epY = (pSLEditData->caretRow + pSLEditData->scrollRow) * pSLEditData->charHeight; if (wParam == VK_UP) { pSLEditData->epY -= pSLEditData->charHeight; if (pSLEditData->epY < 0) { pSLEditData->epY = 0; if (pSLEditData->scrollRow > 0) pSLEditData->scrollRow--; } } else { pSLEditData->epY += pSLEditData->charHeight; } neDrawAllText(hWnd, NULL, pSLEditData, NEDRAW_CALC_EDITPOS); break; case VK_HOME: pSLEditData->editPos = 0; if ((hWnd->userdata & EST_SHIFT)) bRedraw = neMoveSelection(pSLEditData); else { bRedraw = (pSLEditData->selStart < pSLEditData->selEnd); pSLEditData->selStart = pSLEditData->selEnd = pSLEditData->editPos; } break; case VK_END: pSLEditData->editPos = pSLEditData->dataEnd; if ((hWnd->userdata & EST_SHIFT)) bRedraw = neMoveSelection(pSLEditData); else { bRedraw = (pSLEditData->selStart < pSLEditData->selEnd); pSLEditData->selStart = pSLEditData->selEnd = pSLEditData->editPos; } break; case VK_BACK: if (neCutSelectedText(hWnd, FALSE)); else if (pSLEditData->editPos > 0) { pSLEditData->editPos--; memmove(pSLEditData->buffer + pSLEditData->editPos, pSLEditData->buffer + pSLEditData->editPos + 1, (pSLEditData->dataEnd - pSLEditData->editPos) * SZEDITCHAR); pSLEditData->dataEnd--; neCheckBufferSize(hWnd, pSLEditData); bRedraw = TRUE; } SendMessage(GetParent(hWnd), WM_COMMAND, (WPARAM) MAKELONG(hWnd->id, EN_CHANGE), (LPARAM) hWnd); break; case VK_DELETE: if (neCutSelectedText (hWnd, ((hWnd->userdata & EST_SHIFT) != 0))); else if (pSLEditData->editPos < pSLEditData->dataEnd) { memmove(pSLEditData->buffer + pSLEditData->editPos, pSLEditData->buffer + pSLEditData->editPos + 1, (pSLEditData->dataEnd - pSLEditData->editPos) * SZEDITCHAR); pSLEditData->dataEnd--; neCheckBufferSize(hWnd, pSLEditData); bRedraw = TRUE; } SendMessage(GetParent(hWnd), WM_COMMAND, (WPARAM) MAKELONG(hWnd->id, EN_CHANGE), (LPARAM) hWnd); break; case VK_INSERT: if ((hWnd->userdata & EST_SHIFT)) neCharPressed(hWnd, -1, -1); else if ((hWnd->userdata & EST_CTRL)) neCopyToCliboard(hWnd, pSLEditData); else { hWnd->userdata ^= EST_REPLACE; if (GetFocus() == hWnd) { DestroyCaret(); if ((hWnd->userdata & EST_REPLACE)) CreateCaret(hWnd, NULL, 3, pSLEditData->charHeight); else CreateCaret(hWnd, NULL, 1, pSLEditData->charHeight); neUpdateCaretPos(hWnd); ShowCaret(hWnd); } } break; case VK_LCONTROL: case VK_RCONTROL: case VK_CONTROL: hWnd->userdata |= EST_CTRL; break; case VK_LSHIFT: case VK_RSHIFT: case VK_SHIFT: if (GetCapture() != hWnd) { hWnd->userdata |= EST_SHIFT; pSLEditData->selCenter = pSLEditData->editPos; } break; } if ((lastPos != pSLEditData->editPos) || bRedraw) { if (neRecalcScrollPos(hWnd, NULL, pSLEditData, FALSE) || bRedraw) { InvRect.left = pSLEditData->leftMargin; InvRect.top = pSLEditData->topMargin; InvRect.right = hWnd->clirect.right - hWnd->clirect.left; InvRect.bottom = hWnd->clirect.bottom - hWnd->clirect.top; InvalidateRect(hWnd, &InvRect, FALSE); } neUpdateCaretPos(hWnd); } return 0;}/* * Key released */static intneKeyUp(HWND hWnd, WPARAM wParam, LPARAM lParam){ // If key isn't a control key, exit if (!(lParam & (1 << 24)) && (wParam != VK_BACK)) return 0; switch (wParam) { case VK_LCONTROL: case VK_RCONTROL: hWnd->userdata &= ~EST_CTRL; break; case VK_LSHIFT: case VK_RSHIFT: case VK_SHIFT: hWnd->userdata &= ~EST_SHIFT; break; } return 0;}/* * A Character has been pressed */static intneCharPressed(HWND hWnd, WPARAM wParam, LPARAM lParam){ EDITCHAR locBuffer[2]; EDITCHAR *charBuffer = locBuffer; int i, chars, inserting; PSLEDITDATA pSLEditData = (PSLEDITDATA) (hWnd->userdata2); DWORD dwStyle = hWnd->style; BOOL isPasting = (((long) wParam == -1) && ((long) lParam == -1)); if (dwStyle & ES_READONLY) return 0; //DPRINTF ( "char: %08X - %08X\n", (int)wParam, (int)lParam ); if ((wParam == 0xD) && (hWnd->userdata & EST_CTRL)) DPRINTF("CTRL+ENTER!!!!!\n"); // check if called for pasting clipboard if (isPasting) { if (neClipboard == NULL) return 0; charBuffer = neClipboard; chars = neClipboardSize; } else { chars = 1; charBuffer[0] = (EDITCHAR) LOWORD(wParam); switch (LOWORD(wParam)) { case 0x00: /* NULL */ case 0x07: /* BEL */ case 0x08: /* BS */ case 0x09: /* HT */ case 0x0A: /* LF */ case 0x0B: /* VT */ case 0x0C: /* FF */ case 0x1B: /* Escape */ return 0; case 0x0D: /* CR */ charBuffer[0] = '\n'; break; } } // If there is a selection, remove it. neCutSelectedText(hWnd, FALSE); if ((hWnd->userdata & EST_REPLACE) && !isPasting) { if (pSLEditData->dataEnd == pSLEditData->editPos) inserting = chars; else inserting = 0; } else inserting = chars; /* check space */ if ((pSLEditData->hardLimit >= 0) && (pSLEditData->dataEnd + inserting > pSLEditData->hardLimit)) { SendMessage(GetParent(hWnd), WM_COMMAND, (WPARAM) MAKELONG(hWnd->id, EN_MAXTEXT), (LPARAM) hWnd); return 0; } // Increase dataEnd and check buffer size if (!neIncDataEnd(pSLEditData, inserting)) { SendMessage(GetParent(hWnd), WM_COMMAND, (WPARAM) MAKELONG(hWnd->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 - 1; i > pSLEditData->editPos - 1; i--) pSLEditData->buffer[i] = pSLEditData->buffer[i - inserting]; } for (i = 0; i < chars; i++) { if (dwStyle & ES_UPPERCASE) pSLEditData->buffer[pSLEditData->editPos + i] = toupper(charBuffer[i]); else if (dwStyle & ES_LOWERCASE) pSLEditData->buffer[pSLEditData->editPos + i] = tolower(charBuffer[i]); else pSLEditData->buffer[pSLEditData->editPos + i] = charBuffer[i]; } pSLEditData->editPos += chars; pSLEditData->selCenter = pSLEditData->editPos; if (neRecalcScrollPos(hWnd, NULL, pSLEditData, TRUE)) neInvalidateClient(hWnd); else neDrawAllText(hWnd, NULL, pSLEditData, NEDRAW_ROW); neUpdateCaretPos(hWnd); SendMessage(GetParent(hWnd), WM_COMMAND, (WPARAM) MAKELONG(hWnd->id, EN_CHANGE), (LPARAM) hWnd); return 0;}/* * WINDOW PROCEDURE */LRESULT CALLBACKSLEditCtrlProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){ HWND pCtrl; DWORD dwStyle; PSLEDITDATA pSLEditData; pCtrl = hWnd; dwStyle = pCtrl->style; switch (message) { case WM_CREATE: neCreate(hWnd); break; case WM_DESTROY: neDestroy(hWnd); break; case WM_SETFONT: neSetFont(hWnd, (HFONT) wParam, (BOOL) LOWORD(lParam)); break; case WM_GETFONT: pSLEditData = (PSLEDITDATA) (pCtrl->userdata2); return (LRESULT) pSLEditData->hFont; case WM_KILLFOCUS: neKillFocus(hWnd); break; case WM_SETFOCUS: neSetFocus(hWnd, wParam, lParam); 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: neNCPaint(hWnd, wParam); break; case WM_PAINT: nePaint(hWnd, wParam, lParam); break; case WM_KEYDOWN: return neKeyDown(hWnd, wParam, lParam); case WM_KEYUP: return neKeyUp(hWnd, wParam, lParam); case WM_CHAR: return neCharPressed(hWnd, wParam, lParam); 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_fromedit (buffer, pSLEditData->buffer, len); GdConvertEncoding(pSLEditData->buffer, MWTF_UC16, len, buffer, mwTextCoding); return strlen(buffer); } case WM_SETTEXT: neSetText(hWnd, (const char *) lParam); break; case WM_LBUTTONDBLCLK: neMouseDblClk(hWnd, wParam, lParam); break; case WM_LBUTTONDOWN: neMouseLButtonDown(hWnd, wParam, lParam); break; case WM_LBUTTONUP: case WM_NCLBUTTONUP: neMouseLButtonUp(hWnd, wParam, lParam); break; case WM_NCMOUSEMOVE: neMouseMove(hWnd, wParam, lParam); break; case WM_TIMER: neTimerMessage(hWnd, wParam); break; case WM_GETDLGCODE: if (!(pCtrl->style & ES_WANTRETURN)) return DLGC_WANTCHARS | DLGC_HASSETSEL | DLGC_WANTARROWS; else return DLGC_WANTALLKEYS | DLGC_HASSETSEL; 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: pSLEditData = (PSLEDITDATA) (pCtrl->userdata2); return pSLEditData->passwdChar; 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;}int WINAPIMwRegisterEditControl(HINSTANCE hInstance){ WNDCLASS wc; wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS | CS_GLOBALCLASS; wc.lpfnWndProc = (WNDPROC) SLEditCtrlProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = NULL; wc.hCursor = 0; /*LoadCursor(NULL, IDC_ARROW); */ wc.hbrBackground = GetStockObject(WHITE_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = "EDIT"; return RegisterClass(&wc);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -