VC++深入详解·chapter11·笔记

来源:互联网 发布:java后端工程师简历 编辑:程序博客网 时间:2024/06/06 06:46

1、当我们为视类手动添加WM_PAINT的消息响应后,其响应函数OnPaint()函数就不会自动去调用OnDraw()函数了,要想继续调用此函数,必须手动添加:OnPrepareDC(&dc); OnDraw(&dc);
2、增加窗口滚动的功能:
    1> 代码添加过程:
        (1)在创建程序时,选择view类的基类为CScrollView类。若程序已经创建,则把view类的.h文件和.cpp文件中的CView全换成 CScrollView
        (2)为view类重载一个虚函数:OnInitialUpdate,并在其中调用函数SetScrollSizes对滚动窗口做一些设置:
         SetScrollSizes(MM_TEXT, CSize(800, 600));//未设置则出现非法操作
   2> 对滚动窗口来说,在初始创建时,需要进行一些设置,包括整个滚动窗口的大小,以及当单击滚动条箭头时滚动条滚动的数值和单击滚动栏时滚动条滚动的数值
   3> SetScrollSizes函数:CScrollSizes的成员函数,作用是设置滚动窗口的大小。应该在视类窗口创建之后再调用此函数。
    4> OnInitialUpdate虚函数(重载):该函数是在窗口完全创建完成之后第一个调用的函数,也就是说,该函数在第一次调用OnDraw函数之前调用。利用次函数的特点可以对窗口进行一些初始化工作。
3、滚动时,窗口错位现象的解释:重绘时,在OnPrepareDC中调用SetViewportOrg函数将视口原点改变了,而因为视口原点的改变而导致图形的错位。
4、滚动时,窗口错位现象的解决:在绘制图形之后,在保存坐标点之前,应该调用OnPrepareDC函数,调整显示上下文的属性:
    OnPrepareDC(&dc);
    dc.DPtoLP(&m_ptOrigin); //将设备点装换为逻辑点
    dc.DPtoLP(&point);
5、保存绘图元素时用CPtrArray保存用new分配的动态元素的地址,不直接保存局部对象。
   eg: CGraph* graph=new CGraph(m_ptOrigin, point, m_nDrawStyle);
          m_ptrArray.Add(graph);
6、多态性原理:子类有的调用子类的,子类没有的调用父类的。
7、CView::OnPaint函数在viewcore中
8、MSDN中输入coordinate spaces,查看座标空间和转换
9、几乎所有GDI函数:(单击鼠标的响应函数)中使用的坐标值都采用的是逻辑坐标。Window必须将逻辑单位转换为设备单位,即像素。这种转换是由映射方式、窗口和视口的原点,以及窗口和视口的范围所控制的。
    Windows对所有非GDI函数和一些GDI函数(如GetDeviceCaps函数):永远使用设备坐标。
10、SetMapMode函数:可以改变映射模式
    SetViewportOrg函数:CDC成员函数,用来改变视口的原点
    SetWindowOrg函数:CDC成员函数,用来改变窗口的原点
    GetViewportOrg函数:CDC成员函数,用来获取视口的原点
    GetViewportOrg函数:CDC成员函数,用来获取视口的原点
11、注:1> 不管对窗口和视口原点如何改变,设备点(0,0)始终是客户区的左上角。
    2> 每次窗口重绘时都会调用OnPrepareDC函数,而OnPrepareDC会随时根据滚动窗口的位置来调整视口的原点。也就是说,视口的原点不是一成不变的,它会随着滚动条的位置不同而变化
    3> 我们在绘图时(eg:画线)使用的都是逻辑坐标,也就是说,我们都是在页面空间,即逻辑空间中进行绘图操作的。但是这些图形实际上都要被映射到设备空间中,因此坐标值必须要呗转换为设备坐标,而这种转换不仅由映射模式,还由窗口原点和视口原点、窗口范围和视口范围来约束。在MM_TEXT映射模式下,因为逻辑坐标单位和设备坐标单位都是像素,所以相对来说转换比较简单,但是这时的转换仍会受到窗口原点和视口原点的影响
12、元文件并没有包含所绘制的图形数据,它包含的是图形的绘制命令。
13、利用兼容设备描述表来完成图形的保存和重绘功能的实现过程,实际上就是利用BitBlt函数通过贴图操作来完成的。
    注意:在调用SelectObject操作将兼容位图选入兼容DC之后,还需要调用BitBlt函数将原始设备描述表的颜色表及像素数据块负值到兼容设备描述表。