超级星光大道踢馆2017:Visual C .NET编程讲座之三(6)

来源:百度文库 编辑:偶看新闻 时间:2024/05/10 09:31:53
Visual C++.NET编程讲座之三(6)
3. 直接控制文本的输出

  图形和文本的绘制需要用到MFC的CDC类,它是一个设备环境类。所谓设备环境,就好比我们写字用的纸那样,显示时指的是屏幕,打印时指的是打印机。实际上,MFC的CDC类还为一些特殊的设备环境提供相应的派生类。例如,CClientDC是一个窗口客户区的设备环境类。

  CDC为我们提供了四个输出文本的函数:TextOut、ExtTextOut、TabbedTextOut和DrawText,分别用于不同的场合。如果想要绘制的文本需要支持Tab符,那么采用TabbedTextOut函数,可以使绘制出来的文本效果更佳;如果要在一个矩形区域内绘制多行文本,那么采用DrawText函数,会更富于效率;如果文本和图形结合紧密,字符间隔不等,并要求有背景颜色或矩形裁剪特性,那么ExtTextOut函数就将是最好的选择。如果没有什么特殊要求,那使用TextOut函数就显得简练了。在本例中,我们使用TabbedTextOut函数来绘制文本,它的函数原型如下:

CSize TabbedTextOut( int x, int y, const CString& str,
int nTabPositions, LPINT lpnTabStopPositions, int nTabOrigin );

  该函数用当前字体在指定位置 (x,y) 处显示一个由str指定的文本,且根据指定的制表停止位设置相应字符位置。函数成功时返回文本的大小。参数中,nTabPositions表示lpnTabStopPositions数组的大小,lpnTabStopPositions表示多个递增的停止位(逻辑坐标)的数组,nTabOrigin表示制表停止位x方向的起始点(逻辑坐标)。

  具体步骤如下:

  (1) 重新创建一个新的单文档应用程序项目Viewer,在向导的"生成的类"页面中将CViewerView的基类CView改成CScrollView。CScrollView类是一个用来提供自动滚动或缩放功能的视图结构。

  (2) 按文档数据的读操作,在CViewerDoc类中,添加保存文档数据的CStringArray类对象m_strContent,并添加相应的操作代码。

  (3) 文本内容的输出代码一般是添加在视图类的OnDraw函数中,但为了调用的方便,我们这里在视图类中添加一个成员函数DispContent。

  (4) 将解决方案管理器窗口切换到"类视图",展开所有的类,右击类名"CViewerView",从弹出的快捷菜单中选择"添加"->"添加函数",弹出"添加成员函数向导"对话框,在"返回类型"框中输入void,在"函数名"框中输入DispContent,在"参数类型"框中输入CDC*,在"参数名"框中输入pDC,然后单击"添加"按钮,结果如图14所示。单击"完成"按钮。


                              图14 添加成员函数DispContent

  (5) 在DispContent函数中添加如图15所示的代码。


                                图15 DispContent函数代码

  SetScrollSizes()是CScrollView类的成员函数,用来设置相应的坐标映射模式和逻辑滚动窗口的大小。所谓"逻辑滚动窗口",是在指定的坐标映射模式下的一个"虚拟窗口"。当虚拟窗口超过视图客户区(可称为"显示窗口")的大小时,视图客户区中就会自动出现滚动条,供用户滚动浏览。若虚拟窗口比显示窗口小,则视图客户区中不会出现滚动条。MM_TEXT是"文本"坐标映射模式。在该模式下,x坐标从左向右递增,y坐标自上而下递增,坐标以像素为单位,这也是MFC的默认坐标模式。

  (6) 在CViewerView::OnDraw函数添加DispContent调用代码,如图16所示的加框部分。OnDraw()是视图类中非常有用的一个函数,当应用程序中的窗口状态或大小发生改变时,系统均会调用此函数重新绘制视图窗口的客户区。因此,我们应该将一些图形绘制添加到此函数中。


                                 图16 DispContent的调用

  (7) 运行程序,打开当前文件夹下的ReadMe.txt文件,结果如图17所示。


                                   图17 文本绘制的结果

  评述:这种方法虽然较复杂一点,但是却能控制每行文本的行距,并可使用CDC类的其他文本和文字处理函数,使得文本表现更具丰富力。另外,由于绘制的代码过程是添加在OnDraw中,因此该方法能使默认的打印和打印预览功能有效。缺点是,显示的速度表现欠佳。

  结束语

  本讲中,通过MFC的文档读过程讨论了文档的读操作及不同的文档数据显示方法和技巧,在下一讲中,我们将通过菜单和工具栏来改变文本显示的字体和颜色,并讨论它们与状态栏这三者之间的相互关系。