📄 medit.c
字号:
SetPenColor (hdc, GetWindowElementColorEx (hWnd, FGC_CONTROL_DEF)); for (i = 0; i < pMLEditData->MaxlinesDisp; i++) DrawHDotLine (hdc, pMLEditData->leftMargin, pMLEditData->topMargin + pMLEditData->lineHeight * (i + 1) - 1, RECTW (rect) - pMLEditData->leftMargin - pMLEditData->rightMargin); } rect.left += pMLEditData->leftMargin; rect.top += pMLEditData->topMargin ; rect.right -= pMLEditData->rightMargin; rect.bottom -= pMLEditData->bottomMargin; ClipRectIntersect (hdc, &rect); if (dwStyle & WS_DISABLED) SetTextColor (hdc, GetWindowElementColorEx (hWnd, FGC_CONTROL_DIS)); else SetTextColor (hdc, GetWindowElementColorEx (hWnd, FGC_CONTROL_DEF)); SetBkMode (hdc, BM_TRANSPARENT); 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; } } 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);}/* ----------------------------------- key process --------------------------------------- */static int edtKeyEnter (HWND hWnd){ DWORD dwStyle = GetWindowStyle(hWnd); PMLEDITDATA pMLEditData =(PMLEDITDATA) GetWindowAdditionalData2(hWnd); PLINEDATA pLineData; int line, wrapline; char * tempP = NULL; PLINEDATA temp = NULL; RECT InvRect; GetClientRect (hWnd, &InvRect); InvRect.left = pMLEditData->leftMargin - 1; 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; if(temp) temp->previous = pLineData->next; temp = pLineData->next; temp->lineNO = line + 1; if(tempP) { memcpy(temp->buffer,tempP,strlen(tempP)); temp->dataEnd = strlen(tempP); } else temp->dataEnd = 0; temp->buffer[temp->dataEnd] = '\0'; pLineData->dataEnd = pMLEditData->pos_chars[pMLEditData->veditPos]; pLineData->buffer[pLineData->dataEnd]='\0'; temp = temp->next; while (temp) { temp->lineNO++; temp = temp->next; } if (!((pMLEditData->veditPos == pLineData->wrapStartPos[wrapline]) && (wrapline))) pMLEditData->editLine++; pMLEditData->wraplines -= pLineData->nwrapline; calcLineInfo (hWnd, pMLEditData, pLineData); calcLineInfo (hWnd, pMLEditData, pLineData->next); edtGetLineInfo (hWnd, pLineData->next); pMLEditData->lines++; pMLEditData->wraplines += pLineData->nwrapline + pLineData->next->nwrapline; pMLEditData->veditPos=0; if (pMLEditData->editLine > pMLEditData->EndlineDisp) { pMLEditData->EndlineDisp = pMLEditData->editLine; if (pMLEditData->EndlineDisp > pMLEditData->StartlineDisp+pMLEditData->MaxlinesDisp-1) { pMLEditData->StartlineDisp = pMLEditData->EndlineDisp -pMLEditData->MaxlinesDisp + 1; }else { InvRect.top = (pMLEditData->editLine - pMLEditData->StartlineDisp -1) * pMLEditData->lineHeight + pMLEditData->topMargin; InvRect.bottom -= pMLEditData->lineHeight; } }else { pMLEditData->EndlineDisp = pMLEditData->StartlineDisp + MIN (pMLEditData->wraplines - pMLEditData->StartlineDisp, pMLEditData->MaxlinesDisp) - 1; } pMLEditData->linesDisp = pMLEditData->EndlineDisp - pMLEditData->StartlineDisp + 1; NotifyParent (hWnd, GetDlgCtrlID(hWnd), EN_CHANGE); InvalidateRect (hWnd, &InvRect, TRUE); edtSetCaretPos (hWnd); edtSetScrollInfo (hWnd, pMLEditData, TRUE); if (pMLEditData->bSCROLL) InvalidateRect (hWnd, NULL, TRUE); return 0; } 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; if(temp) temp->previous = pLineData->next; temp = pLineData->next; temp->lineNO = pMLEditData->editLine + 1; if(tempP) { memcpy(temp->buffer,tempP,strlen(tempP)); temp->dataEnd = strlen(tempP); } else temp->dataEnd = 0; temp->buffer[temp->dataEnd] = '\0'; pLineData->dataEnd = pMLEditData->pos_chars[pMLEditData->veditPos]; pLineData->buffer[pLineData->dataEnd]='\0'; temp = temp->next; while (temp) { temp->lineNO++; temp = temp->next; } // added by leon to optimize display if ((pMLEditData->editLine - pMLEditData->StartlineDisp + 1) < pMLEditData->MaxlinesDisp) { if (!(pMLEditData->dx_chars[pMLEditData->veditPos] - pMLEditData->leftMargin > edtGetOutWidth (hWnd))) { InvRect.top = (pMLEditData->editLine - pMLEditData->StartlineDisp -1) * pMLEditData->lineHeight + pMLEditData->topMargin; } }else { if ((pMLEditData->vdispPos == 0) && (pMLEditData->vdispPos == pMLEditData->veditPos)) InvRect.bottom -= pMLEditData->lineHeight; } // added by leon to optimize display pMLEditData->veditPos = 0; pMLEditData->vdispPos = 0; if(pMLEditData->linesDisp < pMLEditData->MaxlinesDisp) { pMLEditData->EndlineDisp++; pMLEditData->linesDisp++; } else if(pMLEditData->editLine == pMLEditData->EndlineDisp) { pMLEditData->StartlineDisp++; pMLEditData->EndlineDisp++; } pMLEditData->editLine++; edtGetLineInfo (hWnd, GetLineData(pMLEditData,pMLEditData->editLine)); pMLEditData->lines++; pMLEditData->dispPos = 0; pMLEditData->dispPos = pMLEditData->dx_chars[pMLEditData->vdispPos]; edtSetCaretPos (hWnd); edtSetScrollInfo (hWnd, pMLEditData, TRUE); InvalidateRect (hWnd, &InvRect, TRUE); // modified by leon NotifyParent (hWnd, GetDlgCtrlID(hWnd), EN_CHANGE); if (pMLEditData->bSCROLL) InvalidateRect (hWnd, NULL, TRUE); return 0;}static int edtKeyCursorblockLeft (HWND hWnd){ DWORD dwStyle = GetWindowStyle(hWnd); PMLEDITDATA pMLEditData =(PMLEDITDATA) GetWindowAdditionalData2(hWnd); BOOL bScroll = FALSE; int newStartPos, line, wrapline; PLINEDATA temp; PLINEDATA pLineData; edtPosProc (hWnd); if (dwStyle & ES_AUTOWRAP) { edtGetLineNums (pMLEditData, pMLEditData->editLine, &line, &wrapline); pLineData = GetLineData(pMLEditData, line); } else pLineData = GetLineData(pMLEditData,pMLEditData->editLine); if (dwStyle & ES_AUTOWRAP) { if (!pMLEditData->veditPos && !pMLEditData->editLine) return 0; edtGetLineInfo (hWnd, pLineData); if (!pMLEditData->veditPos) { if (pMLEditData->editLine == pMLEditData->StartlineDisp) { bScroll = TRUE; pMLEditData->StartlineDisp--; if (pMLEditData->EndlineDisp >= pMLEditData->MaxlinesDisp) pMLEditData->EndlineDisp--; } pMLEditData->editLine--; temp = pLineData->previous; edtGetLineInfo (hWnd, temp); pMLEditData->veditPos = temp->wrapStartPos[temp->nwrapline]; }else if (pMLEditData->veditPos == pLineData->wrapStartPos[wrapline]) { if (pMLEditData->editLine == pMLEditData->StartlineDisp) { bScroll = TRUE; pMLEditData->StartlineDisp--; if (pMLEditData->EndlineDisp >= pMLEditData->MaxlinesDisp) pMLEditData->EndlineDisp--; } pMLEditData->editLine--; pMLEditData->veditPos--; }else pMLEditData->veditPos--; pMLEditData->linesDisp = pMLEditData->EndlineDisp - pMLEditData->StartlineDisp + 1; edtSetCaretPos (hWnd); if (bScroll) { edtSetScrollInfo (hWnd, pMLEditData, TRUE); InvalidateRect(hWnd,NULL,TRUE); } if (pMLEditData->bSCROLL) InvalidateRect (hWnd, NULL, TRUE); return 0; } if (!pMLEditData->veditPos) { temp = pLineData->previous; if (!temp) return 0; if(pMLEditData->editLine > 0 ) { if (pMLEditData->editLine == pMLEditData->StartlineDisp) { bScroll = TRUE; pMLEditData->StartlineDisp--; if (pMLEditData->EndlineDisp >= pMLEditData->MaxlinesDisp) pMLEditData->EndlineDisp--; } pMLEditData->editLine --; edtGetLineInfo (hWnd, GetLineData (pMLEditData, pMLEditData->editLine)); pMLEditData->veditPos = pMLEditData->fit_chars; newStartPos = edtGetStartDispPosAtEnd (hWnd, temp); if (pMLEditData->vdispPos != newStartPos) { pMLEditData->vdispPos = newStartPos; bScroll = TRUE; } } } else { if (pMLEditData->veditPos == pMLEditData->vdispPos){ pMLEditData->veditPos--; if (edtGetNewvPos (hWnd, GetLineData(pMLEditData,pMLEditData->editLine), pMLEditData->dx_chars[pMLEditData->veditPos] - edtGetOutWidth (hWnd)/4) == -1) pMLEditData->vdispPos = 0; else { pMLEditData->vdispPos = edtGetNewvPos (hWnd, GetLineData(pMLEditData,pMLEditData->editLine), pMLEditData->dx_chars[pMLEditData->veditPos] - edtGetOutWidth (hWnd)/4); } bScroll = TRUE; }else { pMLEditData->veditPos--; } } pMLEditData->dispPos = pMLEditData->dx_chars[pMLEditData->vdispPos]; edtSetCaretPos (hWnd); //FIXME if (bScroll) { edtSetScrollInfo (hWnd, pMLEditData, TRUE); InvalidateRect (hWnd, NULL, TRUE); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -