社区
界面
帖子详情
OnPaint()和OnDraw()到底如何使用?
RocWay007
2004-06-11 08:39:37
我知道是下前者要调用后者?
可是它们都能画图,那么具体有什么区别?
也就是说,为什么要设一个OnPaint()函数?仅仅是OnDraw()不可以吗?
...全文
723
10
打赏
收藏
OnPaint()和OnDraw()到底如何使用?
我知道是下前者要调用后者? 可是它们都能画图,那么具体有什么区别? 也就是说,为什么要设一个OnPaint()函数?仅仅是OnDraw()不可以吗?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
10 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
fanqing
2004-06-14
打赏
举报
回复
OnDraw()和OnPaint()兄弟
经常有朋友问雷神这样的问题:
我在视图画的图象或者文字,当窗口改变后为什么不见了?
OnDraw()和OnPaint()两个都是解决上面的问题,有什么不同?
雷神在这里一并解答一下吧。
OnDraw()和OnPaint()好象兄弟俩,因为它们的工作类似。
至于不见了的问题简单,因为当你的窗口改变后,会产生无效区域,这个无效的区域需要重画。一般Windows回发送两个消息WM_PAINT(通知客户区有变化)和WM_NCPAINT(通知非客户区有变化)。非客户区的重画系统自己搞定了,而客户区的重画需要我们自己来完成。这就需要OnDraw()或OnPaint()来重画窗口。
OnDraw()和OnPaint()有什么区别呢?
首先:
我们先要明确CView类派生自CWnd类。而OnPaint()是CWnd的类成员,同时负责响应WM_PAINT消息。OnDraw()是CVIEW的成员函数,并且没有响应消息的功能。这就是为什么你用VC成的程序代码时,在视图类只有OnDraw没有OnPaint的原因。
其次:
我们在第《每天跟我学MFC》3的开始部分已经说到了。要想在屏幕上绘图或显示图形,首先需要建立设备环境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维护视图的客户区(例如我们通过鼠标在视图中画图)。当然你也可以不按照上面规律来,只要达到目的并且没有问题,怎么干都成。
补充:
我们还可以利用Invalidate(),ValidateRgn(),ValidateRect()函数强制的重画窗口,具体的请参考MSDN吧。
laneyui
2004-06-14
打赏
举报
回复
OnPaint是程序相应WM_PAINT的消息处理函数,而在Document/View结构中,View的OnPaint调用了OnDraw,并准备好了DC,另外默认的情况下,OnPrint也调用OnDraw,也就是让程序自动具有打印的功能,此时的DC就是打印机或者打印预览窗口的。OnDraw是Document/View结构中特有的,此时一般不去重载OnPaint,直接在OnDraw中进行绘制。
54783szg
2004-06-14
打赏
举报
回复
OnPaint()是WINDOSW的函数,OnDraw()是程序的函数!
shuili2004
2004-06-14
打赏
举报
回复
偶知道,不过忘记了
windyloft
2004-06-14
打赏
举报
回复
OnDraw调用onpaint
AndyZhang_
2004-06-14
打赏
举报
回复
OnPaint是用来绘制窗体、按钮等控件
而OnDraw是用来绘制视图的
cyczl666
2004-06-14
打赏
举报
回复
举个简单的例子
在你拖动滚动条时,视图的内容重绘了,那时调用的就是OnDraw,而窗体并没有重绘。
cyczl666
2004-06-14
打赏
举报
回复
OnPaint是用来绘制Windows元素的,像窗体、按钮等控件
而OnDraw是用来绘制视图的。
sona
2004-06-14
打赏
举报
回复
up
onpaint()会重绘两遍的,一次窗体,一次客户区!
java代码重启weblogic_Weblogic中的热部署——修改JSP、java类无需重启
Weblogic允许在wls运行时部署组件的新版本。这个过程被称作热部署。因为java classloader没有任何一种机制来卸下一系列存在的类,也不能用类的新版本来替换老版本,为了在一个运行的虚拟机中更新相关的 类,classloader必须被替换掉。当它被替换时,它所装载的所有类以及衍生的子classloader也要被重新装载。这些类的所有实例也必需被 重新装载。在wls中,每一个应用组件都...
weblogic调优
weblogic调优
BEA WebLogic平台下J2EE调优攻略----第五章 性能监控和性能分析
第五章 性能监控和性能分析 5.1 性能瓶颈 最后,介绍一下实际分析J2EE应用性能的常用命令和工具。对于实现一个高性能的J2EE应用来说,掌握了J2EE调优的理论经验还是不够的。掌握性能监控,发现瓶颈和问题诊断才是保证J2EE系统持续高效运行的关键。 瓶颈指的是限值所有吞吐操作以及严重影响反应时间的系统内资源。在分布式系统内寻找并纠正瓶颈是非常困难的,需要有经验的团队来解决。瓶颈会
WebLogic高危漏洞CVE-2020-14882:权限绕过原理、复现与加固实战
在Web应用安全领域,权限校验是防止未授权访问的核心机制,其原理通常基于对请求路径的认证与授权检查。然而,当路径处理逻辑出现不一致时,便可能产生严重的权限绕过漏洞。以Oracle WebLogic Server的CVE-2020-14882漏洞为例,其技术根源在于URL双重编码导致的路径规范化差异:安全过滤器基于解码一次的路径进行校验,而请求路由时却对路径进行了二次解码与规范化,使得攻击者能构造特殊请求,绕过认证直接访问高权限管理接口。这种漏洞的价值在于揭示了中间件安全模型中校验与执行环节脱节的经典风险,常
weblogic 启动很慢_WebLogic: console 启动慢解决办法
nodejs 框架安装生成app下载nodejs解压到opt目录$ cd /usr/local/bin$ sudo ln -s /opt/node-v5.1.0-linux-x64/bin/node$ sudo ln -s /opt ...GitHub入门之一:
使用
github下载项目git作为目前比较流行的版本控制系统,被各个互联网公司广泛
使用
着.目前国外的网站有GitHub,国内的有CSDN和...
界面
15,976
社区成员
115,866
社区内容
发帖
与我相关
我的任务
界面
VC/MFC 界面
复制链接
扫一扫
分享
社区描述
VC/MFC 界面
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章