【转】第四章 文本编辑和字处理软件

阅读本文前,我们假设您已经:
      1,知道如何创建一个单文档的App Wizard
      2,知道C++ 类、函数重载等简单知识
      3,知道如何给View类或者Doc文档添加成员变量
      4,会用MFC的IDE调试工具最好,那么本文的程序您可以copy去调试

    

这一节我们主要讲述文本编辑方面的知识,孙鑫老师的视频就是一个简单字处理软件的制作过程,所以我也是按照顺序,叙述此过程。

MFCCEditView 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
,设置定时器。

ViewOnCreate或者其他地方添加

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);
}

简单字处理软件大功告成!

 

    欢迎以任何形式转载本文,只要对您有用
    欢迎给我来信 webbery (at) sohu (dot) com (分别用@,.替换at,dot)

    韦伯主页: http://mail.ustc.edu.cn/~bywang(提供此笔记系列相关源程序下载)
    韦伯Blog: http://webbery.tianyablog.com
参考书目和网站: 
    (1)孙鑫VC++视频
    (2)1-6章主要参考: hbyufan的BLog
    (3)11-20章主要参考: songpeng的Blog

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值