📄 medit.c
字号:
gdi_tabbedtextout(hdc, pMLEditData->leftMargin - pMLEditData->dx_chars[pMLEditData->vdispPos], GetSysCharHeight()*(pLineData->lineNO - pMLEditData->StartlineDisp) //Mneeded + pMLEditData->topMargin, dispBuffer, pLineData->dataEnd); */ TextOut (hdc, pMLEditData->leftMargin - pMLEditData->dx_chars[pMLEditData->vdispPos], GetSysCharHeight()*(pLineData->lineNO - pMLEditData->StartlineDisp) //Mneeded + pMLEditData->topMargin, dispBuffer); } EndPaint (hWnd, hdc); } break; case MSG_KEYDOWN: { BOOL bChange = FALSE; int i; RECT InvRect; // modified by leon int deleted; PLINEDATA temp = NULL; char * tempP = NULL; pMLEditData =(PMLEDITDATA) GetWindowAdditionalData2(hWnd); GetClientRect (hWnd, &InvRect);// added by leon to optimize display switch (LOWORD (wParam)) { case SCANCODE_ENTER: { pLineData = GetLineData(pMLEditData,pMLEditData->editLine); edtGetLineInfo (hWnd, pLineData); if (pMLEditData->veditPos < pMLEditData->fit_chars) tempP = pLineData->buffer + pMLEditData->pos_chars[pMLEditData->veditPos]; //fprintf (stderr, "temp = %s\n", tempP); //fprintf (stderr, "veditPos= %d\n", pMLEditData->veditPos); //fprintf (stderr, "buffer = %s\n", pLineData->buffer); //fprintf (stderr, "dataEnd = %d\n", pLineData->dataEnd); 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.left = pMLEditData->leftMargin; InvRect.top = (pMLEditData->editLine - pMLEditData->StartlineDisp -1) * GetSysCharHeight()//Mneeded + pMLEditData->topMargin; } }else { if ((pMLEditData->vdispPos == 0) && (pMLEditData->vdispPos == pMLEditData->veditPos)) InvRect.bottom -= GetSysCharHeight(); //Mneeded } // 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++; edtSetCaretPos (hWnd); // added by leon for scrollbars edtSetScrollInfo (hWnd, pMLEditData, TRUE); // added by leon for scrollbars InvalidateRect (hWnd, &InvRect, FALSE); // modified by leon NotifyParent (hWnd, GetDlgCtrlID(hWnd), EN_CHANGE); return 0; } case SCANCODE_HOME: { PLINEDATA temp; if (pMLEditData->veditPos == 0) return 0; pMLEditData->veditPos = 0; edtSetCaretPos (hWnd); temp = GetLineData(pMLEditData,pMLEditData->editLine); if (pMLEditData->vdispPos != 0) { pMLEditData->vdispPos = 0; InvalidateRect (hWnd, NULL, FALSE); } // added by leon for scrollbars edtSetScrollInfo (hWnd, pMLEditData, TRUE); // added by leon for scrollbars return 0; } case SCANCODE_END: { int newStartPos; pLineData = GetLineData(pMLEditData,pMLEditData->editLine); //if (pMLEditData->editPos == pLineData->dataEnd) if (pMLEditData->veditPos == pMLEditData->fit_chars) return 0; newStartPos = edtGetStartDispPosAtEnd (hWnd, pLineData); //pMLEditData->editPos = pLineData->dataEnd; pMLEditData->veditPos = pMLEditData->fit_chars; if (pMLEditData->vdispPos != newStartPos) { pMLEditData->vdispPos = newStartPos; InvalidateRect (hWnd, NULL, FALSE); } edtSetCaretPos (hWnd); // added by leon for scrollbars edtSetScrollInfo (hWnd, pMLEditData, TRUE); // added by leon for scrollbars } return 0; case SCANCODE_CURSORBLOCKLEFT: { BOOL bScroll = FALSE; int newStartPos; PLINEDATA temp; pLineData = GetLineData(pMLEditData,pMLEditData->editLine); if (pMLEditData->veditPos == 0 ) { temp = pLineData->previous; if(temp && 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 return 0; } 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--; } } edtSetCaretPos (hWnd); if (bScroll) InvalidateRect (hWnd, NULL, FALSE); // added by leon for scrollbars edtSetScrollInfo (hWnd, pMLEditData, TRUE); // added by leon for scrollbars } return 0; case SCANCODE_CURSORBLOCKRIGHT: { BOOL bScroll = FALSE; //int scrollStep, moveStep; PLINEDATA temp; pLineData = GetLineData(pMLEditData,pMLEditData->editLine); if (pMLEditData->veditPos == pMLEditData->fit_chars) { temp = pLineData->next; if (temp && pMLEditData->editLine == pMLEditData->EndlineDisp) { bScroll = TRUE; pMLEditData->StartlineDisp++; pMLEditData->EndlineDisp++; } if(temp) { pMLEditData->editLine++; edtGetLineInfo (hWnd, GetLineData (pMLEditData, pMLEditData->editLine)); pMLEditData->editPos = 0; pMLEditData->veditPos = 0; if(pMLEditData->vdispPos !=0) { pMLEditData->vdispPos = 0; bScroll = TRUE; } } else return 0; } else { // caret is at the end of the display rect 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->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); if (pMLEditData->dx_chars[pMLEditData->vdispPos] + edtGetOutWidth (hWnd) > pMLEditData->sz.cx) pMLEditData->vdispPos = edtGetStartDispPosAtEnd (hWnd, pLineData); /* pMLEditData->veditPos--; if ((pMLEditData->dx_chars[pMLEditData->veditPos] - pMLEditData->dx_chars[pMLEditData->vdispPos] ) >= (pMLEditData->dx_chars[pMLEditData->veditPos + 1] - pMLEditData->dx_chars[pMLEditData->vdispPos + 1] )) pMLEditData->vdispPos++; else pMLEditData->vdispPos += 2; */ }else { pMLEditData->veditPos++; } //pMLEditData->veditPos++; } edtSetCaretPos (hWnd); /* SetCaretPos (hWnd, //pMLEditData->caretPos * GetSysCharWidth () pMLEditData->dx_chars[pMLEditData->veditPos] - pMLEditData->dx_chars[pMLEditData->vdispPos] + pMLEditData->leftMargin, (pMLEditData->editLine - pMLEditData->StartlineDisp) * GetSysCharHeight ()//Mneeded + pMLEditData->topMargin); */ if (bScroll) InvalidateRect (hWnd, NULL, FALSE); // added by leon for scrollbars edtSetScrollInfo (hWnd, pMLEditData, TRUE); // added by leon for scrollbars } return 0; case SCANCODE_CURSORBLOCKUP: { BOOL bScroll = FALSE; int newStartPos, olddispPos, oldeditPos; PLINEDATA temp; //GetClientRect (hWnd, &InvRect); olddispPos = pMLEditData->dx_chars[pMLEditData->vdispPos]; oldeditPos = pMLEditData->dx_chars[pMLEditData->veditPos]; pLineData = GetLineData(pMLEditData,pMLEditData->editLine); temp = pLineData->previous; if(pMLEditData->editLine == 0) return 0; else if (pMLEditData->editLine == pMLEditData->StartlineDisp) { bScroll = TRUE; pMLEditData->StartlineDisp--; pMLEditData->EndlineDisp--; } pMLEditData->editLine--; edtGetLineInfo (hWnd, temp); if( olddispPos > pMLEditData->sz.cx ) { pMLEditData->veditPos = pMLEditData->fit_chars; newStartPos = edtGetStartDispPosAtEnd (hWnd, temp); pMLEditData->vdispPos = newStartPos; bScroll = TRUE; } else { pMLEditData->veditPos = edtGetNewvPos (hWnd, temp, oldeditPos); if (pMLEditData->veditPos == -2) pMLEditData->veditPos = pMLEditData->fit_chars; pMLEditData->vdispPos = edtGetNewvPos (hWnd, temp, olddispPos); if (olddispPos != pMLEditData->dx_chars[pMLEditData->vdispPos]) bScroll = TRUE; } SetCaretPos (hWnd, pMLEditData->dx_chars[pMLEditData->veditPos] - pMLEditData->dx_chars[pMLEditData->vdispPos] + pMLEditData->leftMargin, (pMLEditData->editLine - pMLEditData->StartlineDisp) * GetSysCharHeight() + 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 SCANCODE_CURSORBLOCKDOWN: { BOOL bScroll = FALSE; int newStartPos, olddispPos, oldeditPos; PLINEDATA temp; //GetClientRect (hWnd, &InvRect); oldeditPos = pMLEditData->dx_chars[pMLEditData->veditPos]; olddispPos = pMLEditData->dx_chars[pMLEditData->vdispPos]; pLineData = GetLineData(pMLEditData,pMLEditData->editLine); temp = pLineData->next; if(pMLEditData->editLine == pMLEditData->lines-1) return 0; else if (pMLEditData->editLine == pMLEditData->EndlineDisp) { bScroll = TRUE; pMLEditData->StartlineDisp++; pMLEditData->EndlineDisp++; } pMLEditData->editLine++; edtGetLineInfo (hWnd, temp); if( olddispPos > pMLEditData->sz.cx ) { pMLEditData->veditPos = pMLEditData->fit_chars; newStartPos = edtGetStartDispPosAtEnd (hWnd, temp); pMLEditData->vdispPos = newStartPos; bScroll = TRUE; } else { pMLEditData->veditPos = edtGetNewvPos (hWnd, temp, oldeditPos); if (pMLEditData->veditPos == -2) pMLEditData->veditPos = pMLEditData->fit_chars; pMLEditData->vdispPos = edtGetNewvPos (hWnd, temp, olddispPos); if (olddispPos != pMLEditData->dx_chars[pMLEditData->vdispPos]) bScroll = TRUE; } //edtGetLineInfo (hWnd, GetLineData (pMLEditData, pMLEditData->editLine)); edtSetCaretPos (hWnd); // added by leon to optimize display if (bScroll) InvalidateRect(hWnd,NULL,FALSE);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -