📄 medit.c
字号:
break; } if (bChange) NotifyParent (hWnd, GetDlgCtrlID(hWnd), EN_CHANGE); return 0; } case MSG_CHAR: { char charBuffer [2]; int i, chars, inserting, oldeditPos; RECT InvRect; // added by leon to optimize display BOOL bScroll = FALSE; pMLEditData = (PMLEDITDATA)GetWindowAdditionalData2(hWnd); GetClientRect (hWnd, &InvRect); oldeditPos = pMLEditData->dx_chars[pMLEditData->veditPos] - pMLEditData->dx_chars[pMLEditData->vdispPos]; pLineData = GetLineData(pMLEditData,pMLEditData->editLine); if (dwStyle & ES_READONLY) { Ping(); return 0; } if (HIBYTE (wParam)) { charBuffer [0] = LOBYTE (wParam); charBuffer [1] = HIBYTE (wParam); chars = 2; } else { charBuffer [0] = LOBYTE (wParam); chars = 1; } if (chars == 1) { 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; } } if (pMLEditData->status & EST_REPLACE) { if (pMLEditData->veditPos == pMLEditData->fit_chars) inserting = chars; else inserting = chars - ( pMLEditData->pos_chars[pMLEditData->veditPos + 1] - pMLEditData->pos_chars[pMLEditData->veditPos] ); } else inserting = chars; // check space if (pLineData->dataEnd + inserting > pMLEditData->totalLen) { Ping (); NotifyParent (hWnd, GetDlgCtrlID(hWnd), EN_MAXTEXT); return 0; } else if ((pMLEditData->hardLimit >= 0) && ((pLineData->dataEnd + inserting) > pMLEditData->hardLimit)) { Ping (); NotifyParent (hWnd, GetDlgCtrlID(hWnd), EN_MAXTEXT); return 0; } if (inserting == -1) { for (i = pMLEditData->pos_chars[pMLEditData->veditPos]; i < pLineData->dataEnd-1; i++) pLineData->buffer [i] = pLineData->buffer [i + 1]; } else if (inserting > 0) { for (i = pLineData->dataEnd + inserting - 1; i > pMLEditData->pos_chars[pMLEditData->veditPos] + inserting - 1; i--) pLineData->buffer [i] = pLineData->buffer [i - inserting]; } for (i = 0; i < chars; i++) pLineData->buffer [pMLEditData->pos_chars[pMLEditData->veditPos] + i] = charBuffer [i]; pMLEditData->veditPos += 1; pLineData->dataEnd += inserting; pLineData->buffer[pLineData->dataEnd] = '\0'; edtGetLineInfo (hWnd, pLineData); //for display if (((pMLEditData->dx_chars[pMLEditData->veditPos] - pMLEditData->dx_chars[pMLEditData->vdispPos]) >= edtGetOutWidth (hWnd)) && (pMLEditData->dx_chars[pMLEditData->veditPos - 1] - pMLEditData->dx_chars[pMLEditData->vdispPos]) < edtGetOutWidth (hWnd)) { bScroll = TRUE; pMLEditData->vdispPos = edtGetNewvPos (hWnd, pLineData, pMLEditData->dx_chars[pMLEditData->veditPos] - edtGetOutWidth (hWnd)*3/4); } edtSetCaretPos (hWnd); // added by leon to optimize display if (!bScroll) { // only current line to redraw InvRect.left = oldeditPos + pMLEditData->leftMargin; InvRect.top = (pMLEditData->editLine - pMLEditData->StartlineDisp) * GetSysCharHeight ()//Mneeded + pMLEditData->topMargin; InvRect.bottom = InvRect.top + GetSysCharHeight (); // added by leon to optimize display } InvalidateRect (hWnd, &InvRect,FALSE);// modified by leon to display //format = DT_NOPREFIX; NotifyParent (hWnd, GetDlgCtrlID(hWnd), EN_CHANGE); // added by leon for scrollbars edtSetScrollInfo (hWnd, pMLEditData, TRUE); // added by leon for scrollbars } return 0; case MSG_GETTEXTLENGTH: { PLINEDATA temp; int textLength = 0; pMLEditData = (PMLEDITDATA)GetWindowAdditionalData2(hWnd); temp = pMLEditData->head; while(temp) { textLength += temp->dataEnd + 1; //The Length of data and \r temp = temp->next; } return --textLength; } case MSG_GETTEXT: { PLINEDATA temp; int len,total = 0,lineNO; char * buffer = (char*)lParam; pMLEditData = (PMLEDITDATA)GetWindowAdditionalData2(hWnd); len = (int)wParam; lineNO = (int)wParam; temp = pMLEditData->head; while (temp && total + temp->dataEnd +1 < len) { if (temp != pMLEditData->head) { buffer[total]='\012'; total++; } memcpy(buffer+total,temp->buffer,temp->dataEnd); total += temp->dataEnd; temp = temp->next; } buffer[total]='\000';//finish flag. } return 0;//can i add it to message define ?/* case MSG_GETLINETEXT: { PLINEDATA temp; char* buffer = (char*)lParam; int lineNO,len; pMLEditData = (PMLEDITDATA)GetWindowAdditionalData2(hWnd); lineNO = (int)wParam; temp = GetLineData(pMLEditData,lineNO); if(temp) { len = min ((int)wParam, temp->dataEnd); memcpy (buffer, temp->buffer,len); buffer [len] = '\0'; return 0; } return -1; } break;*/ case MSG_SETTEXT: { pMLEditData =(PMLEDITDATA)GetWindowAdditionalData2(hWnd);/* add by frankch to empty the buffer */ MLEditEmptyBuffer(pMLEditData);/* add finished */ MLEditInitBuffer(pMLEditData,(char *)lParam); pMLEditData->editPos = 0; pMLEditData->veditPos = 0; pMLEditData->caretPos = 0; pMLEditData->editLine = 0; pMLEditData->dispPos = 0; pMLEditData->vdispPos = 0; edtGetLineInfo (hWnd, GetLineData(pMLEditData, 0)); SetCaretPos (hWnd, pMLEditData->leftMargin,pMLEditData->topMargin); InvalidateRect (hWnd, NULL,FALSE); // added by leon for scrollbars edtSetScrollInfo (hWnd, pMLEditData, TRUE); // added by leon for scrollbars } return 0;//can i add it to message defined?/* case MSG_SETLINETEXT: { int len,lineNO; PLINEDATA temp; if (dwStyle & ES_READONLY) return 0; pMLEditData = (PMLEDITDATA)GetWindowAdditionalData2(hWnd); len = strlen ((char*)lParam); lineNO = (int)wParam; temp = pMLEditData->head; len = min (len, pMLEditData->totalLen); if (pMLEditData->hardLimit >= 0) len = min (len, pMLEditData->hardLimit); while (temp) { if(temp->lineNO == lineNO) { temp->dataEnd = len; memcpy (temp->buffer, (char*)lParam, len); } temp = temp->next; } pMLEditData->editPos = 0; pMLEditData->caretPos = 0; pMLEditData->dispPos = 0; InvalidateRect (hWnd, NULL, FALSE); } return 0;*/ case MSG_LBUTTONDBLCLK: break; case MSG_LBUTTONDOWN: { int newOff, lineNO, olddispPos; BOOL bScroll = FALSE; pMLEditData =(PMLEDITDATA)GetWindowAdditionalData2(hWnd); olddispPos = pMLEditData->dx_chars[pMLEditData->vdispPos]; lineNO = edtGetLineNO (pMLEditData, HIWORD (lParam)); if (lineNO < 0) return 0; lineNO += pMLEditData->StartlineDisp; if (lineNO > pMLEditData->lines - 1) return 0; pMLEditData->editLine = lineNO; newOff = LOWORD (lParam) + olddispPos; bScroll = edtGetCaretValid (hWnd,lineNO, olddispPos, newOff); edtSetCaretPos (hWnd); /* SetCaretPos (hWnd, pMLEditData->dx_chars[pMLEditData->veditPos] - pMLEditData->dx_chars[pMLEditData->vdispPos] + pMLEditData->leftMargin, (pMLEditData->editLine - pMLEditData->StartlineDisp) * GetSysCharHeight()//Mneeded + pMLEditData->topMargin); */ // added by leon to optimize display if (bScroll) InvalidateRect(hWnd,NULL,FALSE); // added by leon to optimize display // added by leon for scrollbars edtSetScrollInfo (hWnd, pMLEditData, TRUE); // added by leon for scrollbars } break; case MSG_LBUTTONUP: break; case MSG_MOUSEMOVE: break; case MSG_GETDLGCODE: return DLGC_WANTCHARS | DLGC_HASSETSEL | DLGC_WANTARROWS; case EM_SETREADONLY: if (wParam) IncludeWindowStyle(hWnd,ES_READONLY); else ExcludeWindowStyle(hWnd,ES_READONLY); return 0; case EM_SETPASSWORDCHAR: pMLEditData = (PMLEDITDATA)GetWindowAdditionalData2(hWnd); if (pMLEditData->passwdChar != (int)wParam) { if (dwStyle & ES_PASSWORD) { pMLEditData->passwdChar = (int)wParam; InvalidateRect (hWnd, NULL, TRUE); } } return 0; case EM_GETPASSWORDCHAR: { int* passwdchar; pMLEditData = (PMLEDITDATA)GetWindowAdditionalData2(hWnd); passwdchar = (int*) lParam; *passwdchar = pMLEditData->passwdChar; } return 0; case EM_LIMITTEXT: { int newLimit = (int)wParam; if (newLimit >= 0) { pMLEditData = (PMLEDITDATA)GetWindowAdditionalData2(hWnd); if (pMLEditData->totalLen < newLimit) pMLEditData->hardLimit = -1; else pMLEditData->hardLimit = newLimit; } } return 0; case MSG_VSCROLL: { int LinesDisp,newTop; RECT rc; int olddispPos; int newOff; GetClientRect (hWnd, &rc); pMLEditData = (PMLEDITDATA)GetWindowAdditionalData2(hWnd); LinesDisp = (rc.bottom - rc.top - pMLEditData->topMargin - pMLEditData->bottomMargin) / GetSysCharHeight (); olddispPos = pMLEditData->dx_chars[pMLEditData->vdispPos]; newOff = pMLEditData->dx_chars[pMLEditData->veditPos]; switch (wParam) { case SB_LINEDOWN: { if (pMLEditData->EndlineDisp == pMLEditData->lines -1) return 0; if (pMLEditData->EndlineDisp < pMLEditData->lines - 1) { pMLEditData->EndlineDisp++; pMLEditData->StartlineDisp++; pMLEditData->editLine++; } } break; case SB_LINEUP: { if (pMLEditData->StartlineDisp == 0) return 0; if (pMLEditData->StartlineDisp > 0) { pMLEditData->StartlineDisp--; pMLEditData->EndlineDisp--; pMLEditData->editLine--; } } break; case SB_PAGEDOWN: { if (pMLEditData->EndlineDisp == pMLEditData->lines -1) return 0; if (pMLEditData->lines - pMLEditData->EndlineDisp > LinesDisp - 1) { pMLEditData->StartlineDisp = pMLEditData->EndlineDisp; pMLEditData->editLine += LinesDisp - 1; pMLEditData->EndlineDisp += LinesDisp -1; }else { pMLEditData->EndlineDisp = pMLEditData->lines - 1; pMLEditData->editLine += (pMLEditData->EndlineDisp - (LinesDisp - 1)) - pMLEditData->StartlineDisp; pMLEditData->StartlineDisp = pMLEditData->EndlineDisp - (LinesDisp - 1); } } break; case SB_PAGEUP: { if (pMLEditData->StartlineDisp == 0) return 0; if (pMLEditData->StartlineDisp > LinesDisp - 1) { pMLEditData->EndlineDisp = pMLEditData->StartlineDisp; pMLEditData->StartlineDisp -= LinesDisp - 1; pMLEditData->editLine -= LinesDisp - 1; }else {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -