1.3.4 绘制窗口
如何在屏幕上随心所欲的进行绘制?应用程序通过响应来自Windows的WM_PAINT消息进行绘制的,此消息通知它更新窗口。
WM_PAINT消息如何发生:窗口位置改变;窗口大小改变;窗口显示部分改变等。
应用程序通过响应WM_PAINT消息绘制其窗口的客户区。在该例程中,WM_PAINT消息由CMainWindow::OnPaint来处理,每一个WM_APINT消息到来时都会调用它。OnPaint的主要工作就是在窗口客户区*位置绘制文本。
绘制文本是通过构造一个名为dc的CPaintDC对象开始的:
CPaintDC dc(this);
CPaintDC
CDC类封装了Windows设备环境,以及包含了绘制到屏幕、打印机和其它设备的几十个成员函数。CPaintDC只在WM_PAINT消息处理程序中使用,它是CDC的一个特殊例子。应用程序在响应WM_PAINT消息绘制之前,必须调用Windows的::BeginPaint API函数来获取一个设备环境,以准备将此设备环境用于绘制;当应用程序完成绘制时,必须调用Windows的::EndPaint来释放设备环境和通知Windows绘制已经完成。如果不能调用::BeginPaint和::EndPaint,消息就不会从消息队列中删除。
创建了CPaintDC对象之后,OnPaint将构造一个代表矩形的CRect对象,并调用CWnd::GetClientRect以使用窗口的客户区的坐标来初始化这个矩形,然后调用CDC::DrawText在客户区显示文本。
1.3.5 消息映射
WM_PAINT消息时如何让CMainWindow::OnPaint的调用?消息映射是将消息和成员函数关联的表。添加消息映射的步骤:
1 通过将DECLARE_MESSAGE_MAP语句添加到类声明中,声明消息映射
2 通过纺织标识消息的宏执行消息映射,响应的类将在对BEGIN_MESSAGE_MAP和END_MESSAGE_MAP的调用之间处理消息
3 添加成员函数来处理消息
BEGIN_MESSAGE_MAP开始消息映射,并标识了消息映射所属的类和该类的基类;END_MESSAGE_MAP结束消息映射;二者之间是消息映射条目。
对于决定一个消息处理程序接收何种类型的参数以及返回何种类型的值,需要参考MFC文档。