MFC-客户区与非客户区
2017-11-20 14:22
197 查看
1 在一个MDI(多文档)应用程序中每个概念如下图所标示:
1)窗口框架的客户区就是指图中的灰色部分:即蓝色方框内区域,框架的非客户区就是指蓝色方框之外的窗口区域,包括程序图标,标题栏,菜单,最大最小/关闭按纽,左右两个框和底下的状态条.
2)视图的客户区就是指图中绿色部分:即红色方框内的区域,视图的非客户区就是指视图部分红色方框之外的区域,包括:文件图标,标题栏,三个按纽和两个滚动条.
3)从图中可以看出,工具栏(工具条)不属于框架的非客户区,它跟视图是框架客户区内的”兄弟”.它也是一个窗口,读者不妨再拖拽工具条,它还可以拖出框架窗口区域.
4)因此,以后编程中,对于CClientDC,CWindowDC,GetClientDC(),GetWindowDC()应该可以很容易就区分开了.
2. OnPaint和OnDrawn的区别
OnDraw()和OnPaint()好象兄弟俩,因为它们的工作类似。一般Windows会发送两个消息WM_PAINT(通知客户区有变化)和WM_NCPAINT(通知非客户区有变化)。非客户区的重画系统自己搞定了,而客户区的重画需要我们自己来完成。这就需要OnDraw()或 OnPaint()来重画窗口。它们用来重绘客户区,onpaint负责响应重绘消息,然后onpaint调用ondraw进行重绘。
OnDraw()和OnPaint()的区别:
首先:CView类派生自CWnd类,OnPaint()是CWnd的类成员,同时负责响应WM_PAINT消息。OnDraw()是CVIEW的成员函数,并且没有响应消息的功能。这就是为什么你用VC成的程序代码时,在视图类只有 OnDraw没有OnPaint的原因—onpaint函数都是继承自Cwnd基类。
其次,要想在屏幕上绘图或显示图形,首先需要建立设备环境DC。其实DC是一个数据结构,它包含输出设备(不单指你17寸的纯屏显示器,还包括打印机之类的输出设备)的绘图属性的描述。MFC提供了CPaintDC类和CWindwoDC类来实时的响应,而CPaintDC支持重画。当视图变得无效时(包括大小的改变,移动,被遮盖等等),Windows 将 WM_PAINT 消息发送给它。该视图的OnPaint 处理函数通过创建 CPaintDC 类的DC对象来响应该消息并调用视图的 OnDraw 成员函数。通常我们不必编写重写的 OnPaint 处理成员函数。
既然OnPaint最后也要调用OnDraw,因此我们一般会在OnDraw函数中进行绘制。下面是一个典型的程序:
因此我们一般用OnPaint维护窗口的客户区(例如我们的窗口客户区加一个背景图片),用OnDraw维护视图的客户区(例如我们通过鼠标在视图中画图)。
参考:http://blog.sina.com.cn/s/blog_677428450102w9d3.html
1)窗口框架的客户区就是指图中的灰色部分:即蓝色方框内区域,框架的非客户区就是指蓝色方框之外的窗口区域,包括程序图标,标题栏,菜单,最大最小/关闭按纽,左右两个框和底下的状态条.
2)视图的客户区就是指图中绿色部分:即红色方框内的区域,视图的非客户区就是指视图部分红色方框之外的区域,包括:文件图标,标题栏,三个按纽和两个滚动条.
3)从图中可以看出,工具栏(工具条)不属于框架的非客户区,它跟视图是框架客户区内的”兄弟”.它也是一个窗口,读者不妨再拖拽工具条,它还可以拖出框架窗口区域.
4)因此,以后编程中,对于CClientDC,CWindowDC,GetClientDC(),GetWindowDC()应该可以很容易就区分开了.
2. OnPaint和OnDrawn的区别
OnDraw()和OnPaint()好象兄弟俩,因为它们的工作类似。一般Windows会发送两个消息WM_PAINT(通知客户区有变化)和WM_NCPAINT(通知非客户区有变化)。非客户区的重画系统自己搞定了,而客户区的重画需要我们自己来完成。这就需要OnDraw()或 OnPaint()来重画窗口。它们用来重绘客户区,onpaint负责响应重绘消息,然后onpaint调用ondraw进行重绘。
OnDraw()和OnPaint()的区别:
首先:CView类派生自CWnd类,OnPaint()是CWnd的类成员,同时负责响应WM_PAINT消息。OnDraw()是CVIEW的成员函数,并且没有响应消息的功能。这就是为什么你用VC成的程序代码时,在视图类只有 OnDraw没有OnPaint的原因—onpaint函数都是继承自Cwnd基类。
其次,要想在屏幕上绘图或显示图形,首先需要建立设备环境DC。其实DC是一个数据结构,它包含输出设备(不单指你17寸的纯屏显示器,还包括打印机之类的输出设备)的绘图属性的描述。MFC提供了CPaintDC类和CWindwoDC类来实时的响应,而CPaintDC支持重画。当视图变得无效时(包括大小的改变,移动,被遮盖等等),Windows 将 WM_PAINT 消息发送给它。该视图的OnPaint 处理函数通过创建 CPaintDC 类的DC对象来响应该消息并调用视图的 OnDraw 成员函数。通常我们不必编写重写的 OnPaint 处理成员函数。
///CView默认的标准的重画函数 void CView::OnPaint() { CPaintDC dc(this); OnPreparDC(&dc); OnDraw(&dc); //调用了OnDraw }
既然OnPaint最后也要调用OnDraw,因此我们一般会在OnDraw函数中进行绘制。下面是一个典型的程序:
///视图中的绘图代码首先检索指向文档的指针,然后通过DC进行绘图调用。 void CMyView::OnDraw( CDC* pDC ) { CMyDoc* pDoc = GetDocument(); CString s = pDoc->GetData(); // Returns a CString CRect rect; GetClientRect( &rect ); pDC->SetTextAlign( TA_BASELINE | TA_CENTER ); pDC->TextOut( rect.right / 2, rect.bottom / 2, s, s.GetLength() ); }
因此我们一般用OnPaint维护窗口的客户区(例如我们的窗口客户区加一个背景图片),用OnDraw维护视图的客户区(例如我们通过鼠标在视图中画图)。
参考:http://blog.sina.com.cn/s/blog_677428450102w9d3.html
相关文章推荐
- VS2010/MFC 设置对话框客户区背景及客户区文本
- MFC中客户区和非客户区概念的图示
- VC MFC 钩子 实现 自绘 窗体 标题栏 非客户区(VER.2013-11-06)
- 在MFC的MDI程序中设置子窗口客户区大小
- MFC Windows 程序设计->实现客户区拖动
- MFC光标移动到按钮上时编辑框显示时间,并显示光标的窗口位置和客户区位置
- MFC模态对话与非模态对话框
- 什么是客户区/非客户区?•窗口(框架/frame)的客户区和视图(view)的客户区的区别?
- MFC对话框禁止移动 使标题栏不响应鼠标消息 通过客户区移动窗体 OnNcHitTest()的实现
- MFC按客户区大小获取合适的主窗口大小
- MFC对话框禁止移动 使标题栏不响应鼠标消息 通过客户区移动窗体 OnNcHitTest()的实现
- MFC 客户区 模拟标题栏 功能 ,实现窗体拖动
- vs2010 单文档MFC 通过加载位图文件作为客户区背景
- MFC绘图总结(2):客户区大小和DC | 求索阁+http://qiusuoge.com/10069.html(转载)
- MFC窗口客户区全屏显示以及PICTURE控件全屏显示
- MFC 创建模式对话框与非模式对话框
- vs2010 单文档MFC 通过加载位图文件作为客户区背景
- VC MFC 钩子 实现 自绘 窗体 标题栏 非客户区
- MFC中客户区和非客户区概念的图示
- MFC窗口客户区全屏显示以及PICTURE控件全屏显示