孙鑫VC++视频学习笔记之4:文本编辑和字处理软件

来源:互联网 发布:域名批量查询 编辑:程序博客网 时间:2024/06/03 15:32

转自:http://webbery.tianyablog.com

   阅读本文前,我们假设您已经:
   1,知道如何创建一个单文档的App Wizard
   2,知道C++ 类、函数重载等简单知识
   3,知道如何给View类或者Doc文档添加成员变量
   4,会用MFC的IDE调试工具最好,那么本文的程序您可以copy去调试
  
  
  
  这一节我们主要讲述文本编辑方面的知识,孙鑫老师的视频就是一个简单字处理软件的制作过程,所以我也是按照顺序,叙述此过程。
  
  在MFC中CEditView 和 cRichEditView类已经完成了初步的文字处理。可以让应用程序的View类以CEditView 和 cRichEditView类为基类。下面我们以单文档视图为例
  
  一、 创建插入符。文字在插入符后插入(正如Word中闪烁的光标)
  1, 添加View类的WM_CREATE消息响应函数
  2, 在CXXXView::OnCreate()中添加
  //获得当前文本度量/字体信息
  
  CClientDC dc(this);
  TEXTMETRIC tm;
  dc.GetTextMetrics(&tm);
  //根据当前字体,设置插入符/光标
  CreateSolidCaret(20,100); //**
  ShowCaret();
  
  3, 创建图形插入符
  
  1),为View类添加成员变量m_bmp;
  
  2),把上面的**行用如下语句替换
  
  m_bmp.LoadBitmap(IDB_BITMAP1);
  CreateCaret(&bitmap);
  
  4,
  
  二、 输出文字
  
  在OnDraw函数中添加如下代码
  
  1),简单输出文字
  
  CString str;
  str="维新科学技术培训中心";
  pDC->TextOut(50,50,str);
  
   2),获取文字框大小备用
  
   CSize sz=pDC->GetTextExtent(str);
  
   3),给str重新赋值,以区别于上一个内容。当然,之前需要在String Table中添加IDS_WEIXIN
  
   str.LoadString(IDS_WEIXIN);
  
  pDC->TextOut(0,200,str);
  
  4),添加路径层
  
  当作图的时候,如果想要在整幅图形其中的某个部分和其它部分有所区别,我们可以把这部分图形放到路径层当中,然后指定调用指定互操作模式调用SelectClipPath( int nMode )函数来使路径层和覆盖在其上新绘图剪切区域进行互操作,达到特殊效果。
  pDC->BeginPath();
  pDC->Rectangle(50,50,50+sz.cx,50+sz.cy);//路径层的坐标依赖于上面的文字位置
  pDC->EndPath();
  pDC->SelectClipPath(RGN_DIFF);
  
  5),画一些方格,看看路径层的效果。
  for(int i=0;i<300;i+=10)
   {
   pDC->MoveTo(0,i);pDC->LineTo(300,i);
   pDC->MoveTo(i,0);pDC->LineTo(i,300);
  }
  三、 鼠标移动插入符
  
  给View增加两个成员变量:
  
  CString m_strLine用于存储当前输入行的内容;CPoint m_ptOrigin用于保存鼠标移动引起插入符改变时的新行开始位置
  
  在OnLButtonDown函数中添加如下内容
  
  SetCaretPos(point);//设置插入符位置
  
  m_strLine.Empty();
  
  m_ptOrigin=point;//保存此位置
  
  另外,给View添加两个变量
  
  四、 响应键盘输入
  
  键盘响应需要考虑如下内容:
  1, 鼠标点击键盘输入一个字符,显示到键盘上,插入符/光标后移一位。
  2, 回车之后,光标下移一行
  3, 删除/退格键的响应
  
  下面是程序内容:
  1, 给View类添加WM_CHAR消息响应函数
  2, 在OnChar函数中添加如下语句
  CClientDC dc(this);
  CFont font;
  font.CreatePointFont(300,"华文行楷",NULL);
  CFont *pOldFont=dc.SelectObject(&font);
  TEXTMETRIC tm;
  dc.GetTextMetrics(&tm);
  if(0x0d==nChar)//回车键响应程序段
  {
   m_strLine.Empty();
   m_ptOrigin.y+=tm.tmHeight;
  }
  else if(0x08==nChar)
  { //用背景色模拟最后一个字符的消失
   COLORREF clr=dc.SetTextColor(dc.GetBkColor());
   dc.TextOut(m_ptOrigin.x,m_ptOrigin.y,m_strLine);
   m_strLine=m_strLine.Left(m_strLine.GetLength()-1);
   dc.SetTextColor(clr);
  }
  else{
  m_strLine+=nChar;
  }
  CSize sz=dc.GetTextExtent(m_strLine);
  CPoint pt;
  pt.x=m_ptOrigin.x+sz.cx;
  pt.y=m_ptOrigin.y;
  SetCaretPos(pt);
  dc.TextOut(m_ptOrigin.x,m_ptOrigin.y,m_strLine);
  dc.SelectObject(pOldFont);
  
  五、 平滑变色---类似卡拉OK的跟唱文字颜色改变
  
  CDC::TextOut()是一个字母一个字母的输出,达不到平滑效果。
  CDC::DrawText():将文字的输出局限于一个矩形区域,超出矩形区域的文字都被截断。利用这一特点,可每隔些时间增加矩形大小,从而可实现人眼中的平滑效果。
  1,设置定时器。
  在View中OnCreate或者其他地方添加
  SetTimer(1,100,NULL);
  
  2,给View类添加WM_TIMER消息响应函数
  
  3, 给View添加成员变量m_nWidth用于保存颜色随时间流逝变化的起点
  
  4, 在OnTimer中添加如下代码
  m_nWidth+=5;//每次位置增加
  CClientDC dc(this);
  TEXTMETRIC tm;
  dc.GetTextMetrics(&tm);//获取字体属性
  CRect rect(0,200, m_nWidth,200+ tm.tmHeight);
  dc.SetTextColor(RGB(255,0,0));
  CString str;
  str.LoadString(IDS_WEIXIN);
  dc.DrawText(str,rect,DT_LEFT);
  rect.top=150;
  rect.bottom=rect.top+tm.tmHeight;
  dc.DrawText(str,rect,DT_RIGHT);
  CSize sz=dc.GetTextExtent(str);
  if(m_nWidth>sz.cx)
  {
   m_nWidth=0;
   dc.SetTextColor(RGB(0,255,0));
   dc.TextOut(0,200,str);
  }
  简单字处理软件大功告成!

原创粉丝点击