CPaintDC和CDC

A*寻路算法的最简单通俗讲解 为什么我的眼里常含泪水?因为我有一个算法不会。为了节约点眼泪,今天我们就来介绍著名的A*寻路算法(或简称A*算法)。 Peter Hart, Nils Nilsson 和 Bertram Raphael 在1968年首次提出了著名的A*算法。A*算法其实是Dijkstra最短路径算法的一种扩展。不一样的是,在A*算法中我们需要使用Heuristics 来导引搜索过程,以期达到更好的表现。 ... 阅读详情

今天在对话框上绘制图形时遇到了一个问题,直接上代码:

下面是对话框重载的OnPaint函数:

	CRect rect;
	CDC *pDC = GetDC();
	CDC memDC;
	GetClientRect(&rect);
	CBitmap memBitmap;
	memDC.CreateCompatibleDC(NULL);
	memBitmap.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height());
	memDC.SetBkMode(TRANSPARENT);
	memDC.SelectObject(&memBitmap);
	COLORREF bkColor = ::GetSysColor(COLOR_3DFACE);//得到系统颜色
	memDC.FillSolidRect(rect.left, rect.top,rect.Width(), rect.Height(),bkColor);//绘制背景
	memDC.FillSolidRect(rect.left, rect.bottom-40,rect.Width(), rect.Height(),RGB(80,80,80));
	pDC->BitBlt(rect.left, rect.top, rect.Width(), rect.Height(), &memDC, 0, 0, SRCCOPY);

	CDialog::OnPaint();

这段代码的本意是绘制一个矩形框,然后调用CDialog::Onpaint()把原来对话框上的控件也显示出来。

但出现的问题刚开始却让人摸不着头脑:点击“显示桌面”,最小化所有的窗口,再弹出该对话框时,绘制的矩形框会消失;但使对话框被屏幕遮挡,只显示其一部分,再把对话框拖回屏幕中间完整显示的时候,对话框上除矩形框之外的所有控件会消失。


然后再看看改动后正常的代码:

	CPaintDC	dc(this);
	CRect rect;
	CDC *pDC = &dc;
	CDC memDC;
	GetClientRect(&rect);
	CBitmap memBitmap;
	memDC.CreateCompatibleDC(NULL);
	memBitmap.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height());
	memDC.SetBkMode(TRANSPARENT);
	memDC.SelectObject(&memBitmap);
	COLORREF bkColor = ::GetSysColor(COLOR_3DFACE);//得到系统颜色
	memDC.FillSolidRect(rect.left, rect.top,rect.Width(), rect.Height(),bkColor);//绘制背景
	memDC.FillSolidRect(rect.left, rect.bottom-40,rect.Width(), rect.Height(),RGB(80,80,80));
 	pDC->BitBlt(rect.left, rect.top, rect.Width(), rect.Height(), &memDC, 0, 0, SRCCOPY);
	ReleaseDC(pDC);


改变的地方就是把获取DC的方式:CDC *pDC = GetDC()  改成了CpaintDC dc(this),然后取消调用Cdialog::Onpaint()函数,这是为什么呢?


CPaintDC的独到之处就在于,它在构造函数中调用了CWnd::BeginPaint在析构时调用了CWnd::EndPaint,而且它只能响应WM_ONPAINT消息。而这个BeginPaint会发送WM_ONERASEBKGND消息,因此,它只擦除指定的背景并重画,不影响对话框内的其他控件。值得注意的是,在这操作之后不要再调用CDialog::Onpaint函数。


而之前的方法之所以不成功是因为:

BeginPaint() 和EndPaint() 可以删除消息队列中的WM_PAINT消息,并使无效区域有效。
GetDC()和ReleaseDC()并不删除也不能使无效区域有效,因此当程序跳出 WM_PAINT 时 ,无效区域仍然存在。系统就回不断发送WM_PAINT消息,于是程序不断处理WM_PAINT消息。其中无效区域是指需要重画的区域,无效的意思是:当前内容是旧的,过时的。

只有当一个窗口消息空闲时,系统才会抽空检查一下这个窗口的无效区域是否为非空(WM_PAINT的优先级是最低的。这也就是为什么系统很忙时窗口和桌面往往会出现变白、刷新不了、留拖拽痕迹等现象的原因),如果非空,系统就发送WM_PAINT。所以一定要用BeginPaint、EndPaint把无效区域设为空,否则WM_PAINT将一直被发送。

