OnDraw和OnPaint (转载)

2024-05-01 10:08
文章标签 转载 ondraw onpaint

本文主要是介绍OnDraw和OnPaint (转载),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在MFC程序设计中,按照传统的设计,如果处理WM_PAINT消息,一般会派生一个OnPaint函数,映射到WM_PAINT消息上进行绘图处理。但是很多程序中并没有出现OnPaint,一个OnDraw函数做了更多的绘图操作。而在消息映射的列表中,也没有见到WM_PAINT到OnDraw的映射。
实际上,OnDraw不是OnPaint的映射,出现OnDraw,是为了实现各种不同的设备上的绘图一致性。
首先,读者需要明白的是,WM_PAINT消息是为了绘制屏幕而出现的,因此,在OnPaint中,我们只能存取屏幕DC,进行绘制,常见的代码是:
void MyWnd::OnPaint()
{
       CPaintDC dc(this);
     //draw code here
}
这里的CPaintDC的构造函数会自动调用BeginPaint,获得一个屏幕DC,并附加在dc对象上。当dc对象析构时,系统自动调用EndPaint并使invalidated rectangle变成validated状态,从而结束绘制。(注意,重复创建CPaintDC实例会失败也因为如此)

如果我们在OnPaint中绘制,那么在打印机上绘制我们就需要再写一个OnPrint函数,重新绘制。这样,程序设计者就需要维护两套代码。为了简化操作,MFC框架把大部分绘制操作都放在OnDraw中,OnPaint和OnPrint只构造相应的DC,然后分别调用OnDraw.也就是说,OnDraw适用于所有的设备,而OnPaint只适用于屏幕。

大家在设计过程中必须注意:OnDraw是被基类的OnPaint主动调用的,如果你继承了OnPaint,你应该要么调用基类的OnPaint(此前不得创建CPaintDC实例,也不得调用BeginPaint),要么自己创建CPaintDC实例,并调用OnDraw.

这篇关于OnDraw和OnPaint (转载)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/951401

相关文章

【转载】 symfony 生成实体类命令

原作者地址:https://www.it603.com/article/88.html 参考文章: https://symfony.com/doc/current/doctrine/reverse_engineering.html How to Generate Entities from an Existing Database https://www.jianshu.com/p/75fc

【Android面试八股文】自定义View执行invalidate()方法为什么有时候不会回调onDraw()?

文章目录 一、自定义View执行invalidate()方法为什么有时候不会回调onDraw()?1.1 invalidate 软件绘制流程1.2 invalidate源码分析1.2.1 skipInvalidate()方法1.2.2 invalidateChild方法1.2.2.1 硬件加速绘制1.2.2.2 软件刷新 1.2.3 小结 一、自定义View执行invalida

Spring 学习转载

最近没什么实质性的工作,正好有点时间,就想学学别人的代码。也看过一点源码,算是有了点阅读的经验,于是下定决心看下spring这种大型的项目的源码,学学它的设计思想。   手码不易,转载请注明:xingoo   这篇博文你可以了解到:   1 Spring jar包以及源码使用   2 简单的spring运行示例   3 利用断点调试程序,如何快速的阅读程序【快捷键等的使用】   这次阅

ajax+json+Struts2实现list传递(转载)

一、首先需要下载JSON依赖的jar包。它主要是依赖如下:       json-lib-2.2.2-jdk15       ezmorph-1.0.4       commons-logging-1.0.4       commons-lang-2.4       commons-collections-3.2.1       commons-beanutils      二、

[转载]细说傅里叶变换

原文地址:[转载]细说傅里叶变换 作者:小腹黑zju 原文出处:http://blog.163.com/niujiashu@126/blog/static/1002930422011102501211199/   一、傅立叶变换的由来 关于傅立叶变换,无论是书本还是在网上可以很容易找到关于傅立叶变换的描述,但是大都是些故弄玄虚的文章,太过抽象,尽是一些让人看了就望而生畏的公式的罗列

转载 | 认知推理:从图表示学习和图神经网络的最新理论看AI的未来

近年来,图表示学习(Graph Embedding)和图神经网络(Graph Neural Network, GNN)成为网络数据分析与应用的热点研究问题,其特点是将深度神经网络技术用于网络结构的建模与计算,诞生了以 DeepWalk、LINE 和 node2vec 为代表的图表示学习技术,以 GCN 为代表的图神经网络,能够利用分布式表示方案实现对网络中的节点、边及其附带的标签、属性和文本等信息

【转载】TIOBE 编程指数 6 月排行榜公布,vb.net排第九

原文地址:https://baijiahao.baidu.com/s?id=1801368030428902126&wfr=spider&for=pc IT之家 6 月 9 日消息,TIOBE 编程社区指数是一个衡量编程语言受欢迎程度的指标,评判的依据来自世界范围内的工程师、课程、供应商及搜索引擎,今天 TIOBE 官网公布了 2024 年 6 月的编程语言排行榜,IT之家整理如下: Pyt

Qt 之 qt5安装好后更新添加组件(转载)

QT的组件管理软件并没有在开始菜单或者桌面添加快捷方式(5.9版本),也没有在代码编辑界面设置相关的选项,藏的比较深,因此我被坑了很多次(之前如果要添加组件,只能选择卸载了重装) 在被坑了多次之后,在一次偶然的机会,我在QT安装目录发现了QT的组件管理软件MaintenanceTool 怀着无比激动的心情,我选择“添加或移除组件”点了下一步,结果mmp,提示“要继续此操作,至少需要一个有效

QML 圆角矩形 radius clip 对子组件无效的问题解决方法(转载)

原文链接:https://blog.csdn.net/Likianta/article/details/110703819 本文实现前后效果对比: 正文 根据官方的描述, 考虑到性能表现, 父组件的 radius, clip 对子组件是无效的, 也就是说如果外部矩形设置圆角矩形, 对内部矩形的裁剪是无效的, 如下图所示: 下面介绍一种最简单的方案, 使用 layer 属性来实现圆角区

Qt 之 QML中动态创建组件(同步/异步)的方法 (转载)

原文链接:https://blog.csdn.net/u011283226/article/details/98978828 【写在前面】 在 QML 中想要动态创建组件,一般有两种方法: 1、使用 Loader。 2、使用 JavaScript:Qt.createComponent() / Qt.createQmlObject()。 当然,这里不仅会介绍他们的一般用法,还有如何使用它们