⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 memo.c

📁 MinGUI 可视化程序代码
💻 C
📖 第 1 页 / 共 3 页
字号:
    { 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 + -