问题:
- 什么是客户区/非客户区?
- 窗口(框架/frame)的客户区和视图(view)的客户区的区别?
这些都是初学者很容易迷惑的地方,我也是很迷惑,不过经过一番折腾终于弄明白这些问题了。
对于这些问题,我想只用两个图片来说明最直观!如下:
1。在一个MDI(多文档)应用程序中每个概念如下图所标示:
- 窗口框架的客户区就是指图中的灰色部分:即蓝色方框内区域,框架的非客户区就是指蓝色方框之外的窗口区域,包括程序图标,标题栏,菜单,最大最小/关闭按纽,左右两个框和底下的状态条.
- 视图的客户区就是指图中绿色部分:即红色方框内的区域,视图的非客户区就是指视图部分红色方框之外的区域,包括:文件图标,标题栏,三个按纽和两个滚动条.
- 从图中可以看出,工具栏(工具条)不属于框架的非客户区,它跟视图是框架客户区内的"兄弟".它也是一个窗口,读者不妨再拖拽工具条,它还可以拖出框架窗口区域.
- 因此,以后编程中,对于CClientDC,CWindowDC,GetClientDC(),GetWindowDC()应该可以很容易就区分开了.
CClientDC:
用法是:CClientDC dc(this);//this一般指向本窗口或当前活动视图dc.TextOut(10,10,str,str.GetLength());//利用dc输出文本,如果是在CScrollView中使用,还要注意调用
OnPrepareDC(&dc)调整设备上下文的坐标。
CPaintDC用于响应窗口重绘消息(WM_PAINT)时的绘图输出。CPaintDC在
构造函数中调用
BeginPaint()取得
设备上下文,在
析构函数中调用
EndPaint()释放设备上下文。EndPaint()除了释放设备上下文外,还负责从
消息队列中清除
WM_PAINT消息。因此,在处理窗口重画时,必须使用
CPaintDC,否则WM_PAINT消息无法从消息队列中清除,将引起不断的窗口重画。
CPaintDC也只能用在WM_PAINT消息处理之中。
CWindowDC:关联一特定窗口,允许开发者在目标窗口的任何一部分进行绘图,包含边界与标题,这种DC同WM_NCPAINT消息一起发送
CWindowDC与CClientDC,CPaintDC的区别:
CWindowDC可在非客户区绘制图形,而CClientDC,CPaintDC只能在客户区绘制图形。CWindowDC下坐标原点是在屏幕的左上角,CClientDC,CPaintDC下坐标原点是在客户区的左上角。CClientDC与CPaintDC的区别:
CPaintDC的对象一般用在
OnPaint内以响应
Windows消息WM_PAINT,自动完成绘制,在整个窗口内进行重画,维持原有窗口完整性。CClientDC应用在非响应Windows消息WM_PAINT的情况下,进行实时绘制,绘制的区域内被重画。