📄 mledit.c
字号:
return false; pEditData->iCaretXPos = strlen(pStrDisp); edtReIndexDataAfterDelWrapLine(pEditData, pLineData); }// else{//combine next line// if(pLineData->pNext)// edtCombineAdjLine(pEditData, pLineData);// } } else{ edtReIndexDataAfterDelChar(pEditData, pLineData); } } edtSetVScrollInfo(hWnd, pEditData, true); GetWindowRect(hWnd, &rtInvalid); iWinHeight = rtInvalid.bottom - rtInvalid.top - 1; iWinWidth = rtInvalid.right - rtInvalid.left - 1; rtInvalid.top = 0; rtInvalid.left = 0; rtInvalid.bottom = iWinHeight - 1; rtInvalid.right = iWinWidth - 1; rtInvalid.top = pEditData->iCaretYPos * pEditData->iLineHeight; InvalidateRect(hWnd,&rtInvalid,true); if(bScroll) edtReCalTopLine(hWnd); edtSetEditPos(hWnd); edtCalCaretPos(hWnd,&x,&y); SetCaretPos(hWnd,x,y); NotifyParent(hWnd,EN_CHANGE); return true;}//==================== BackSpace ========================static BOOLedtScanCodeBackSpace( HWND hWnd){ int iStartPos; char pStrDisp[LEN_MLEDIT_LINEBUFFER]; char* pString; int iLineNumber, iLen; int x, y; int iWinHeight, iWinWidth; RECT rtInvalid; PMLEditData pEditData; PLineData pLineData, pPrevLineData; PWindowsTree pWin; pWin = (PWindowsTree)hWnd; BOOL bScroll = false; pEditData = (PMLEditData)(pWin->dwData); if(!pEditData) return false; if(!edtGetCurLineData(pEditData,&pLineData)) return false; //whether at the begin position of a plinedata line if(pEditData->iCaretXPos == 0){ if(pEditData->pEditPos == pLineData->pString){//at pLineData begin positioin //combine with previous line pPrevLineData = pLineData->pPrev; if(!pPrevLineData) return true; if(pEditData->iCaretYPos){ pEditData->iCaretYPos --; } else if(pEditData->iDispPos){ pEditData->iDispPos --; pEditData->pDispPointer = pPrevLineData; bScroll = true; } iLineNumber = pEditData->iDispPos + pEditData->iCaretYPos; if(!edtGetDispString(&pPrevLineData,iLineNumber,pStrDisp)) return false; pEditData->iCaretXPos = strlen(pStrDisp); if(!edtCombineAdjLine(pEditData,pPrevLineData)) return false; } else{ if(pEditData->iCaretYPos){ pEditData->iCaretYPos -- ; } else if(pEditData->iDispPos){ pEditData->iDispPos --; bScroll = true; } iLineNumber = pEditData->iDispPos + pEditData->iCaretYPos; if(!edtGetDispString(&pLineData,iLineNumber,pStrDisp)) return false; pString = pEditData->pEditPos; if(edtIsACCharBeforePos(pString)) iLen = 2; else iLen = 1; pString -= iLen; while(1){ *pString = *(pString+iLen); if(!*(pString+iLen)) break; pString ++; } pEditData->iTotalLen -= iLen; edtReIndexDataAfterDelChar(pEditData, pLineData); pEditData->iCaretXPos = strlen(pStrDisp) - iLen; } } else{//caret not at the begin positon of a line //delete a left character pString = pEditData->pEditPos; if(edtIsACCharBeforePos(pString)) iLen = 2; else iLen = 1; pString -= iLen; while(1){ *pString = *(pString+iLen); if(!*(pString+iLen)) break; pString ++; } pEditData->iTotalLen -= iLen; iLineNumber = pEditData->iDispPos + pEditData->iCaretYPos; if(!edtGetDispString(&pLineData,iLineNumber,pStrDisp)) return false; pEditData->iCaretXPos -= iLen; if(strlen(pStrDisp) == 0){//the deleted character is an only character of this line if(strlen(pLineData->pString) !=0){ if(pEditData->iCaretYPos){ pEditData->iCaretYPos --; } else if(pEditData->iDispPos){ pEditData->iDispPos -= 1; bScroll = true; } iLineNumber = pEditData->iDispPos + pEditData->iCaretYPos; if(!edtGetBoxTopLineInfo(pEditData,&pLineData,&iStartPos)) return false; if(!edtGetDispString(&pLineData,iLineNumber,pStrDisp)) return false; pEditData->iCaretXPos = strlen(pStrDisp); edtReIndexDataAfterDelWrapLine(pEditData, pLineData); } else{//combine next line if(pLineData->pNext) edtCombineAdjLine(pEditData, pLineData); } } else{// strlen(pStrDisp) != 0, edtReIndexDataAfterDelChar(pEditData, pLineData); } } edtSetVScrollInfo(hWnd, pEditData, true); GetWindowRect(hWnd, &rtInvalid); iWinHeight = rtInvalid.bottom - rtInvalid.top - 1; iWinWidth = rtInvalid.right - rtInvalid.left - 1; rtInvalid.top = 0; rtInvalid.left = 0; rtInvalid.bottom = iWinHeight - 1; rtInvalid.right = iWinWidth - 1; rtInvalid.top = pEditData->iCaretYPos * pEditData->iLineHeight; InvalidateRect(hWnd,&rtInvalid,true); if(bScroll) edtReCalTopLine(hWnd); edtSetEditPos(hWnd); edtCalCaretPos(hWnd,&x,&y); SetCaretPos(hWnd,x,y); NotifyParent(hWnd,EN_CHANGE); return true;}//==================== PageUp ========================static BOOLedtScanCodePageUp( HWND hWnd){ PMLEditData pEditData; int x, y; PWindowsTree pWin; pWin = (PWindowsTree)hWnd; BOOL bScroll; bScroll = false; pEditData = (PMLEditData)(pWin->dwData); if(!pEditData) return false; if(pEditData->iDispPos == 0) return true; if(pEditData->iDispPos > pEditData->iDispLines) pEditData->iDispPos -= pEditData->iDispLines; else pEditData->iDispPos = 0; //recalculate caret x position if(!edtReCalCaretXPosNoRef(pEditData, &x)) return false; pEditData->iCaretXPos = x; edtReCalTopLine(hWnd); edtSetVScrollInfo(hWnd, pEditData, true); InvalidateRect(hWnd,NULL,true); edtSetEditPos(hWnd); edtCalCaretPos(hWnd,&x,&y); SetCaretPos(hWnd,x,y); return true;}//==================== PageDown ========================static BOOLedtScanCodePageDown( HWND hWnd){ PMLEditData pEditData; int x, y; PWindowsTree pWin; pWin = (PWindowsTree)hWnd; BOOL bScroll; bScroll = false; pEditData = (PMLEditData)(pWin->dwData); if(!pEditData) return false; if(pEditData->iDispPos + pEditData->iDispLines == pEditData->iTotalLines) return true; if(pEditData->iDispPos + 2* pEditData->iDispLines < pEditData->iTotalLines) pEditData->iDispPos += pEditData->iDispLines; else pEditData->iDispPos = pEditData->iTotalLines - pEditData->iDispLines; //recalculate caret x position if(!edtReCalCaretXPosNoRef(pEditData, &x)) return false; pEditData->iCaretXPos = x; edtReCalTopLine(hWnd); edtSetVScrollInfo(hWnd, pEditData, true); InvalidateRect(hWnd,NULL,true); edtSetEditPos(hWnd); edtCalCaretPos(hWnd,&x,&y); SetCaretPos(hWnd,x,y); return true;}static BOOLedtReIndexDataAfterInsChar( PMLEditData pEditData, PLineData pCurLineData){ PLineData pLineData; int iWrapLines; char* pLine; int iChars, iPos; int iIncrease; pLine = pCurLineData->pString; iChars = 0; iWrapLines = 0; iPos = 0; while(*pLine){ if(edtIsACChar(pLine)){ iChars += 2; if(iChars > pEditData->iDispChars){ pCurLineData->WrapStartPos[iWrapLines] = iPos; iWrapLines ++; iChars = 2; } iPos += 2; pLine += 2; } else { iChars += 1; if(iChars > pEditData->iDispChars){ pCurLineData->WrapStartPos[iWrapLines] = iPos; iWrapLines ++; iChars = 1; } iPos += 1; pLine += 1; } } if(iWrapLines != pCurLineData->iWrapLineNumber){ iIncrease = iWrapLines - pCurLineData->iWrapLineNumber; pCurLineData->iWrapLineNumber = iWrapLines; pLineData = pCurLineData->pNext; while(pLineData){ pLineData->iLineNumber += iIncrease; pLineData = pLineData->pNext; } pEditData->iTotalLines += iIncrease; } return true;}static BOOLedtProChar( HWND hWnd, char* charBuffer, int iChars){ if(edtIsReplace(hWnd)) return edtProCharReplace(hWnd,charBuffer,iChars); else return edtProCharInsert(hWnd,charBuffer,iChars);}static BOOLedtProCharInsert( HWND hWnd, char* charBuffer, int iChars){ RECT rtInvalid; char pString[LEN_MLEDIT_LINEBUFFER]; char pStrDisp[LEN_MLEDIT_LINEBUFFER]; int iLineNumber; int iLen; PMLEditData pEditData; PLineData pLineData; int x, y; int iWinHeight, iWinWidth; PWindowsTree pWin; pWin = (PWindowsTree)hWnd; BOOL bScroll; bScroll = false; pEditData = (PMLEditData)(pWin->dwData); if(!pEditData) return false; if(!edtGetCurLineData(pEditData, &pLineData)) return false; iLineNumber = pEditData->iDispPos + pEditData->iCaretYPos; if(!edtGetDispString(&pLineData, iLineNumber, pStrDisp)) return false; if(strlen(pLineData->pString) + iChars > LEN_MLEDIT_LINEBUFFER){ NotifyParent(hWnd,EN_MAXTEXT); return false; } GetWindowRect(hWnd, &rtInvalid); iWinHeight = rtInvalid.bottom - rtInvalid.top + 1; iWinWidth = rtInvalid.right - rtInvalid.left + 1; rtInvalid.top = 0; rtInvalid.left = 0; rtInvalid.bottom = iWinHeight - 1; rtInvalid.right = iWinWidth - 1; rtInvalid.top = pEditData->iCaretYPos * pEditData->iLineHeight; if(pEditData->iCaretXPos + iChars > pEditData->iDispChars){ //need wrap to next line if(pEditData->iCaretYPos == pEditData->iDispLines - 1){ pEditData->iDispPos ++; pEditData->iCaretXPos = iChars; bScroll = true; } else{ pEditData->iCaretYPos ++; pEditData->iCaretXPos = iChars; } } else{ pEditData->iCaretXPos += iChars; } //at plinedata end ? if(!*pEditData->pEditPos){ iLen = strlen(pLineData->pString); strncat(pLineData->pString, charBuffer, iChars); pLineData->pString[iLen + iChars] = '\0'; } else{//insert into current position strcpy(pString,pEditData->pEditPos); strncpy(pEditData->pEditPos,charBuffer,iChars); *(pEditData->pEditPos + iChars) = '\0'; strcat(pEditData->pEditPos,pString); } pEditData->pEditPos += iChars; pEditData->iTotalLen += iChars; if(!edtReIndexDataAfterInsChar(pEditData, pLineData)) return false; if(bScroll) edtReCalTopLine(hWnd); edtSetVScrollInfo(hWnd, pEditData, true); edtCalCaretPos(hWnd,&x,&y); SetCaretPos(hWnd,x,y); if(bScroll) InvalidateRect(hWnd, NULL, true); else InvalidateRect(hWnd,&rtInvalid,true); NotifyParent(hWnd,EN_CHANGE); return true;}static BOOLedtReplaceChar( char* pString, char* pChars, int iChars, int* pReplaced){ char pBuffer[LEN_MLEDIT_LINEBUFFER]; int iLen; if(!*pString) return false; if(edtIsACChar(pString)) iLen = 2; else iLen = 1; *pReplaced = iLen; strcpy(pBuffer,pString+iLen); strncpy(pString, pChars, iChars); pString[iChars] = '\0'; strcat(pString, pBuffer); pString[iChars + strlen(pBuffer)] = '\0'; return true;}static BOOLedtProCharReplace( HWND hWnd, char* charBuffer, int iChars){ RECT rtInvalid; int iLineNumber; int iLen, iReplaced; PMLEditData pEditData; PLineData pLineData; int x, y; int iWinHeight, iWinWidth; PWindowsTree pWin; pWin = (PWindowsTree)hWnd; BOOL bScroll; bScroll = false; pEditData = (PMLEditData)(pWin->dwData); if(!pEditData) return false; if(!edtGetCurLineData(pEditData, &pLineData)) return false; iLineNumber = pEditData->iDispPos + pEditData->iCaretYPos; GetWindowRect(hWnd, &rtInvalid); iWinHeight = rtInvalid.bottom - rtInvalid.top - 1; iWinWidth = rtInvalid.right - rtInvalid.left - 1; rtInvalid.top = 0; rtInvalid.left = 0; rtInvalid.bottom = iWinHeight - 1; rtInvalid.right = iWinWidth - 1; rtInvalid.top = pEditData->iCaretYPos * pEditData->iLineHeight; if(edtIsCaretAtLineEnd(pEditData)){ if(strlen(pLineData->pString) + iChars > LEN_MLEDIT_LINEBUFFER){ NotifyParent(hWnd,EN_MAXTEXT); return false; } if(!pLineData->pNext){//at the end of total text iLen = strlen(pLineData->pString); strncat(pLineData->pString, charBuffer, iChars); pLineData->pString[iLen + iChars] = '\0'; if(!edtReIndexDataAfterInsChar(pEditData, pLineData)) return false; } else{//not at the end of total text //need wrap to next line? if(pEditData->iCaretXPos + iChars > pEditData->iDispChars){ //is next line empty? pLineData = pLineData->pNext; if(*pLineData->pString){//next line not empty //replace this character if(!edtReplaceChar(pLineData->pString, charBuffer, iChars, &iReplaced)) return false; pEditData->iTotalLen += (iChars - iReplaced); if(iChars > iReplaced){ if(!edtReIndexDataAfterInsChar(pEditData, pLineData)) return false; } else if(iChars < iReplaced){ if(!edtReIndexDataAfterDelChar(pEditData, pLineData)) return false; } } else{//next line is empty strncpy(pLineData->pString, charBuffer, iChars); pLineData->pString[iChars] = '\0'; pEditData->iTotalLen += iChars; } } else{//doesn't need wrap to next line //append to end of this line iLen = strlen(pLineData->pString); strncat(pLineData->pString, charBuffer, iChars); pLineData->pString[iLen + iChars] = '\0'; } } } else{//caret not at line end if(edtIsACChar(pEditData->pEditPos)) iLen = 2; else iLen = 1; if(strlen(pLineData->pString) + iChars - iLen > LEN_MLEDIT_LINEBUFFER){ NotifyParent(hWnd,EN_MAXTEXT); return false; } edtReplaceChar(pEditData->pEditPos, charBuffer, iChars, &iReplaced); if(iChars > iReplaced){ if(!edtReIndexDataAfterInsChar(pEditData, pLineData)) return false; } else if(iChars < iReplaced){ if(!edtReIndexDataAfterDelChar(pEditData, pLineData)) return false; } pEditData->iTotalLen += (iChars - iReplaced); } if(pEditData->iCaretXPos + iChars > pEditData->iDispChars){ //need wrap to next line if(pEditData->iCaretYPos == pEditData->iDispLines - 1){ pEditData->iDispPos ++; pEditData->iCaretXPos = iChars; bScroll = true; } else{ pEditData->iCaretYPos ++; pEditData->iCaretXPos = iChars; } } else{ pEditData->iCaretXPos += iChars; } if(bScroll) edtReCalTopLine(hWnd); edtSetVScrollInfo(hWnd, pEditData, true); edtSetEditPos(hWnd); edtCalCaretPos(hWnd,&x,&y); SetCaretPos(hWnd,x,y); if(bScroll) InvalidateRect(hWnd,NULL,true); else InvalidateRect(hWnd,&rtInvalid,true); NotifyParent(hWnd,EN_CHANGE); return true;}//SCROLLstatic void edtSetVScrollInfo ( HWND hWnd, PMLEditData pEditData, BOOL fRedraw
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -