MFC文本编程

来源:互联网 发布:淘宝网平板电脑大全 编辑:程序博客网 时间:2024/05/29 11:16

       应该说计算机对字符和文字的处理是最多的,在实际应用中也随处可见,比如:将你的资料写入word文档、编写Excel表格、演讲前的PPT制作等等,这些都离不开计算机对文字的处理。在MFC框架中,微软为我们提供了很多关于字符和文字的处理函数,方便我们编写文字处理程序。

插入符

       1.创建文本插入符

       在文本处理程序中,如:notepad工具的编辑窗口都有一条闪烁的竖线,我们称之为“插入符”。MFC中的CWnd类提供了CreateSolidCaret函数方便我们创建一个“插入符”。

CreateSolidCaret(0, 100);ShowCaret();
CreateSolidCaret函数需要传入两个参数,一个是插入符的宽度,一个是插入符的高度。前者根据经验值一般取字符平均长度的八分之一,后者为字符高度。另外,ShowCaret函数表示在当前位置显示插入符。

       2.有关字体的度量信息

       在文本编程中,对当前字体的度量信息的获取很重要,比如在创建一个文本插入符时,需要字符平均宽度值、字符高度,在应用其他的操作时,可能需要最大字符宽度、降序高度或升序高度等,那么这些值我们从何得到?事实上,MFC的CClientDC类为我们提供了GetTextMetrics函数方便我们获得有关字体的度量信息,该函数需要传入一个描述当前字体度量信息的数据结构:TEXTMETRIC,使用该函数过后有关字体的度量信息会自动填充这个数据结构。

        3.创建图形插入符

        图形插入符一般很少用到,但为了体现知识的整体性,我们在这里也顺便说一下吧。与创建文本插入符一样,创建图形插入符也是CreateCaret方法,只不过这次我们需要传入一个CBitmap类:

CBitmap bitmap;bitmap.LoadBitmapW(IDB_BITMAP1);CreateCaret(&bitmap);ShowCaret();bitmap.Detach();
输出字符串

       1.对CString中的字符串直接输出

CString str("VC++ 文本编程");pDC->TextOutW(0, 100, str);
       2.加载字符串资源输出
CString str;str.LoadStringW(IDS_STRINGTEXT);pDC->TextOutW(0, 30, str);
       3.在路径层中将字符串输出
       关于路径层的概念,我还是直接引用百度百科中的内容吧,这里也很容易理解:路径层主要运用于画图当中,其概念就像当年军阀割据时圈地一样,在地域上划定了界线,界线之内是各自的地盘,别人不能侵犯。VC++中利用CDC提供的BeginPath和EndPath这两个函数来实现路径层。BeginPath()其作用是在设备描述表中打开一个路径层;然后利用图形设备接口提供的函数进行绘图操作,例如绘制一些点、椭圆等;最后,绘图操作完成之后,应用程序调用EndPath()这个函数关闭这个路径层。在绘图时,如果希望图的某一部分与其他部分分开处理,就可以利用路径层的独立性,调用SelectClipPath,SelectClipPath函数所需的参数只有一个,但供选择的值有很多,具体可以查看MSDN文档,其中RGN_DIFF模式可以将裁剪区域与路径层相分离。

CString str("VC++ 文本编程");pDC->TextOutW(50, 100, str);CSize sz = pDC->GetTextExtent(str);pDC->BeginPath();pDC->Rectangle(50, 100, 50 + sz.cx, 100 + sz.cy);pDC->EndPath();pDC->SelectClipPath(RGN_DIFF);for(int i = 0; i < 500; i+= 10){pDC->MoveTo(0, i);pDC->LineTo(500, i);pDC->MoveTo(i, 0);pDC->LineTo(i, 500);}

        

4.一个简单的文本处理程序

        文本处理程序的编写是一个很复杂的系统工程,我们在这里只给出了最简单的一些功能。如:输入显示文字、处理回车键进行换行、处理退格键进行删除等。具体思路如下:

  • 首先输入的文字要存储到一个字符串中,这里我们起名为m_strline。
  • 其次,当我们单击鼠标左键时,我们捕获鼠标的位置,将插入符设置到捕获位置,并将位置存储为文字开始输出位置;
  • 第三,当我们输入文字时,处理WM_CHAR消息,如果是回车符,则清空m_strline字符串,输出文字位置的y坐标也要在原基础上加上一个字符高度,并且插入符也要相应的跟着移动。如果是退格键,则获取背景颜色,删掉已经输出的一个字符。如果是普通字符,则将字符加入m_strline进行存储,并在适当位置进行显示。值得注意的是,如果输出的文字是中文字符,要对WM_CHAR的消息处理函数的nChar参数,使用wchar_t进行强转。
具体代码如下:
CClientDC dc(this);CFont font;font.CreatePointFont(200, _T("楷体"), NULL);CFont *pOldFont = dc.SelectObject(&font);TEXTMETRIC tm;dc.GetTextMetrics(&tm);if(0x0d == nChar){m_strLine.Empty();m_ptOrign.y += tm.tmHeight;}else if(0x08 == nChar){COLORREF clr =  dc.SetTextColor(dc.GetBkColor());dc.TextOutW(m_ptOrign.x, m_ptOrign.y, m_strLine);m_strLine = m_strLine.Left(m_strLine.GetLength() - 1);dc.SetTextColor(clr);}else{m_strLine += (wchar_t)nChar;}CSize sz = dc.GetTextExtent(m_strLine);CPoint pt;pt.x = m_ptOrign.x + sz.cx;pt.y = m_ptOrign.y;SetCaretPos(pt);dc.TextOutW(m_ptOrign.x, m_ptOrign.y, m_strLine);dc.SelectObject(pOldFont);

好了,文本编程就到这里了,接下来就靠大家动手开发啦!嘻嘻大笑

0 0
原创粉丝点击