jre9下载 jdk9 (Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】 立即下载

相关推荐

浅显易懂地看LLC变换器(三)

第3期 谐振与增益的定性关系 由简单的谐振电路说起 我们将以电感和电容的基本电路的特性逐渐了解谐振电路的特性 与电阻不同,电感和电容都不是纯阻性线性器件,电感的感抗XL和电容的容抗Xc都与频率有关,当加在电感和电容上的频率发生变化时,它们的感抗XL和容抗Xc会发生变化。 1) 如下图RL电路,当输入源Vin的频率增加时,电感的感抗增大,输出电压减小,增益Gain=Vo/Vin随频率增加而减小。 2) 如下图RC电路,相反,当输入源Vin的频率增加时...

iFTrue电力电子专栏 6739

CPaintDC dc(this)中的this指针的含义解析

答1:this是指当前窗体对象,dc用带有this指针的构造函数进行构造,是指当前窗口的dc。 答2:用了this指针初始化后,你操作的dc就是当前窗体,也即当前窗体就是你的画布! 答3:每个类都有一个默认指针this指向自己。 答4:就是获取当前窗口的dc而已,可以用这个DC在当前窗口绘图。当然你也可以获取其它窗口的dc,只要传入其它窗口的指针就可以了。 同理CClientDC dc(t

心静如水 1万+

360可视门铃双摄版数据恢复实战:BIN文件解析与视频重组

本文详细解析了360可视门铃双摄版BIN文件的数据恢复过程,包括文件结构分析、双摄像头数据存储机制及视频重组技术。通过Python开发环境和FFmpeg工具链,成功实现了H.265视频流的解析与重组,为智能家居设备数据恢复提供了实用解决方案。

weixin_29196891的博客 910

CPaintDC 、CWindowDC、 CClientDC、 CDC的区别与联系

DC就是设备上下文(Device Context, DC),可以把它理解成“画布”。 操作系统本来是使用HDC(HDC是DC的句柄,API中的一个类似指针的数据类型.)进行绘画的。 MFC中把HDC包装成了CDC类(MFC类的前缀都是C开头的),提供给程序员使用。 CPaintDC的父类就是CDC,换句话说两者底层使用同一种方法进行绘图。 MFC是通过消息泵信息处理的。CPaintDC内部发出绘图消息给系统。所以描画画面时,最好使用CPaintDC。 CDC只是HDC的包装,不包含绘图消息的发送。所以,创建

顺其自然~专栏 1099

STM32G474 FDCAN滤波器配置与多ID接收实战

本文详细介绍了STM32G474 FDCAN滤波器配置与多ID接收实战,重点解析了掩码过滤和范围过滤两种模式的工作原理及配置步骤。通过实际项目案例展示了如何高效配置多个滤波器实现多ID报文接收,并提供了接收FIFO配置与中断处理的优化策略,帮助开发者提升CAN通信系统的稳定性和实时性。

happy2的博客 875

别再纠结Dify了!实测对比RAGFlow和Dify,聊聊企业知识库到底该怎么选

本文深度对比了RAGFlow和Dify在企业知识库选型中的实际表现,从技术架构、性能指标、部署成本等多维度进行分析。RAGFlow在复杂文档处理和准确率方面表现突出,适合有专职技术团队的企业;而Dify则以低门槛和快速部署见长。文章提供了六维度评估法,帮助企业根据文档复杂度、准确率要求等技术指标做出明智选择。

weixin_30897233的博客 670

VC++ - 各种DC及DC资源释放

2013-04-18 16:58:57|  分类: GDI |  标签:cclientdc与cpaintdc  dc释放  dc  |字号 订阅 CClientDC dc(this); CPaintDC dc(this); 从前面我们可以得出,这两个语句就是新建dc变量并把当前的CWnd或其派生类的句柄得到当前窗体的作画区域放在dc这个变量中。

mituan1234567的专栏 6444

手把手教你用Arduino IDE玩转ESP32-S3-wroom(附串口调试技巧)

本文详细介绍了如何在Arduino IDE环境下配置和使用ESP32-S3-WROOM模块,包括开发环境搭建、硬件连接、程序烧录及高级调试技巧。通过实战步骤和常见问题解决方案,帮助开发者快速上手这一高性能Wi-Fi/蓝牙双模模组,提升物联网开发效率。

weixin_30487201的博客 293

【VC++ MFC】MFC的CDC类 以及DC、CClientDC、CWindowDC、CPaintDC

DC(Device Context),设备上下文或者设备环境。      应用程序的输出面向设备环境(Device Context,DC),是一个虚拟逻辑设备,也称设备描述表或设备上下文。设备环境DC 是由GDI 创建,用来代表设备连接的数据结构。  (Windows提供了一个称为图形设备接口 GDI,用户通过调用GDI 函数与设备打交道,避免了用户对硬件直接进行操作)1、...

我的笔记本 1710

双足步行机器人的ZMP与CoP检测

静态步行与动态步行   机器人步态分为静态步行和动态步行。当机器人做静态步行运动时,身体的各个部分运动速度很小,机器人的整体稳定性较易控制。静态步行稳定性采用机器人的重心地面投影点(Center of Gravity,简称CoG)作为稳定性标准,这种判定方法适用于运动较为缓慢的情况。如果机器人采用的是一种高速运动的步行方式,则称之为动态步行。当机器人进行动态步行时,其重心的位置和加速度的大小时...

weixin_34112208的博客 5908

C#客户端对接工厂MES的方法

本文介绍了使用C#实现WebApi客户端与工厂MES系统交互的方法。主要包括四个步骤:1)配置工控机IP地址;2)获取服务器URL;3)创建HttpHelper帮助类实现单例模式HttpClient,提供异步POST请求方法;4)通过实例化帮助类实现设备状态数据的JSON格式发送与接收。该方案采用异步通信方式,支持超时处理,能够满足大多数MES系统交互需求,帮助工程师快速完成设备与MES系统的数据对接。文中给出了核心代码片段和完整的数据交互流程示例。

weixin_39832501的博客 265

BeginPaint/EndPaint(CPaintDC)与GetDC(CClientDC)的区别

在OnPaint函数中,用CClientDC dc(this)代替CPaintDC(this)后,界面不断闪烁。 说明:CClientDC是对GetDC的使用封装, CPaintDC是对BeginPaint/EndPaint的使用封装 原因:BeginPaint/EndPaint会将无效区域设置为NULL, 从而通知系统已经绘制了,不用再发WM_PAINT消息, 而GetDC不会这样做...

weixin_30875157的博客 213

Deeplabv3+改进1:添加CBAM注意力机制|有效涨点

我们提出卷积块注意力模块(CBAM),这是一种简单而有效的前馈卷积神经网络注意力模块。给定一个中间特征图,我们的模块会依次沿两个独立维度(通道和空间)推断注意力图,然后将注意力图与输入特征图相乘,以实现自适应特征细化。由于 CBAM 是一个轻量级且通用的模块,它可以无缝集成到任何 CNN 架构中,几乎不会增加开销,并且可以与基础 CNN 一起端到端训练。我们通过在 ImageNet-1K、MS COCO 检测和 VOC 2007 检测数据集上进行的大量实验验证了 CBAM。

AIcurator的博客 1691

CDC和CPaintDC的区别

在WM_PAINT消息中,cdc会一直连续不断地刷新,占用cpu资源。cpaintdc只在关键的时候,如缩放情况下才刷新画面,所以cpu占用少。对于static控件,只能获取cdc,不能获取cpaintdc.

oyguyteggytrrwwwrt的博客 171

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

HDC、CDC、CClientDC、CPaintDC和CWindowDC

HDC是Windows的一种数据类型,是设备描述句柄; CDC是MFC封装的Windows 设备相关的一个类; CClientDC是CDC的衍生类,产生对应于Windows客户区的对象,在构造的时候调用GetDC,在析构的时候调用ReleaseDC; CWindowDC也是CDC的衍生类,在构造的时候调用GetWindowDC,在析构时调用ReleaseDC,可访问CWnd的整个

1097

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

CDC类及其子类---CClientDC、CWindowDC和CPaintDC

CDC类及其子类---CClientDC、CWindowDC和CPaintDC http://blog.youkuaiyun.com/ccfboy/archive/2009/05/02/4142943.aspxCDC类 Windows使用与设备无关的图形设备环境(DC :Device Context) 进行显示 。MFC基础类库定义了设备环境对象类----CDC类。父类:从 CObject 直

StamHe的专栏 1620

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

CDC类及其子类---CClientDC、CWindowDC和CPaintDC .

http://blog.youkuaiyun.com/ccfboy/archive/2009/05/02/4142943.aspx CDC类 Windows使用与设备无关的图形设备环境(DC :Device Context) 进行显示 。MFC基础类库定义了设备环境对象类----CDC类。   父类:从 CObject 直接继承而来。继承了CObject类的各种特性,如动态创建等等。  

ap7725182的专栏 437

windows程序设计(四)---CDC类及其子类---CClientDC、CWindowDC和CPaintDC

CDC类Windows使用与设备无关的图形设备环境(DC :Device Context) 进行显示 。MFC基础类库定义了设备环境对象类----CDC类。 父类:从 CObject 直接继承而来。继承了CObject类的各种特性,如动态创建等等。 例如用GDI画矩形要Rectangle(hDC,...),而使用CDC则是dc.Rectangle(...),由此可见CD

人的一生应当这样度过:当他回首往事时,不因虚度年华而懊悔,也不因碌碌无为而羞愧! 3094

CDC CPaintDC、CClientDC、CWindowDC和CMetaFileDC类的含义及区别

1、 设备环境(DC)     (1)在Windows中,显示工作是基于设备环境的。所谓设备环境(DC)是一种Windows数据结构,该结构包含应用程序设备输出时所需要的信息。    (2)在使用任何绘图函数之前必须建立一个设备环境对象。    (3)在Visual C++的MFC中提供了设备环境类CDC,它封装了绘图所需要的所有函数,其中包括了大多数的Windows API中的

haohaojian的专栏 1028

C++和MFC HDC,CDC,CClientDC,CPaintDC,CWindowDC

相关连接

qq_34463308的博客 241

CDC,CPaintDC,CClientDC,CWindowDC区别

CDC是Windows绘图设备的基类 CClientDC: (1)(客户区设备上下文)用于客户区的输出,与特定窗口关联,可以让开发者访问目标窗口中客户区,其构造函数中包含了GetDC,析构函数中包含了ReleaseDC CPaintDC: (1)用于响应窗口重绘消息(WM_PAINT)是的绘图输出。 (2)CPaintDC在构造函数中调用BeginPaint()取得设备上下文,在

oldmtn的专栏 911

CPaintDC 、CWindowDC、 CClientDC、 CDC联系与区别

CPaintDC 、CWindowDC、 CClientDC、 CDC 关系图:   一句话概括: CPaintDC            无效区dc,      相当于BeginPaint,   EndPaint CClientDC          客户区dc,      相当于GetDC,   ReleaseDC CWindowDC      整窗口dc,      相当

维c银翘片 1295

HDC,CDC,CClientDC,CPaintDC,CWindowDC的区别

CDC是MFC的DC的一个类 HDC是DC的句柄,API中的一个类似指针的数据类型. MFC类的前缀都是C开头的 H开头的大多数是句柄 首先说一下什么是DC(设备描述表) 解:Windows应用程序通过为指定设备(屏幕,打印机等)创建一个设备描述表(Device Context, DC)在DC表示的逻辑意义的“画布”上进行图形的绘制。DC是一种包含设备信息的数据结构,它包含了物理设备所需的各种状态信息。Win32程序在绘制图形之前需要获取DC的句柄HDC,并在不继续使

JoeBlackZQQ的专栏 1101

MFC绘图类(CDC,CPaintDC,CClientDC,CWindowDC)

MFC的类CDC,CPaintDC,CClientDC,CWindowDC都可以用于绘图,我们在进行绘图时对怎么使用这几个类常常混淆。 其中CDC类是基础,另外的几个类是为了特殊应用从CDC类派生出来的,下面对这几个类进行简单的介绍。 (1)CDC类 CDC是CObject类的一个派生类,CDC类是所有绘图类的基类,CDC类定义了一个设备描述对象。CDC类提供了对这个设备描述对象进行操作的成...

飞翔鱼的博客 2161

CDC,CClientDC,CPaintDC,CWindowDC 比较区别

MFC中的CDC,CClientDC,CPaintDC,CWindowDC的区别 1、CDC是Windows绘图设备的基类。 2、CClientDC: (1)(客户区设备上下文)用于客户区的输出,与特定窗口关联,可以让开发者访问目标窗口中客户区,其构造函数中包含了GetDC,析构函数中包含了ReleaseDC。 3、CPaintDC: (1)用于响应窗口重绘消息(WM_PAINT)是的绘

luliyuan的专栏 919

CDC,CPaintDC,CWindowDC,CClientDC

它们之间的的关系如下: CObject  public |------CDC  public |------|------CClientDC  public |------|------CPaintDC  public |------|------CWindowDC  public |------|------CMetaFileDC  CDC msdn上关于CDC是这样描述

A_Ly的专栏 643
上一篇: 对话框多国语言的支持
下一篇: 创建和使用DLL
C__Allen
博客等级 码龄18年 12粉丝 25原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值