📄 medit.c
字号:
temp->lineNO--; temp = temp->next; } edtGetLineInfo (hWnd, pLineData); } else if (temp->dataEnd > 0) { leftLen = LEN_MLEDIT_BUFFER - pLineData->dataEnd; memcpy(pLineData->buffer+pLineData->dataEnd,temp->buffer,leftLen); pLineData->dataEnd +=leftLen; pLineData->buffer[pLineData->dataEnd] = '\0'; memcpy(temp->buffer,temp->buffer+leftLen,temp->dataEnd-leftLen); temp->dataEnd -= leftLen; temp->buffer[temp->dataEnd] = '\0'; } calcLineInfo (hWnd, pMLEditData, pLineData); edtGetLineInfo (hWnd, pLineData); pMLEditData->lines--; pMLEditData->wraplines += pLineData->nwrapline; }else { deleted = pMLEditData->pos_chars[pMLEditData->veditPos + 1] - pMLEditData->pos_chars[pMLEditData->veditPos]; pMLEditData->curtotalLen -= deleted; for (i = pMLEditData->pos_chars[pMLEditData->veditPos]; i < pLineData->dataEnd - deleted; i++) pLineData->buffer [i] = pLineData->buffer [i + deleted]; pLineData->dataEnd -= deleted; if (pLineData->dataEnd == 0) { pMLEditData->fit_chars = 0; pMLEditData->pos_chars[0] = 0; pMLEditData->dx_chars[0] = 0; } pLineData->buffer[pLineData->dataEnd] = '\0'; pMLEditData->wraplines -= pLineData->nwrapline; calcLineInfo (hWnd, pMLEditData, pLineData); pMLEditData->wraplines += pLineData->nwrapline; edtGetLineInfo (hWnd, pLineData); if (wrapline == oldnwrapline - 1) InvRect.left = pMLEditData->dx_chars[pMLEditData->veditPos] - pMLEditData->dx_chars[pLineData->wrapStartPos[wrapline]] + pMLEditData->leftMargin - 1; if (oldnwrapline == pLineData->nwrapline) InvRect.bottom = InvRect.top + pMLEditData->lineHeight *(pLineData->nwrapline-wrapline); } pMLEditData->EndlineDisp = MIN (pMLEditData->StartlineDisp + pMLEditData->MaxlinesDisp - 1, pMLEditData->wraplines - 1); pMLEditData->linesDisp = pMLEditData->EndlineDisp - pMLEditData->StartlineDisp + 1; if (wrapline == pLineData->nwrapline /*&& pLineData->nwrapline != 1*/ && pMLEditData->veditPos == pMLEditData->fit_chars) { pMLEditData->editLine--; if (pMLEditData->editLine < pMLEditData->StartlineDisp) { bScroll = TRUE; pMLEditData->StartlineDisp--; pMLEditData->EndlineDisp = MIN (pMLEditData->StartlineDisp + pMLEditData->MaxlinesDisp -1, pMLEditData->EndlineDisp); pMLEditData->linesDisp = pMLEditData->EndlineDisp - pMLEditData->StartlineDisp + 1; } } if (oldnwrapline != pLineData->nwrapline) bScroll = TRUE; edtSetCaretPos (hWnd); //FIXME if (bScroll) { edtSetScrollInfo (hWnd, pMLEditData, TRUE); InvalidateRect (hWnd, &InvRect,TRUE); } if (pMLEditData->bSCROLL) InvalidateRect (hWnd, NULL, TRUE); NotifyParent (hWnd, GetDlgCtrlID(hWnd), EN_CHANGE); return 0; } temp = pLineData->next; if (pMLEditData->veditPos == pMLEditData->fit_chars && temp) { if(pLineData->dataEnd + temp->dataEnd <= LEN_MLEDIT_BUFFER) { pMLEditData->curtotalLen --; memcpy(pLineData->buffer+pLineData->dataEnd,temp->buffer,temp->dataEnd); pLineData->dataEnd += temp->dataEnd; pLineData->buffer[pLineData->dataEnd] = '\0'; if(temp->next) { pLineData->next = temp->next; temp->next->previous = pLineData; } else pLineData->next = NULL; free(temp); temp = pLineData->next; while (temp) { temp->lineNO--; temp = temp->next; } edtGetLineInfo (hWnd, pLineData); if(pMLEditData->EndlineDisp >= pMLEditData->lines-1) { // added by leon to optimize display if ((pMLEditData->EndlineDisp == pMLEditData->lines -1) && (pMLEditData->StartlineDisp != 0)) { InvRect.bottom = (pMLEditData->editLine - pMLEditData->StartlineDisp + 1) * pMLEditData->lineHeight + pMLEditData->topMargin; }else { InvRect.top = (pMLEditData->editLine - pMLEditData->StartlineDisp) * pMLEditData->lineHeight + pMLEditData->topMargin; } // added by leon to optimize display if(pMLEditData->StartlineDisp !=0) { pMLEditData->StartlineDisp--; pMLEditData->EndlineDisp = MIN ( pMLEditData->lines-1, pMLEditData->StartlineDisp+pMLEditData->MaxlinesDisp -1); } else pMLEditData->EndlineDisp--; pMLEditData->linesDisp = pMLEditData->EndlineDisp - pMLEditData->StartlineDisp+1; } else if (pMLEditData->lines <= pMLEditData->MaxlinesDisp) { pMLEditData->EndlineDisp--; pMLEditData->linesDisp = pMLEditData->EndlineDisp - pMLEditData->StartlineDisp+1; } pMLEditData->lines--; } else if (temp->dataEnd > 0) { leftLen = LEN_MLEDIT_BUFFER - pLineData->dataEnd; memcpy(pLineData->buffer+pLineData->dataEnd,temp->buffer,leftLen); pLineData->dataEnd +=leftLen; pLineData->buffer[pLineData->dataEnd] = '\0'; memcpy(temp->buffer,temp->buffer+leftLen,temp->dataEnd-leftLen); temp->dataEnd -=leftLen; temp->buffer[temp->dataEnd] = '\0'; // added by leon to optimize display InvRect.top = (pMLEditData->editLine - pMLEditData->StartlineDisp) * pMLEditData->lineHeight + pMLEditData->topMargin; // added by leon to optimize display } } else if (pMLEditData->veditPos != pMLEditData->fit_chars) { edtGetLineInfo (hWnd, GetLineData (pMLEditData, pMLEditData->editLine)); deleted = pMLEditData->pos_chars[pMLEditData->veditPos + 1] - pMLEditData->pos_chars[pMLEditData->veditPos]; pMLEditData->curtotalLen -= deleted; for (i = pMLEditData->pos_chars[pMLEditData->veditPos]; i < pLineData->dataEnd - deleted; i++) pLineData->buffer [i] = pLineData->buffer [i + deleted]; pLineData->dataEnd -= deleted; if (pLineData->dataEnd == 0) { pMLEditData->fit_chars = 0; pMLEditData->pos_chars[0] = 0; pMLEditData->dx_chars[0] = 0; } pLineData->buffer[pLineData->dataEnd] = '\0'; // only current line to redraw if (pMLEditData->EndlineDisp <= pMLEditData->lines - 1) { InvRect.left = pMLEditData->dx_chars[pMLEditData->veditPos] - pMLEditData->dx_chars[pMLEditData->vdispPos] + pMLEditData->leftMargin - 1; InvRect.top = (pMLEditData->editLine - pMLEditData->StartlineDisp) * pMLEditData->lineHeight + pMLEditData->topMargin; InvRect.bottom = InvRect.top + pMLEditData->lineHeight * 2; } } else { InvRect.left = InvRect.top = InvRect.right = InvRect.bottom = 0; Ping (); } edtGetLineInfo (hWnd, GetLineData (pMLEditData, pMLEditData->editLine)); pMLEditData->dispPos = pMLEditData->dx_chars[pMLEditData->vdispPos]; edtSetCaretPos (hWnd); InvalidateRect (hWnd, &InvRect,TRUE); edtSetScrollInfo (hWnd, pMLEditData, TRUE); if (pMLEditData->bSCROLL) InvalidateRect (hWnd, NULL, TRUE); NotifyParent (hWnd, GetDlgCtrlID(hWnd), EN_CHANGE); return 0;}static int edtKeyBackspace (HWND hWnd){ DWORD dwStyle = GetWindowStyle(hWnd); PMLEDITDATA pMLEditData =(PMLEDITDATA) GetWindowAdditionalData2(hWnd); PLINEDATA pLineData; PLINEDATA temp; int leftLen,tempEnd; int oldnwrapline; BOOL bScroll = FALSE; RECT InvRect; int deleted, i; int line, wrapline; GetClientRect (hWnd, &InvRect); //InvRect.left = pMLEditData->leftMargin - 1; if (dwStyle & ES_READONLY) { Ping (); return 0; } edtPosProc (hWnd); if (dwStyle & ES_AUTOWRAP) { edtGetLineNums (pMLEditData, pMLEditData->editLine, &line, &wrapline); pLineData = GetLineData(pMLEditData, line); } else pLineData = GetLineData(pMLEditData, pMLEditData->editLine); edtGetLineInfo (hWnd,pLineData); temp = pLineData->previous; if (!temp && !(pMLEditData->veditPos)) return 0; if (dwStyle & ES_AUTOWRAP) { oldnwrapline = pLineData->nwrapline;/*-----------------------------*/ if (pMLEditData->veditPos == 0 && temp) { pMLEditData->wraplines -= pLineData->nwrapline + temp->nwrapline; pMLEditData->curtotalLen --; tempEnd = temp->dataEnd; edtGetLineInfo (hWnd, temp); if(pLineData->dataEnd + temp->dataEnd <= LEN_MLEDIT_BUFFER) { pMLEditData->veditPos = pMLEditData->fit_chars; memcpy(temp->buffer+temp->dataEnd,pLineData->buffer,pLineData->dataEnd); temp->dataEnd +=pLineData->dataEnd; temp->buffer[temp->dataEnd] = '\0'; if(pLineData->next) { temp->next = pLineData->next; pLineData->next->previous = temp; } else temp->next = NULL; free(pLineData); pLineData = temp; temp = temp->next; while(temp) { temp->lineNO--; temp = temp->next; } pMLEditData->lines--; if (pMLEditData->editLine == pMLEditData->StartlineDisp) { pMLEditData->StartlineDisp--; bScroll = TRUE; } /*else if ( pMLEditData->EndlineDisp == pMLEditData->wraplines-1) { if( pMLEditData->StartlineDisp != 0) pMLEditData->StartlineDisp--; }*/ calcLineInfo (hWnd, pMLEditData, pLineData); pMLEditData->wraplines += pLineData->nwrapline; pMLEditData->EndlineDisp = MIN (pMLEditData->wraplines - 1, pMLEditData->StartlineDisp + pMLEditData->MaxlinesDisp - 1 ); pMLEditData->linesDisp = pMLEditData->EndlineDisp - pMLEditData->StartlineDisp + 1; pMLEditData->editLine--; } else if (pLineData->dataEnd > 0) { pMLEditData->wraplines -= pLineData->nwrapline + temp->nwrapline; pMLEditData->veditPos = pMLEditData->fit_chars; leftLen = LEN_MLEDIT_BUFFER - temp->dataEnd; memcpy(temp->buffer+temp->dataEnd,pLineData->buffer,leftLen); temp->dataEnd +=leftLen; temp->buffer[temp->dataEnd] = '\0'; memcpy(pLineData->buffer,pLineData->buffer+leftLen,pLineData->dataEnd-leftLen); pLineData->dataEnd -=leftLen; pLineData->buffer[pLineData->dataEnd] = '\0'; pMLEditData->editLine--; calcLineInfo (hWnd, pMLEditData, pLineData); calcLineInfo (hWnd, pMLEditData, temp); pMLEditData->wraplines += pLineData->nwrapline + temp->nwrapline; } InvRect.top = (pMLEditData->editLine - pMLEditData->StartlineDisp) * pMLEditData->lineHeight + pMLEditData->topMargin; } else if (pMLEditData->veditPos != 0 ) {// not the head pMLEditData->wraplines -= pLineData->nwrapline; deleted = pMLEditData->pos_chars[pMLEditData->veditPos] - pMLEditData->pos_chars[pMLEditData->veditPos - 1]; pMLEditData->curtotalLen -= deleted; for (i = pMLEditData->pos_chars[pMLEditData->veditPos]; i < pLineData->dataEnd; i++) pLineData->buffer[i - deleted] = pLineData->buffer[i]; pLineData->dataEnd -= deleted; pMLEditData->veditPos -= 1; pLineData->buffer[pLineData->dataEnd] = '\0'; calcLineInfo (hWnd, pMLEditData, pLineData); InvRect.top = (pMLEditData->editLine - pMLEditData->StartlineDisp) * pMLEditData->lineHeight + pMLEditData->topMargin; if (oldnwrapline == pLineData->nwrapline) { if (wrapline == oldnwrapline - 1) InvRect.left = pMLEditData->dx_chars[pMLEditData->veditPos] - pMLEditData->dx_chars[pLineData->wrapStartPos[wrapline]] + pMLEditData->leftMargin - 1; InvRect.bottom = InvRect.top + pMLEditData->lineHeight *(pLineData->nwrapline-wrapline); } if ((pMLEditData->veditPos == pLineData->wrapStartPos[wrapline] || pMLEditData->veditPos == pLineData->wrapStartPos[wrapline]-1) && pMLEditData->editLine == pMLEditData->StartlineDisp && oldnwrapline > 1 && wrapline != 0) { pMLEditData->StartlineDisp--; pMLEditData->editLine = pMLEditData->StartlineDisp; bScroll = TRUE; }else if ((pMLEditData->veditPos == pLineData->wrapStartPos[wrapline] || pMLEditData->veditPos == pLineData->wrapStartPos[wrapline]-1) && oldnwrapline > 1 && wrapline != 0) { //FIXME InvRect.top -= pMLEditData->lineHeight; pMLEditData->editLine--; } calcLineInfo (hWnd, pMLEditData, pLineData); pMLEditData->wraplines += pLineData->nwrapline; pMLEditData->EndlineDisp = MIN (pMLEditData->wraplines - 1, pMLEditData->StartlineDisp + pMLEditData->MaxlinesDisp - 1 ); pMLEditData->linesDisp = pMLEditData->EndlineDisp - pMLEditData->StartlineDisp + 1; } else { InvRect.left = InvRect.top = InvRect.right = InvRect.bottom = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -