MFC几个绘图类的主要区别
1.CWindowDC类与CPaintDC,CClientDC类的区别
CWindowDC类与CPaintDC,CClientDC类区别的一个方面是:用CPaintDC类和CClientDC类的对象绘制图形时,绘制区只能是客户区,而不能在非客户区,而CWindowDC类可以在非客户区进行图形绘制。客户区和非客户区的概念可以通过图3-1来理解。当画一条起始坐标都在屏幕外且通过屏幕的竖直线时,用CPaintDC类和CClientDC类对象绘制时,只有在客户区的直线能够绘制出来,而用CWindowDC类对象绘制时,直线可以画在非客户区。
CWindowDC类一般在框架类(CMainFrame类)中使用,在视图类(如CDrawView类)中使用CWindowDC类时,由于视图类只能管理客户区,所以并不能在非客户区进行绘制。
CWindowDC类与CPaintDC类和CClientDC类区别的另一个方面是:在CWindowDC绘图类下,坐标系是建立在整个屏幕上的,在像素坐标方式下,坐标原点在屏幕的左上角;而在CPaintDC和CClientDC绘图类下,坐标系是建立在客户区上的,在像素坐标方式下,坐标原点在客户区的左上角。图3-1中的粗线是分别用CWindowDC类和CClientDC类绘制的直线,直线的起点为(100,0),终点为(400,600),绘制时,框架窗口在屏幕上处于最大状态。很明显,CWindowDC类可以在非客户区中进行图形绘制。
2.CPaintDC类与CClientDC类的区别
CPaintDC类与CClientDC类对象都是在窗口的客户区内绘制图形,但两者在绘制机制上有着本质的区别。CPaintDC类对象应用在OnPaint函数中,以响应Windows 的WM PAINT消息,而CClientDC类对象应用在非响应消息WM_PAINT的情况下。CPaintDC类响应WM_PAINT消息,自动完成绘制,这对维护图形的整性有着重要的作用。例如在一个窗口中,已经画有n条直线,这个窗口完整性可能被破坏(如被对话框覆盖),当破坏完整性的程序结束时(如覆盖取消),这个窗口就会收到一个WM_PAINT消息,激发消息处理函数OnPaint进行图形绘制。CPaintDC类对象就担负着此时的绘制任务。如果现在想在屏幕上再绘制一条直线(如用鼠标实时绘制,当第二次单击鼠标左键时完成绘制),就要用到CClientDC类对象,这个类可以实时地将图形绘制到屏幕上。如果用CPaintDC类对象完成同样的工作,只能发出消息让屏幕上包含这条直线的区域重画,以把这条直线绘制到屏幕上。当然,重画区域内的其他图形元素同时也被重画。