📄 medit.c
字号:
else pMLEditData->linesDisp = MIN (lineNO , pMLEditData->MaxlinesDisp); pMLEditData->EndlineDisp = pMLEditData->StartlineDisp + pMLEditData->linesDisp -1;}PLINEDATA GetLineData(PMLEDITDATA pMLEditData,int lineNO){ PLINEDATA pLineData=pMLEditData->head; for (; pLineData; pLineData=pLineData->next) { if(pLineData->lineNO==lineNO) return pLineData; } return NULL;}int GetMaxLen (HWND hWnd, PMLEDITDATA pMLEditData){ int i; PLINEDATA pLineData = pMLEditData->head; i = 0; while (pLineData) { edtGetLineInfo (hWnd, pLineData); if (pMLEditData->sz.cx > i) i = pMLEditData->sz.cx; pLineData = pLineData->next; } return i;}// get the valid unit position in the array // according to the pos // which is relative to the original point of current line (0) static int edtGetNewvPos (HWND hWnd, PLINEDATA pLineData , int pos){ int i = 0; int dist = MAX_IMPOSSIBLE; int newdist = 0; PMLEDITDATA pMLEditData = (PMLEDITDATA) GetWindowAdditionalData2(hWnd); edtGetLineInfo (hWnd, pLineData); if (pos < 0) return -1; if (pos > pMLEditData->sz.cx) return -2; for (i=0; i<pMLEditData->fit_chars + 1; i++) { newdist = pos - pMLEditData->dx_chars[i]; if (newdist > 0 && newdist < dist) dist = newdist; else return i; } return 0;}static void edtSetScrollInfo (HWND hWnd, PMLEDITDATA pMLEditData, BOOL fRedraw){ SCROLLINFO si; PLINEDATA pLineData; RECT rc; int viLn; // Vscroll GetClientRect (hWnd, &rc); viLn = (rc.bottom - rc.top - pMLEditData->topMargin - pMLEditData->bottomMargin) / pMLEditData->lineHeight; si.fMask = SIF_RANGE | SIF_PAGE | SIF_POS; if ((GetWindowStyle(hWnd)) & ES_AUTOWRAP) si.nMax = pMLEditData->wraplines - 1; else si.nMax = pMLEditData->lines - 1; si.nMin = 0; si.nPage = MIN (pMLEditData->EndlineDisp - pMLEditData->StartlineDisp + 1, viLn); si.nPos = pMLEditData->StartlineDisp; if ((si.nMax < viLn) && (!si.nPos)) { si.nMax = 100; si.nMin = 0; si.nPage = 10; si.nPos = 0; SetScrollInfo (hWnd, SB_VERT, &si, fRedraw);// EnableScrollBar (hWnd, SB_VERT, FALSE); } else { SetScrollInfo (hWnd, SB_VERT, &si, fRedraw);// EnableScrollBar (hWnd, SB_VERT, TRUE); } if ((GetWindowStyle(hWnd)) & ES_AUTOWRAP) { EnableScrollBar (hWnd, SB_HORZ, FALSE); return; } // Hscroll pLineData = GetLineData(pMLEditData, pMLEditData->editLine); si.nMax = GetMaxLen(hWnd, pMLEditData) - 1; si.nMin = 0; si.nPage = edtGetOutWidth (hWnd); edtGetLineInfo (hWnd, pLineData); si.nPos = pMLEditData->dispPos; if (si.nMax < si.nPage && (!si.nPos)) { si.nMax = 100; si.nMin = 0; si.nPage = 10; si.nPos = 0; SetScrollInfo (hWnd, SB_HORZ, &si, fRedraw);// EnableScrollBar (hWnd, SB_HORZ, FALSE); } else { SetScrollInfo (hWnd, SB_HORZ, &si, fRedraw);// EnableScrollBar (hWnd, SB_HORZ, TRUE); }}int edtGetLineNums (PMLEDITDATA pMLEditData, int curline, int* line, int* wrapLine){ PLINEDATA pLineData = pMLEditData->head; int startline = 0; if (!curline) { *line = 0; *wrapLine = 0; return 0; } for (; pLineData; pLineData=pLineData->next) { if (startline+pLineData->nwrapline-1 >= curline) { *line = pLineData->lineNO; *wrapLine = curline - startline; return 0; } startline +=pLineData->nwrapline; } return -1;}// to set the Caret to a valid posBOOL edtGetCaretValid (HWND hWnd, int lineNO, int olddispPos, int newOff/*of caret*/){ int line, wrapline; int dist = MAX_IMPOSSIBLE; int i, newdist = 0; PLINEDATA temp; PMLEDITDATA pMLEditData =(PMLEDITDATA) GetWindowAdditionalData2(hWnd); if (GetWindowStyle(hWnd) & ES_AUTOWRAP) { edtGetLineNums (pMLEditData, lineNO, &line, &wrapline); temp = GetLineData (pMLEditData, line); edtGetLineInfo (hWnd, temp); if( newOff >= pMLEditData->dx_chars[temp->wrapStartPos[wrapline+1]] - pMLEditData->dx_chars[temp->wrapStartPos[wrapline]]) { if (wrapline < temp->nwrapline-1) pMLEditData->veditPos = temp->wrapStartPos[wrapline+1]-1; else pMLEditData->veditPos = temp->wrapStartPos[wrapline+1]; }else { newOff += pMLEditData->dx_chars[temp->wrapStartPos[wrapline]]; for (i=temp->wrapStartPos[wrapline]; i<temp->wrapStartPos[wrapline+1]+1; i++) { newdist = newOff - pMLEditData->dx_chars[i]; if (newdist > 0 && newdist < dist) dist = newdist; else { pMLEditData->veditPos =i; return FALSE; } } } }else { temp = GetLineData (pMLEditData, lineNO); edtGetLineInfo (hWnd, temp); if( olddispPos > pMLEditData->sz.cx ) { pMLEditData->veditPos = pMLEditData->fit_chars; pMLEditData->vdispPos = edtGetStartDispPosAtEnd (hWnd, temp); return TRUE; }else { pMLEditData->veditPos = edtGetNewvPos (hWnd, temp, newOff); if (pMLEditData->veditPos == -2) pMLEditData->veditPos = pMLEditData->fit_chars; pMLEditData->vdispPos = edtGetNewvPos (hWnd, temp, olddispPos); if (olddispPos != pMLEditData->dx_chars[pMLEditData->vdispPos]) return TRUE; } } return FALSE;}void edtSetCaretPos (HWND hWnd){ int line = 0, wrapline = 0; PMLEDITDATA pMLEditData =(PMLEDITDATA) GetWindowAdditionalData2(hWnd); PLINEDATA temp; if (GetWindowStyle(hWnd) & ES_AUTOWRAP) { edtGetLineNums (pMLEditData, pMLEditData->editLine, &line, &wrapline); temp = GetLineData (pMLEditData, line); edtGetLineInfo (hWnd, temp); SetCaretPos (hWnd, pMLEditData->dx_chars[pMLEditData->veditPos] - pMLEditData->dx_chars[temp->wrapStartPos[wrapline]] + pMLEditData->leftMargin, (pMLEditData->editLine-pMLEditData->StartlineDisp) * pMLEditData->lineHeight + pMLEditData->topMargin); }else { temp = GetLineData (pMLEditData, pMLEditData->editLine); edtGetLineInfo (hWnd, temp); SetCaretPos (hWnd, pMLEditData->dx_chars[pMLEditData->veditPos] - pMLEditData->dx_chars[pMLEditData->vdispPos] + pMLEditData->leftMargin, (pMLEditData->editLine-pMLEditData->StartlineDisp) * pMLEditData->lineHeight + pMLEditData->topMargin); }}void edtPosProc (HWND hWnd){ int line, wrapline; PMLEDITDATA pMLEditData =(PMLEDITDATA) GetWindowAdditionalData2(hWnd); PLINEDATA pLineData; if (pMLEditData->diff) { pMLEditData->editLine = pMLEditData->realeditLine; pMLEditData->vdispPos = pMLEditData->realdispPos; pMLEditData->dispPos = pMLEditData->dx_chars[pMLEditData->vdispPos]; pMLEditData->StartlineDisp = pMLEditData->realStartLine; pMLEditData->EndlineDisp = pMLEditData->realEndLine; pMLEditData->diff = FALSE; if (GetWindowStyle(hWnd) & ES_AUTOWRAP) { edtGetLineNums (pMLEditData, pMLEditData->editLine, &line, &wrapline); pLineData = GetLineData(pMLEditData, line); }else pLineData= GetLineData(pMLEditData, pMLEditData->editLine); //FIXME edtGetLineInfo (hWnd, pLineData); ActiveCaret (hWnd); pMLEditData->bSCROLL = TRUE; }else pMLEditData->bSCROLL = FALSE;}/* add end*/static int edtOnCreate (HWND hWnd){ PMLEDITDATA pMLEditData = NULL; DWORD dwStyle = GetWindowStyle(hWnd); if (!(pMLEditData = malloc (sizeof (MLEDITDATA)))) { return -1; } SetWindowAdditionalData2 (hWnd,(DWORD)pMLEditData); 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); return 0;}static void edtOnSizeChanged (HWND hWnd, RECT *clientRect){ DWORD dwStyle = GetWindowStyle(hWnd); PMLEDITDATA 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);}static void edtOnPaint (HWND hWnd){ int i; char dispBuffer [LEN_MLEDIT_BUFFER+1]; RECT rect; DWORD dwStyle = GetWindowStyle(hWnd); PMLEDITDATA pMLEditData =(PMLEDITDATA) GetWindowAdditionalData2(hWnd); HDC hdc; PLINEDATA pLineData; hdc = BeginPaint (hWnd); GetClientRect (hWnd, &rect); if (dwStyle & ES_BASELINE) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -