📄 memo.c
字号:
{ if(ch==0)break;
hanzi_mached=false;
if(ch=='\r' || ch=='\n')
{ PenPosX=pEdit->textArea.left;
PenPosY=PenPosY+SYS_FONT_HEIGHT+pEdit->rowspace;
if(ch=='\r' && *(lptext+1)=='\n') lptext++;
linecount++;
}
else
{ if(PenPosX+SYS_FONT_WIDTH>pEdit->textArea.right)
{ PenPosX=pEdit->textArea.left;
PenPosY=PenPosY+SYS_FONT_HEIGHT+pEdit->rowspace;
linecount++;
}
PenPosX=PenPosX+SYS_FONT_WIDTH+pEdit->colspace;
}
}
}
return linecount;
}
void MLEdit_PageScroll(HWND hWnd,int topLine)
{ TMultiEdit *pMLEditData=(TMultiEdit *)WndClsBuf(hWnd);
int newlinepos;
if(topLine!=pMLEditData->pageTopLine && MemoGetLineInfo(pMLEditData,topLine,&newlinepos,NULL,NULL))
{ pMLEditData->pageTopLine=topLine;
pMLEditData->editPos=pMLEditData->startPos=newlinepos;
pMLEditData->caretx=pMLEditData->textArea.left;
pMLEditData->carety=pMLEditData->textArea.top;
SetCaretPos(hWnd, pMLEditData->caretx-1,pMLEditData->carety-CARET_HEIGHT_OVERLAP);
Invalidate(hWnd);
ScrollBar_Synchronize(hWnd,topLine);
}
}
void MLEdit_OnCreate(HWND hWnd)
{ int lineperpage;
TMultiEdit *pMLEditData=(TMultiEdit *)WndClsBuf(hWnd);
pMLEditData->bufferLen = LEN_MLEDIT_BUFFER;
pMLEditData->editPos = 0;
pMLEditData->startPos = 0;
pMLEditData->pageTopLine =0;
pMLEditData->colspace = MEDIT_COL_SPACE;
pMLEditData->rowspace = MEDIT_ROW_SPACE;
pMLEditData->textArea.left=MARGIN_EDIT_LEFT;
pMLEditData->textArea.top=MARGIN_EDIT_TOP;
pMLEditData->textArea.right=crWidth(hWnd)-MARGIN_EDIT_RIGHT;
pMLEditData->textArea.bottom=crHeight(hWnd)-MARGIN_EDIT_BOTTOM;
pMLEditData->caretx=pMLEditData->textArea.left;
pMLEditData->carety=pMLEditData->textArea.top;
pMLEditData->caretheight = GetSysCharHeight(hWnd)+CARET_HEIGHT_OVERLAP+CARET_HEIGHT_OVERLAP;
pMLEditData->hardLimit = -1;
pMLEditData->buffer = WndGetText(hWnd);
pMLEditData->dataEnd = strlen (pMLEditData->buffer);
lineperpage=(pMLEditData->textArea.bottom-pMLEditData->textArea.top+pMLEditData->rowspace)/(GetSysCharHeight(hWnd)+pMLEditData->rowspace);
ScrollBar_Initialize(hWnd,pMLEditData->pageTopLine,Memo_GetLineCount(hWnd),lineperpage,1);
}
//-----------------------------------------------------------------------------------------------
void MLEdit_Repaint(HWND hWnd)
{ HDC dc=BeginPaint(hWnd);
TMultiEdit *pMLEditData=(TMultiEdit *)WndClsBuf(hWnd);
char *text=pMLEditData->buffer + pMLEditData->startPos;
if(*text!='\0')
{ if(WndGetAttr(hWnd,WS_DISABLED)) SetColor(dc, CL_DARKGRAY);
else ((TWndCanvas *)dc)->Foreground = WNDPTR(hWnd)->Foreground;
SetColSpace(dc,pMLEditData->colspace);
SetRowSpace(dc,pMLEditData->rowspace);
TextBox(dc,&pMLEditData->textArea,(TPOINT *)&pMLEditData->textArea,text,TB_DRAWTEXT);
}
EndPaint(hWnd);
}
//-----------------------------------------------------------------------------------------------
static void MLEdit_GetChar(HWND hWnd,BYTE LowByte,BYTE HighByte,int KeyDecodeDepth)
{ TPOINT textendpoint;
HDC dc;
int i, chars, inserting,bscroll=false,newline=false,newcaretx,newcarety;
BOOL Enter_SoftToHard=false,OverwriteVisible;
TMultiEdit *pMLEditData= (TMultiEdit *)WndClsBuf(hWnd);
HideCaret(hWnd);
newcaretx=pMLEditData->caretx;
newcarety=pMLEditData->carety;
if(KeyDecodeDepth>1)
{ /*这里改变插入位置到前一个字符*/
if(pMLEditData->caretx<=pMLEditData->textArea.left)return;
pMLEditData->caretx -= (GetSysCharWidth(hWnd)+pMLEditData->colspace);
pMLEditData->editPos--;
}
if (HighByte)
{ chars = 2;
}
else
{ if(LowByte<32 && LowByte!=0x0A) return;
else if(LowByte==0x0A)
{ if(pMLEditData->caretx==pMLEditData->textArea.left && pMLEditData->editPos>=1)
{ BYTE PrevLineBottom=pMLEditData->buffer[pMLEditData->editPos-1];
if(PrevLineBottom!=0x0D && PrevLineBottom!=0x0A)Enter_SoftToHard=true;
}
}
chars = 1;
}
if ((WndGetAttr(hWnd,ES_REPLACE)&& LowByte!=0x0A)|| KeyDecodeDepth>1)
{ if (pMLEditData->dataEnd == pMLEditData->editPos)
{ inserting = chars;
}
else if (EdtIsACCharAtPosition(pMLEditData->buffer, pMLEditData->editPos))
{ inserting = (chars==2)? 0 : -1;
}
else
{ inserting = (chars==2)? 1 : 0;
}
}
else
{ inserting = chars;
}
// check space
if (pMLEditData->dataEnd + inserting > pMLEditData->bufferLen)
{ CMD_NotifyParent(hWnd,EN_MAXTEXT);
return;
}
else if ((pMLEditData->hardLimit >= 0) && ((pMLEditData->dataEnd + inserting) > pMLEditData->hardLimit))
{ CMD_NotifyParent(hWnd,EN_MAXTEXT);
return;
}
if(KeyDecodeDepth<=1) /*非键盘译码状态*/
{ if(LowByte==0x0A)
{ if(!Enter_SoftToHard)
{ newline=true;
newcaretx=pMLEditData->textArea.left;
}
}
else
{ newcaretx += chars*GetSysCharWidth(hWnd);
if (newcaretx > pMLEditData->textArea.right)
{ newcaretx=pMLEditData->textArea.left+chars*GetSysCharWidth(hWnd)+pMLEditData->colspace;
newline=true;
}
else
{ newcaretx += pMLEditData->colspace;
}
}
if(newline)
{ if(newcarety+GetSysCharHeight(hWnd)+pMLEditData->rowspace+GetSysCharHeight(hWnd)>pMLEditData->textArea.bottom)
{ bscroll=true;
}
else
{ newcarety += (GetSysCharHeight(hWnd)+pMLEditData->rowspace);
}
}
}
if(!bscroll)
{ OverwriteVisible=(!inserting)&&(pMLEditData->buffer[pMLEditData->editPos]!=0x0D && pMLEditData->buffer[pMLEditData->editPos]!=0x0A);
if(!OverwriteVisible && !Enter_SoftToHard)
{ dc=GetClientDC(hWnd);
SetColSpace(dc,pMLEditData->colspace);
SetRowSpace(dc,pMLEditData->rowspace);
GroupOn(dc);
textendpoint=*(TPOINT *)&pMLEditData->caretx;
TextBox(dc,&pMLEditData->textArea,&textendpoint,pMLEditData->buffer + pMLEditData->editPos,TB_ERASEBKGND|TB_MEASURE);
}
}
if (inserting == -1)
{ for (i = pMLEditData->editPos; i < pMLEditData->dataEnd-1; i++)
{ pMLEditData->buffer [i] = pMLEditData->buffer [i + 1];
}
}
else if (inserting > 0)
{ for (i = pMLEditData->dataEnd + inserting - 1; i > pMLEditData->editPos + inserting - 1; i--)
{ pMLEditData->buffer [i] = pMLEditData->buffer [i - inserting];
}
}
pMLEditData->buffer[pMLEditData->editPos] = LowByte;
if(HighByte)pMLEditData->buffer [pMLEditData->editPos+1] = HighByte;
if(inserting)
{ pMLEditData->dataEnd += inserting;
pMLEditData->buffer [pMLEditData->dataEnd] = '\0';
}
if(!bscroll)
{ if(OverwriteVisible)
{ char dummybottom;
int txtwidth=chars*GetSysCharWidth(hWnd),tx,ty;
dc=GetClientDC(hWnd);
dummybottom=pMLEditData->buffer[pMLEditData->editPos+chars];
pMLEditData->buffer[pMLEditData->editPos+chars]='\0';
GroupOn(dc);
if(newline && newcaretx>pMLEditData->textArea.left)
{ tx=pMLEditData->textArea.left;
ty=newcarety;
}
else
{ tx=pMLEditData->caretx;
ty=pMLEditData->carety;
}
EraseBackground(dc,tx,ty,txtwidth,GetSysCharHeight(hWnd));
TextOut(dc,tx,ty,&pMLEditData->buffer[pMLEditData->editPos]);
pMLEditData->buffer[pMLEditData->editPos+chars]=dummybottom;
GroupOff(dc,tx,ty,txtwidth,GetSysCharHeight(hWnd));
ReleaseDC(dc);
}
else if(!Enter_SoftToHard)
{ TPOINT textendpoint2=*(TPOINT *)&pMLEditData->caretx;
TextBox(dc,&pMLEditData->textArea,&textendpoint2,pMLEditData->buffer + pMLEditData->editPos,TB_DRAWTEXT|TB_MEASURE);
TextBoxGroupOff(dc,&pMLEditData->textArea,(TPOINT *)&pMLEditData->caretx,&textendpoint,&textendpoint2);
ReleaseDC(dc);
}
}
pMLEditData->editPos+=chars;
pMLEditData->caretx=newcaretx;
pMLEditData->carety=newcarety;
if(KeyDecodeDepth<=1)/*非键盘译码状态*/
{ if(bscroll)
{ pMLEditData->pageTopLine++;
MemoGetLineInfo(pMLEditData,pMLEditData->pageTopLine,&pMLEditData->startPos,NULL,NULL);
Invalidate(hWnd);
}
SetCaretPos(hWnd, pMLEditData->caretx-1,pMLEditData->carety-CARET_HEIGHT_OVERLAP);
if(WndGetAttr(hWnd,WS_VSCROLL|WS_BORDER)==(WS_VSCROLL|WS_BORDER))
{ ScrollBar_Synchronize2(hWnd,pMLEditData->pageTopLine,Memo_GetLineCount(hWnd));
}
}
CMD_NotifyParent(hWnd,EN_CHANGED);
}
static void MLEdit_DeleteChars(HWND hWnd,int chars,BOOL bNeedRepaint)
{ TPOINT textendpoint1,textendpoint2;
TMultiEdit *pMLEditData =(TMultiEdit *)WndClsBuf(hWnd);
int i;
HDC dc;
if (WndGetAttr(hWnd,ES_READONLY) || pMLEditData->editPos >= pMLEditData->dataEnd || chars<=0)
{ return;
}
if(bNeedRepaint)
{ HideCaret(hWnd);
dc=GetClientDC(hWnd);
GroupOn(dc);
SetColSpace(dc,pMLEditData->colspace);
SetRowSpace(dc,pMLEditData->rowspace);
textendpoint1=*(TPOINT *)&pMLEditData->caretx;
TextBox(dc,&pMLEditData->textArea,&textendpoint1,pMLEditData->buffer + pMLEditData->editPos,TB_ERASEBKGND|TB_MEASURE);
}
for (i = pMLEditData->editPos; i < pMLEditData->dataEnd; i++)
{ pMLEditData->buffer [i] = pMLEditData->buffer [i+chars];
}
pMLEditData->buffer [pMLEditData->dataEnd - chars]='\0';
pMLEditData->dataEnd -= chars;
if(bNeedRepaint)
{ textendpoint2=*(TPOINT *)&pMLEditData->caretx;
TextBox(dc,&pMLEditData->textArea,&textendpoint2,pMLEditData->buffer + pMLEditData->editPos,TB_DRAWTEXT|TB_MEASURE);
TextBoxGroupOff(dc,&pMLEditData->textArea,(TPOINT *)&pMLEditData->caretx,&textendpoint1,&textendpoint2);
ReleaseDC(dc);
}
CMD_NotifyParent(hWnd,EN_CHANGED);
}
void MLEdit_GetKeyDown(HWND hWnd,UINT Key)
{ TMultiEdit *pMLEditData =(TMultiEdit *)WndClsBuf(hWnd);
switch (Key)
{
case VK_RETURN:
if(WndGetAttr(hWnd,ES_READONLY|ES_WANTRETURN)==ES_WANTRETURN)
{ MLEdit_GetChar(hWnd,0x0A,0,0); /*接受换行符*/
}
return;
case VK_HOME:
if (!WndGetAttr(hWnd,ES_READONLY))
if(pMLEditData->caretx>pMLEditData->textArea.left)
{ int curLineIndex=GetLineIndexByCarret(hWnd,pMLEditData);
MemoGetLineInfo(pMLEditData,curLineIndex,&pMLEditData->editPos,NULL,NULL);
pMLEditData->caretx=pMLEditData->textArea.left;
SetCaretPos(hWnd,pMLEditData->caretx-1,pMLEditData->carety-CARET_HEIGHT_OVERLAP);
}
return;
case VK_END:
if (!WndGetAttr(hWnd,ES_READONLY))
{ int editpos,linewidth,linesize,curLineIndex;
curLineIndex=GetLineIndexByCarret(hWnd,pMLEditData);
MemoGetLineInfo(pMLEditData,curLineIndex,&editpos,&linesize,&linewidth);
editpos+=linesize;
if (pMLEditData->editPos != editpos)
{ pMLEditData->editPos = editpos;
pMLEditData->caretx=pMLEditData->textArea.left+linewidth;
SetCaretPos(hWnd,pMLEditData->caretx-1,pMLEditData->carety-CARET_HEIGHT_OVERLAP);
}
}
return;
case VK_BACK:
if (WndGetAttr(hWnd,ES_READONLY) || pMLEditData->editPos == 0) return;
/*else do case VK_LEFT:*/
case VK_LEFT:
if (!WndGetAttr(hWnd,ES_READONLY))
{ bool bNeedScroll=false;
int chars;
if (pMLEditData->editPos == 0) return;
if(pMLEditData->caretx>pMLEditData->textArea.left)
{ chars=(EdtIsACCharBeforePosition(pMLEditData->buffer, pMLEditData->editPos))?2:1;
pMLEditData->editPos-=chars;
pMLEditData->caretx-=(chars*GetSysCharWidth(hWnd)+pMLEditData->colspace);
}
else
{ int linehead,linesize,linewidth,curLineIndex;
curLineIndex=GetLineIndexByCarret(hWnd,pMLEditData);
if(pMLEditData->carety>pMLEditData->textArea.top)
{ pMLEditData->carety-=(GetSysCharHeight(hWnd)+pMLEditData->rowspace);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -