Afx_msg并没有什么其他用途,它只是用来表明该原型说明是针对消息映射函数而言。
仅改变视窗成员变量OnDraw函数是不会被调用的(除非改变了视窗的大小)。必须调用InvalidateRect函数,它能触发Windows的WM_PAINT消息,该消息又在CView类被映射,以引起对OnDraw的调用。
OnDraw的参数名以注释的形式存在,所以在使用这个指针之前,必须解除这个名称的注释,或用自己的名称代替这个名称。
两种情况可优化Windows的绘制过程。第一,我们必须知道Windows只更新无效矩形内部的象素,所以设置的无效矩形区域越小,重画速度越快。第二,执行在无效矩形外面的绘制指令纯粹浪费时间,OnDraw函数可调用CDC的成员函数GetClipBox得到无效矩形的大小,这样在绘制时就可避免对其外面的对象的绘制。
Windows图形设备界面:实际上并没有把数据写到屏幕上。所有到显示屏的输出都是图形,不管它是直线、圆还是文本。GDI支持在对图形输出编程时不依赖于显示它的硬件。
设备上下文是一种Windows数据结构,它包含的信息允许Windows将输出请求转换成对正在使用的特定物理输出设备的动作。
默认情况下,在每种映射模式中,位于工作区左上角的点的坐标都是(0,0),也可把原点移到其他位置。设备坐标:象素作为绘图单位。设备环境用了默认映射模式MM_TEXT。
如果创建了一个CClientDC对象,则该设备环境的映射区域仅限于客户区域,用户不可能在区域之外绘图。如果创建的是CWindowDC,点(0,0)指的是整个屏幕的左上角,允许用户在显示器的任何地方绘图。视图窗口没有非客户区域,因此CWindowDC更适合于框架窗口,而不是视图窗口。CClientDC派生于CDC,在构造时调用GetDC函数,在析构时调用ReleaseDC函数。工具栏属于框架窗口的客户区。
Windows限制了可用的设备环境数目,如果设备环境对象没有被成功删除的话,程序退出前会有小部分内存丢失。
(1)在消息函数内部创建设备环境对象
最简单的方法是在堆栈中构造对象,它的析构函数在返回时被自动调用。
(2)通过调用CWnd的GetDC成员函数获得设备环境的指针,必须通过调用ReleaseDC函数来释放设备环境。
说明:千万不能删除作为参数以指针形式传递给OnDraw函数的CDC对象,应用程序框架会自动控制它的删除。
WM_CREATE消息
Windows发送给视图的第一个消息。当应用程序框架调用Create函数时该消息就会被发送,此时窗口创建还未完成,窗口还不可见,因此在控制函数OnCreate内部,不能调用那些依赖于窗口处于完全激活状态的Windows函数,可在被重载的OnInitialUpdate函数内调用这些函数。
WM_CLOSE消息
当用户从系统菜单中关闭窗口或父窗口被关闭时,Windows都会发送WM_CLOSE消息。如果在派生视图类中重新定义OnClose消息映射函数,就可完全控制关闭过程。只有在确认关闭窗口是非常安全的情况下,才可调用基类中的OnClose函数,由它来继续处理关闭过程。此时视图对象和相应的窗口仍然处于活动状态。