第四天 资源和编译
第五天 基本事件处理 用户在视窗中的任何一个操作,都会引起Windows自动发送一个消息给该视窗。我们以一个例子来说明:比如我们在视窗中按下鼠标左键,Windows就会发送ON_LBUTTONDOWN消息给视窗,那么在视窗类中就必须包含下面的成员函数: Void CmyView::OnLButtonDown(UINT nFlags, Cpoint point) { //event processing code here } 在类头文件中也要包含相应的函数声明: afx_msg void OnLButtonDown(UINT nFlags, Cpoint point) 在代码文件中还要有一个消息映射宏,用于将OnLButtonDown函数和应用程序框架联系在一起: BEGIN_MESSAGE_MAP(CmyView, CView) ON_WM_LBUTTONDOWN() // other message map entries END_MESSAGE_MAP 最后,在类库头文件中包含如下语句: DECLARE_MESSAGE_MAP() 以上这些步骤,我们都可以借助于ClassWizard来完成。这就是消息映射的过程。 MFC库对140种windows消息直接提供了消息控制函数,并且我们还可以自己定义自己的消息,下面列出的五种消息是我们应该特别注意的(MSDN上有更详细的内容)。 MFC库中非静态数据成员的名字以m_为前缀。
第六天 映射模式 所谓映射模式,说白了就是坐标系。在默认情况下,Windows所绘图像单位为像素,这是因为设备环境用了默认的映射模式MM_TEXT,所以如下语句所绘图形为长和宽都为200像素的方块: pDC->Rectangle(CRect(0,0,200,200)); 那么我们要绘制一个长和宽都是4厘米的方块该怎么做呢?这就必须改变设备环境的默认映射模式为MM_HIMETRIC,它的图像单位为1/100mm,而不是像素了。它的y轴方向和MM_TEXT的相反,它的向下为递减的,因此用如下语句就可以绘出4×4cm的方块了: pDC->SetMapMode( MM_HIMETRIC); pDC->Rectangle(CRect(0,0,4000,-4000)); 下面我们再来了解一下Windows都提供了哪些映射模式。 1、MM_TEXT映射模式 这种模式下,绘图单位为像素,x轴向右递增,y轴向下递增,我们可以用CDC的SetViewPortOrg和SetWindowOrg函数来改变坐标原点的位置,下面的代码就是把坐标原点设在了(100,100)处,画了一个200×200像素的方块,此时逻辑坐标点(100,100)被映射到了设备坐标点(0,0)处,下一篇的滚动窗口使用的就是这种变换。 Void CmyView::OnDraw( CDC *pDC ){ pDC->SetMapMode(MM_TEXT); pDC->SetWindowOrg(Cpoint(100,100)); pDC->Rectangle(CRect(100,100,200,200)); } 2、固定比例映射模式 Windows提供了一组非常重要的固定比例影视模式,所有这种模式都遵循x轴向右递减,y轴向下递减的规则,而且我们无法将其改变。固定比例模式之间唯一的差别就在于实际的比例因子。下表列出了影视模式和比例因子的对应情况:
MM_TWIPS模式常用于打印机。 3、可变比例映射模式 Windows还提供了两种映射模式MM_ISOTROPIC和MM_ANISOTROPIC,这两种模式允许我们修改比例因子和坐标原点。在MM_ISOTROPIC模式下,纵横比总是1:1,就像改变图像时锁定比例一样,而MM_ANISOTROPIC模式则可以独立的改变x和y的比例因子,即圆可以变成扁圆。 以上就是常见的映射模式,笔者建议:我们没必要死记住这些模式,只是到用的时候会用就可以了,哪怕查查MSDN,这个东东真好! 在设置了映射模式和相应参数之后,我们可以用CDC的LPtoDP函数将逻辑坐标转换为设备坐标,用DptoLP函数将设备坐标转换为逻辑坐标。那么我们什么时候用什么样的坐标呢?有一些规则如下: ① 可以认为CDC的所有成员函数都以逻辑坐标为参数 ② 可以认为CWnd的所有成员函数都以设备坐标为参数 ③ 所有选中测试都应该选用设备坐标,区域的定义应采用设备坐标,某些像CRect::PtInRect之类的函数只有采用设备坐标才能有正确的结果 ④ 将一些长期使用的值用逻辑坐标来保存,如果用设备坐标,那么只要用户对窗口进行一下滚动,坐标就不再有效了 一般情况下,我们在CView的虚函数OnPrepareDC中设置映射模式,应用程序框架在调用OnDraw函数之前调用这个虚函数。
第七天 滚动视窗 CView类并不直接支持窗口滚动,如要实现窗口滚动,就要用到CView的派生类CScrollView类,CScrollView的成员函数能够处理滚动条并发送给视图WM_HSCROLL和WM_VSCROLL消息,从而实现窗口的滚动。 在文档-视图结构中,视图窗口建立以后,框架最先调用OnInitialUpdate虚函数,在框架第一次调用OnDraw函数前也是先调用OnInitialUpdate函数,因此在OnInitialUpdate函数中设置滚动视窗的初始化最合适。 下面我们就来创建一个滚动示例程序a: 1、 用AppWizard创建一个文档-视图程序a,注意在第六步时设置CAView的基类应为CScrollView而不是CView。 2、 在CAView中加入数据成员m_rectEllipse和m_nColor。 3、 修改OnInitialUpdate函数如下: void CAView::OnInitialUpdate() { CScrollView::OnInitialUpdate(); (责任编辑:泉水) |