作者:朱金灿
来源:blog.csdn.net/clever101
在对话框上画图可以通过添加控件来进行,但这种画图有一个严重弊端就是画图范围受控件范围控制。最近做一个程序,需要一个数据报告窗口,因为输出的内容比较多,格式不一致(涉及多个表,但每个表的数据要严格对齐),所以如ListControl等控件并不适合。所以我想到在对话框上创建视图类上进行数据显示。
一是视图窗口如何动态创建。首先是视图窗口的定位。一般的动态创建窗口定位窗口的位置不太容易。我从网上找到的一个好办法在对话框上加一个静态文本控件,然后把视图创建在该控件之上。这个问题想好,创建就基本完成了。
创建的具体步骤如下:
1. 定义一个派生自CScrollView类的视图类CDrawView(至于为什么不是CView而是CScrollView,原因我会在下面谈)。
2. 在对话框类上定义一个CDrawView类指针*m_pDrawView
具体代码如何:
二.前面我已经谈到了在对话框上绘图的一个弊端是绘图范围受控件范围所谓,一不小心就会出界,如下图所示:
使用视图类的好处是你可以使用滚动条扩大绘图范围,这也是我为何将自定义视图类继承CScrollView类的原因。
实际上滚动条的处理也是不太容易的,主要是滚动条添加后如何重绘新的显示范围比较麻烦。为此我重翻petzod的名著《Windows程序设计》的里面一节:建立更好的滚动。将里面的Win API代码改为MFC实现。因为我的程序是输出文字的,我就以如何在文字输出视图窗口创建滚动条。
首先要创建窗口的滚动条,你就必须在动态创建是指定两种窗口风格:WS_VSCROLL|WS_HSCROLL。
其次你需要指定窗口的滚动范围,具体就是滚动的最大高度和宽度。我的做法是在视图类定义两个变量:
int m_iMaxWidth; // 滚动的的最大宽度
int m_MaxNumLines; // 滚动的最大高度
这个你可以自定义滚动范围。
其次你还要定义一些文字大小的相关变量:
int m_cxChar;
int m_cxCaps;
int m_cyChar;
在OnCreate函数()(WM_CREATE消息映射函数)获取字体大小,代码如下:
在OnSize函数(WM_SIZE消息映射函数)设置滚动范围:
分别响应WM_VSCROLL消息和WM_HSCROLL,主要目的是设置滚定信息和决定是否要更新窗口:
然后在OnPaint函数(WM_PAINT消息响应函数)你就可以获取当前绘图范围了:
效果图如下: