📄 medit.c
字号:
for (i = 0; i < pMLEditData->MaxlinesDisp; i++) DrawHDotLine (hdc, pMLEditData->leftMargin, pMLEditData->topMargin + pMLEditData->lineHeight * (i + 1) - 1, RECTW (rcTemp) - pMLEditData->leftMargin - pMLEditData->rightMargin); } if (fGetDC) ReleaseDC (hdc);}static int MLEditCtrlProc (HWND hWnd, int message, WPARAM wParam, LPARAM lParam){ DWORD dwStyle; HDC hdc; PLINEDATA pLineData; PMLEDITDATA pMLEditData = NULL; dwStyle = GetWindowStyle(hWnd); switch (message) { case MSG_CREATE: { if (!(pMLEditData = malloc (sizeof (MLEDITDATA)))) { return -1; } pMLEditData->lineHeight = GetWindowFont (hWnd)->size; if (dwStyle & ES_BASELINE) pMLEditData->lineHeight += 2; if (!CreateCaret (hWnd, NULL, 1, pMLEditData->lineHeight)) { free (pMLEditData); return -1; } pMLEditData->status = 0; pMLEditData->curtotalLen = 0; pMLEditData->totalLimit = 100*LEN_MLEDIT_BUFFER; pMLEditData->lineLimit = LEN_MLEDIT_BUFFER; pMLEditData->editLine = 0; pMLEditData->veditPos = 0; pMLEditData->dispPos = 0; pMLEditData->vdispPos = 0; pMLEditData->MaxlinesDisp = 0; pMLEditData->linesDisp = 0; pMLEditData->StartlineDisp = 0; pMLEditData->EndlineDisp = 0; MLEditInitBuffer (hWnd, pMLEditData, GetWindowCaption(hWnd), dwStyle); #if 0 pMLEditData->selStartPos = 0; pMLEditData->selEndPos = 0;#endif pMLEditData->passwdChar = '*'; pMLEditData->leftMargin = MARGIN_MEDIT_LEFT; pMLEditData->topMargin = MARGIN_MEDIT_TOP; pMLEditData->rightMargin = MARGIN_MEDIT_RIGHT; pMLEditData->bottomMargin = MARGIN_MEDIT_BOTTOM; pMLEditData->pos_chars = (int*)malloc(LEN_MLEDIT_BUFFER*sizeof(int)); pMLEditData->dx_chars = (int*)malloc(LEN_MLEDIT_BUFFER*sizeof(int)); memset (pMLEditData->pos_chars, 0, LEN_MLEDIT_BUFFER*sizeof(int)); memset (pMLEditData->dx_chars , 0, LEN_MLEDIT_BUFFER*sizeof(int)); pMLEditData->fit_chars = 0; pMLEditData->realdispPos = 0; pMLEditData->realStartLine = 0; pMLEditData->realEndLine = 0; pMLEditData->diff = FALSE; pMLEditData->bSCROLL = FALSE; pMLEditData->wraplines = 0; SetWindowAdditionalData2 (hWnd,(DWORD)pMLEditData); break; } case MSG_DESTROY: { pMLEditData =(PMLEDITDATA) GetWindowAdditionalData2(hWnd); DestroyCaret (hWnd); MLEditEmptyBuffer(pMLEditData); free (pMLEditData->pos_chars); free (pMLEditData->dx_chars); pMLEditData->pos_chars = NULL; pMLEditData->dx_chars = NULL; free(pMLEditData); } break; case MSG_SIZECHANGED: { RECT* clientRect = (RECT*)lParam; pMLEditData =(PMLEDITDATA) GetWindowAdditionalData2(hWnd); pMLEditData->MaxlinesDisp = (RECTHP(clientRect) - pMLEditData->topMargin - pMLEditData->bottomMargin) / pMLEditData->lineHeight; if (pMLEditData->MaxlinesDisp < 0) pMLEditData->MaxlinesDisp = 0; if (dwStyle & ES_AUTOWRAP && pMLEditData->head) { PLINEDATA pLineData = pMLEditData->head; pMLEditData->wraplines = 0; for (; pLineData; pLineData = pLineData->next) { calcLineInfo (hWnd, pMLEditData, pLineData); pMLEditData->wraplines += pLineData->nwrapline; } } if (dwStyle & ES_AUTOWRAP) pMLEditData->linesDisp = MIN (pMLEditData->MaxlinesDisp, pMLEditData->wraplines); else pMLEditData->linesDisp = MIN (pMLEditData->MaxlinesDisp, pMLEditData->lines); pMLEditData->StartlineDisp = 0; pMLEditData->EndlineDisp = pMLEditData->StartlineDisp + pMLEditData->linesDisp - 1; pMLEditData->editLine = 0; pMLEditData->dispPos = 0; edtSetScrollInfo (hWnd, pMLEditData, TRUE); } break; case MSG_FONTCHANGED: { pMLEditData =(PMLEDITDATA) GetWindowAdditionalData2(hWnd); pMLEditData->vdispPos = 0; pMLEditData->veditPos = 0; edtSetCaretPos (hWnd); edtSetScrollInfo (hWnd, pMLEditData, TRUE); InvalidateRect (hWnd, NULL, TRUE); return 0; } case MSG_SETCURSOR: if (dwStyle & WS_DISABLED) { SetCursor (GetSystemCursor (IDC_ARROW)); return 0; } break; case MSG_KILLFOCUS: { pMLEditData = (PMLEDITDATA) GetWindowAdditionalData2 (hWnd); pMLEditData->status &= ~EST_FOCUSED; HideCaret (hWnd); NotifyParent (hWnd, GetDlgCtrlID(hWnd), EN_KILLFOCUS); } break; case MSG_SETFOCUS: { pMLEditData = (PMLEDITDATA) GetWindowAdditionalData2 (hWnd); if (pMLEditData->status & EST_FOCUSED) break; pMLEditData->status |= EST_FOCUSED; /* only implemented for ES_LEFT align format. */ edtSetCaretPos (hWnd); ShowCaret (hWnd); ActiveCaret (hWnd); NotifyParent (hWnd, GetDlgCtrlID(hWnd), EN_SETFOCUS); } break; case MSG_ENABLE: if ( (!(dwStyle & WS_DISABLED) && !wParam) || ((dwStyle & WS_DISABLED) && wParam) ) { if (wParam) ExcludeWindowStyle(hWnd,WS_DISABLED); else IncludeWindowStyle(hWnd,WS_DISABLED); InvalidateRect (hWnd, NULL, TRUE); } return 0; case MSG_ERASEBKGND: { BOOL hidden = HideCaret (hWnd); edtOnEraseBackground (hWnd, dwStyle, (HDC)wParam, (const RECT*)lParam); if (hidden) ShowCaret (hWnd); return 0; } case MSG_PAINT: { int i; char* dispBuffer; RECT rect; pMLEditData =(PMLEDITDATA) GetWindowAdditionalData2(hWnd); hdc = BeginPaint (hWnd); GetClientRect (hWnd, &rect); if (dwStyle & WS_DISABLED) { SetBrushColor (hdc, PIXEL_lightgray); SetBkColor (hdc, PIXEL_lightgray); } else { SetBrushColor (hdc, PIXEL_lightwhite); SetBkColor (hdc, PIXEL_lightwhite); } SetTextColor (hdc, PIXEL_black); rect.left += pMLEditData->leftMargin; rect.top += pMLEditData->topMargin ; rect.right -= pMLEditData->rightMargin; rect.bottom -= pMLEditData->bottomMargin; ClipRectIntersect (hdc, &rect); for (i = pMLEditData->StartlineDisp; i <= pMLEditData->EndlineDisp; i++) { int y, line=i, wrapline=0; if (dwStyle & ES_AUTOWRAP) edtGetLineNums (pMLEditData, i, &line, &wrapline); pLineData= GetLineData(pMLEditData, line); if (pLineData == NULL) break; edtGetLineInfo (hWnd, pLineData); if (dwStyle & ES_AUTOWRAP) { if (pMLEditData->fit_chars == 0 && pMLEditData->EndlineDisp >= pMLEditData->wraplines) { //FIXME continue; } } else { if (pMLEditData->fit_chars == 0 && pMLEditData->EndlineDisp >= pMLEditData->lines) { //FIXME continue; } } dispBuffer = alloca (LEN_MLEDIT_BUFFER+1); if (dwStyle & ES_PASSWORD) memset (dispBuffer, pMLEditData->passwdChar, pLineData->dataEnd); memcpy (dispBuffer, pLineData->buffer, pLineData->dataEnd); dispBuffer[pLineData->dataEnd] = '\0'; y = pMLEditData->lineHeight* (i - pMLEditData->StartlineDisp) + pMLEditData->topMargin; //fprint (stderr, "textOut-buffer = %s\n", dispBuffer+pLineData->wrapStartPos[wrapline]); if (dwStyle & ES_AUTOWRAP) TextOutLen (hdc, pMLEditData->leftMargin - pMLEditData->dispPos, y, dispBuffer+pMLEditData->pos_chars[pLineData->wrapStartPos[wrapline]], pMLEditData->pos_chars[pLineData->wrapStartPos[wrapline+1]] -pMLEditData->pos_chars[pLineData->wrapStartPos[wrapline]]); else TextOut(hdc, pMLEditData->leftMargin - pMLEditData->dispPos, y, dispBuffer); } EndPaint (hWnd, hdc); } return 0; case MSG_KEYDOWN: { BOOL bChange = FALSE; int i; int line, wrapline; RECT InvRect; int deleted; PLINEDATA temp = NULL; char * tempP = NULL; pMLEditData =(PMLEDITDATA) GetWindowAdditionalData2(hWnd); GetClientRect (hWnd, &InvRect); InvRect.left = pMLEditData->leftMargin - 1; switch (LOWORD (wParam)) { case SCANCODE_ENTER: { if (dwStyle & ES_READONLY) { Ping(); return 0; } edtPosProc (hWnd); if ((pMLEditData->totalLimit >= 0) && ((pMLEditData->curtotalLen + 1) > pMLEditData->totalLimit)) { Ping (); NotifyParent (hWnd, GetDlgCtrlID(hWnd), EN_MAXTEXT); return 0; }else pMLEditData->curtotalLen++; if (dwStyle & ES_AUTOWRAP) { edtGetLineNums (pMLEditData, pMLEditData->editLine, &line, &wrapline); pLineData = GetLineData(pMLEditData, line); }else pLineData = GetLineData(pMLEditData,pMLEditData->editLine); if (dwStyle & ES_AUTOWRAP) { edtGetLineInfo (hWnd, pLineData); if (pMLEditData->veditPos < pMLEditData->fit_chars) tempP = pLineData->buffer + pMLEditData->pos_chars[pMLEditData->veditPos]; temp = pLineData->next; pLineData->next = malloc( sizeof(LINEDATA) ); pLineData->next->previous = pLineData; pLineData->next->next = temp;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -