mfc 的图片显示机制

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

以前用mfc画图一直是把别人的代码拿过来就用,用到什么问题再解决之,这次又要做画图的事,正好总结下。

1 如何把图片显示到屏幕上?

先把图片载入到内存中,再更新到dc中,再将其画到屏幕上

2 画图时屏幕闪烁问题

显示图形如何避免闪烁,如何提高显示效率是问得比较多的问题。而且多数人认为MFC的绘图函数效率很低,总是想寻求其它的解决方案。
MFC的绘图效率的确不高但也不差,而且它的绘图函数使用非常简单,只要使用方法得当,再加上一些技巧,用MFC可以得到效率很高的绘图程序。
我想就我长期(呵呵当然也只有2年多)使用MFC绘图的经验谈谈我的一些观点。

2.1显示的图形为什么会闪烁?

我们的绘图过程大多放在OnDraw或者OnPaint函数中,OnDraw在进行屏幕显示时是由OnPaint进行调用的。当窗口由于任何原因需要重绘时,总是先用背景色将显示区清除,然后才调用OnPaint,而背景色往往与绘图内容反差很大,这样在短时间内背景色与显示图形的交替出现,使得显示窗口看起来在闪。如果将背景刷设置成NULL,这样无论怎样重绘图形都不会闪了。当然,这样做会使得窗口的显示乱成一团,因为重绘时没有背景色对原来绘制的图形进行清除,而又叠加上了新的图形。有的人会说,闪烁是因为绘图的速度太慢或者显示的图形太复杂造成的,其实这样说并不对,绘图的显示速度对闪烁的影响不是根本性的。例如在OnDraw(CDC *pDC)中这样写:

 

 

这个绘图过程应该是非常简单、非常快了吧,但是拉动窗口变化时还是会看见闪烁。其实从道理上讲,画图的过程越复杂越慢闪烁应该越少,因为绘图用的时间与用背景清除屏幕所花的时间的比例越大人对闪烁的感觉会越不明显。比如:清楚屏幕时间为1s绘图时间也是为1s,这样在10s内的连续重画中就要闪烁5次;如果清楚屏幕时间为1s不变,而绘图时间为9s,这样10s内的连续重画只会闪烁一次。这个也可以试验,在OnDraw(CDC *pDC)中这样写:

 

 

呵呵,程序有点变态,但是能说明问题。

说到这里可能又有人要说了,为什么一个简单图形看起来没有复杂图形那么闪呢?这是因为复杂图形占的面积大,重画时造成的反差比较大,所以感觉上要闪得厉害一些,但是闪烁频率要低。那为什么动画的重画频率高,而看起来却不闪?这里,我就要再次强调了,闪烁是什么?闪烁就是反差,反差越大,闪烁越厉害。因为动画的连续两个帧之间的差异很小所以看起来不闪。如果不信,可以在动画的每一帧中间加一张纯白的帧,不闪才怪呢。

2.2如何避免闪烁

在知道图形显示闪烁的原因之后,对症下药就好办了。首先当然是去掉MFC提供的背景绘制过程了。实现的方法很多,
* 可以在窗口形成时给窗口的注册类的背景刷付NULL
* 也可以在形成以后修改背景 

 

 

* 要简单也可以重载OnEraseBkgnd(CDC* pDC)直接返回TRUE

这样背景没有了,结果图形显示的确不闪了,但是显示也象前面所说的一样,变得一团乱。怎么办?这就要用到双缓存的方法了。双缓冲就是除了在屏幕上有图形进行显示以外,在内存中也有图形在绘制。我们可以把要显示的图形先在内存中绘制好,然后再一次性的将内存中的图形按照一个点一个点地覆盖到屏幕上去(这个过程非常快,因为是非常规整的内存拷贝)。这样在内存中绘图时,随便用什么反差大的背景色进行清除都不会闪,因为看不见。当贴到屏幕上时,因为内存中最终的图形与屏幕显示图形差别很小(如果没有运动,当然就没有差别),这样看起来就不会闪。

2.3如何实现双缓冲

 

首先给出实现的程序,然后再解释,同样是在OnDraw(CDC *pDC)中:

 

上面的注释应该很详尽了,废话就不多说了。

2.4如何提高绘图的效率

我主要做的是电力系统的网络图形的CAD软件,在一个窗口中往往要显示成千上万个电力元件,而每个元件又是由点、线、圆等基本图形构成。如果真要在一次重绘过程重画这么多元件,可想而知这个过程是非常漫长的。如果加上了图形的浏览功能,鼠标拖动图形滚动时需要进行大量的重绘,速度会慢得让用户将无法忍受。怎么办?只有再研究研究MFC的绘图过程了。

实际上,在OnDraw(CDC *pDC)中绘制的图并不是所有都显示了的,例如:你在OnDraw中画了两个矩形,在一次重绘中虽然两个矩形的绘制函数都有执行,但是很有可能只有一个显示了,这是因为MFC本身为了提高重绘的效率设置了裁剪区。裁剪区的作用就是:只有在这个区内的绘图过程才会真正有效,在区外的是无效的,即使在区外执行了绘图函数也是不会显示的。因为多数情况下窗口重绘的产生大多是因为窗口部分被遮挡或者窗口有滚动发生,改变的区域并不是整个图形而只有一小部分,这一部分需要改变的就是pDC中的裁剪区了。因为显示(往内存或者显存都叫显示)比绘图过程的计算要费时得多,有了裁剪区后显示的就只是应该显示的部分,大大提高了显示效率。但是这个裁剪区是MFC设置的,它已经为我们提高了显示效率,在进行复杂图形的绘制时如何进一步提高效率呢?那就只有去掉在裁剪区外的绘图过程了。可以先用pDC->GetClipBox()得到裁剪区,然后在绘图时判断你的图形是否在这个区内,如果在就画,不在就不画。

如果你的绘图过程不复杂,这样做可能对你的绘图效率不会有提高。

3 WM_PAINT消息的发送问题

 

WM_PAINT发送条件是"The WM_PAINT message is sent when the system or another application makes a request to paint a portion of an application's window."那什么时候系统或其他应用程序会发送重画请求呢?需要重画的"portion"又有多大呢?再往下看,"The message is sent when the UpdateWindow or RedrawWindow function is called, or by the DispatchMessage function when the application obtains a WM_PAINT message by using the GetMessage or PeekMessage function. "这就说明这个WM_PAINT消息既可能由系统发送,也可能由应用程序人工发送。这个很好理解。当窗口的一部分被其它窗口遮盖而复原,或者从最小化状态恢复到正常状态时,系统自然会要求窗口重画。系统重画窗口的条件可以参见MSDN/Platform SDK/Windows GDI/Painting and Drawing/When to Draw in a window. 而有时候我们需要窗口的某些部分作出改变,就得人工要求窗口重画(通过调用UpdateWindow和RedrawWindow)。比如我的基础类库里窗口上没有任何Windows意义上的控件(有hWnd),只是人为定义某一个区域是一个“按钮”,当鼠标指向这个区域时加载hover图像以获得hottrack效果。这时操作系统自然不会认为有重画的必要,但程序却必须重画,这时就得人工发送WM_PAINT消息了。注意不要傻乎乎地直接用SendMessage或PostMessage发送WM_PAINT,后面会解释原因。

由于重画很费时间和资源,并且也不是应用程序的“主业”,因此系统也知道要尽量减少重画的次数。系统只在应用程序的消息队列为空的时候才发送WM_PAINT,这就是为什么当程序死锁时窗口图像不会更新。同样为了减少重画的工作量,Windows提出了update region的概念,"The update region identifies the portion of a window that is out-of-date or invalid and in need of redrawing. The system uses the update region to generate WM_PAINT messages for applications and to minimize the time applications spend bringing the contents of their windows up to date. "也就是说,Windows会判断窗口的哪些区域需要重画,这个区域就是update region. 比如原来在窗口上面的一个窗口现在挪走了,系统就把新露出来的区域定义为update region(这个过程称为invalidate)。系统不断检测一个窗口的update region是否为空,当update region不为空并且应用程序没有消息要处理(消息队列为空)的时候,系统就通过WM_PAINT告诉应用程序“现在没事干了?窗口的一部分需要重画,你把这一部分重画一下”。应用程序重画了窗口之后,把update region重新设置为空(这个过程称为validate),如此不断循环。如果消息队列不为空,系统就把update region不断更新(采用取并集的方法),等消息队列为空的时候一起处理。这就大大减少了重画的次数。

这样你或许就明白了为什么不能直接用SendMessage和PostMessage发送WM_PAINT的原因:由于没有invalidate,系统认为窗口没有更新的必要,于是就对发来的WM_PAINT消息不理不睬。解决方案就是——我们自己invalidate!相关的API就是InvalidateRect()和InvalidateRgn(). 画完了之后用ValidateRect()和ValidateRgn()告诉系统“我画完了”就行了。可以把invalidate过程看成类似CombineRgn()取并集,把validate过程看成取差集即可。还有一些相关的API: GetUpdateRect(), GetUpdateRgn(), ExcludeUpdateRgn(), 从名字就能猜出个大概,各位可以自行去查MSDN.

在WM_PAINT消息处理过程中有两个不得不提到的函数:BeginPaint()和EndPaint(). 只有WM_PAINT消息处理能使用这两个函数。实际上默认消息处理函数DefWindowProc()对WM_PAINT的处理方式就是:

 

 

BeginPaint()和EndPaint()之所以不可或缺,就是因为它们实现了validate过程。BeginPaint()的主要任务之一就是validate. 如果在WM_PAINT的消息处理中直接return 0,update region就始终不为空,系统就会不停地发送WM_PAINT消息。EndPaint()负责释放BeginPaint()返回的DC,做好善后工作(比如重新显示BeginPaint()隐藏起来的光标)。

最后还有一点需要额外说明:用WM_PAINT处理重画是异步(asynchronous)的。也就是说,在invalidate之后窗口并不会立即重画而是等到消息队列为空时再重画,这样就有一个时间差。这个事件差有时短到不被注意,但有时就是个大问题(尤其是当程序需要执行耗费时间的任务,如串口I/O)。这时可以采用同步重画法,直接用GetDC()获得hDC执行重画操作。如果非要使用WM_PAINT来同步重画(个人比较喜欢这种方法,和重画有关的代码就应该在WM_PAINT的处理程序里嘛),可以使用UpdateWindow()和RedrawWindow(). 这两个API函数会直接把WM_PAINT送进窗口的消息队列而不是应用程序的消息队列,这样就不用等到最后了。注意前者当update region不为空时才会发送WM_PAINT,后者的控制选项更为丰富。

 

 

4 关于对话框中图片控件的内容更新问题

加以加入定时器,在定时器处理函数中对数据进行处理

 

5 关于坐标系的问题

关于mfc中图像处理的类的问题,最好不要在mfc本身的dlg类中添加太多的东西,这样会造成代码管理的不方便以及思路的不清晰。

 

MFC图像处理,解决对话框最小化或改变对话框大小时图片被擦除,CBitmap实现双缓冲机制 Picture Control创建,添加变量m_bmpPic。 BOOL CYRDlg::OnInitDialog() { //.... //第二个参数是图片路径 HBITMAP hBitMap = (HBITMAP)::LoadImage(NULL, NULL, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); m_bmpPic.SetBitmap(... 阅读详情

相关推荐

MFC Windows 程序设计[三十二]之图片显示(附源码)

MFC是微软公司提供的一个类库(class libraries),用以减少应用程序开发人员的工作量。其中包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。有很多初学MFC的小伙伴们都觉得MFC比较难学,看书吧,看了就忘了,网上的一些教程又是写的含糊不清,故而学习起来很吃力...... 故此,本专栏亲自研究,实践,由易到难,层层深入,将调试过程中所遭所遇进行详细讲解,注意事项进行一一列举,希望能够帮助到各位初学MFC的小伙伴,避免走弯路,费时费力。

hnjzfwy的博客 241

MFC中使用Tab控件实现选项卡,外加图像控件显示图像

MFC中利用Tab控件实现了选项卡的功能呢给,同时在子对话框中利用图像控件显示图像,图像大小根据控件大小进行缩放!

MFC Windows 程序设计[三十八]之编辑图片(附源码)

MFC是微软公司提供的一个类库(class libraries),用以减少应用程序开发人员的工作量。其中包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。有很多初学MFC的小伙伴们都觉得MFC比较难学,看书吧,看了就忘了,网上的一些教程又是写的含糊不清,故而学习起来很吃力...... 故此,本专栏亲自研究,实践,由易到难,层层深入,将调试过程中所遭所遇进行详细讲解,注意事项进行一一列举,希望能够帮助到各位初学MFC的小伙伴,避免走弯路,费时费力。

hnjzfwy的博客 178

mfc双缓冲绘制动图

运用mfc双缓冲技术实现几何图形沿着指定的曲线移动,代码中包含多边形图形绘制代码,包含双缓冲绘图代码还有图形移动功能实现

窗口刷新问题(WM_PAINT、BeginPaint、EndPaint的说明)

1. 系统何时发送WM_PAINT消息?  系统会在多个不同的时机发送WM_PAINT消息:当第一次创建一个窗口时,当改变窗口的大小时,当把窗口从另一个窗口背后移出时,当最大化或最小化窗口时,等等,这些动作都是由 系统管理的,应用只是被动地接收该消息,在消息处理函数中进行绘制操作;大多数的时候应用也需要能够主动引发窗口中的绘制操作,比如当窗口显示的数据改变的时候,这一般是通过InvalidateRect和 InvalidateRgn函数来完成的。InvalidateRect和InvalidateRgn把指定

1008

MFC 对话框Picture Control(图片控件)中静态和动态显示Bmp图片

最近有同学问我如何实现MFC基于对话框在图片控件中加载图片?其实使用MFC显示图片的方法各种各样,但是还是有些同学不知道怎样显示.以前在《数字图像处理》课程中完成的软件都是基于单文档的程序,这里介绍两种在对话框picthre控件中显示BMP图片的最简单基础的方法.~~方法可能并不完美,高手忽略,但是提供一种能运行的方法,希望对刚接触这方面知识的同学有所帮助.可能你觉得...

杨秀璋的专栏 4万+

MFC 加载并显示图片

MFC加载并显示图片

enjoy.day 2万+

mfc窗口显示图片

第一天做了一个这个东西(OPENCV实现): 首先左边可以显示图片,在选择不同的图片后,通过抓图按钮将图片保存在右边的小窗口中。 今天解决一个图片显示自适应窗口的问题: 一般我们新建一个图片时,需要赋给图片长宽的大小,那么是不是可以将窗口的长宽赋给图片呢,答案是肯定

寂寞的秋叶 7850

MFC显示BMP格式图片

MFC显示BMP格式图片 去发现同类优质开源项目:https://gitcode.com/ 该资源文件是一个MFC工程,主要展示了如何使用VS2012 MFC显示BMP格式的图片。工程中包含详细的注释,方便理解代码的运作机制。 本工程是基于图像处理的基础知识,通过StrechBlt函数实现图片显示。 请尽情使用此资源,以助您更好地学习并掌握MFC图像处理的相关技能。 去发现同类优质开源项目:...

gitblog_06797的博客 316

MFC设置背景图片之一

前言 这种方法添加的图片不会随窗口大小的变化而变化,且添加图片的窗口上不能有其他控件,这个方法比较鸡肋,后续会给出实用点的方法,不过该方法能让你了解MFC添加bmp图及相关设置 准备 首先要明确,本次使用的是256色bmp图,如果你有喜欢的图,可以通过windows的画图另存为功能存为256色bmp图 添加图片 首先把你的图片保存到项目的res文件夹下 然后打开项目的资源视图,右击...

她的吻让他 2395

基于MFC的C++图片显示实现与控件设计

Windows应用程序开发中,MFC(Microsoft Foundation Classes)作为封装Windows API的C++类库,广泛应用于图形界面程序的设计与实现。对于图像显示功能而言,掌握MFC的基本框架和常用控件是实现图片加载与展示的前提。本章重点介绍MFC应用程序的基本结构、消息映射机制以及如何使用标准控件CStatic进行静态文本与图像的初步显示。// 示例:通过SS_BITMAP样式绑定位图资源CStatic控件虽常用于显示文本,但通过设置SS_BITMAP。

weixin_31486261的博客 958

671594_mfc图片浏览器开发详解

本文还有配套的精品资源,点击获取 简介:本文详述了如何基于Microsoft Foundation Classes (MFC)库开发图像浏览器。MFC库简化了Windows平台下的应用程序开发,特别是对于图像处理应用。文章指导读者如何利用Visual C++环境和MFC类库实现图像的加载、显示和用户交互功能,以及如何通过GDI+处理图形绘制任务。文档还提供了项目相关说明,帮...

weixin_35019679的博客 1018

mfc 双缓冲作图(使用cximage加载图像)

vc6版的双缓冲作图,使用cxiamge加载图像,已将cximage库编译好,而且程序中动态导入cximage库,不需要设置lib链接。 程序可以显示bmp和jpg的图像(同时也为其他格式预留了接口,参照着写即可),并且可以进行双缓冲作图。 程序基本属于框架类,比较简洁,适用于2次开发。

MFC双缓冲及重绘示例

/* 整理: 1、双缓冲绘图技术概述 原理:将一般的在CDC中绘图改成在一内存设备中绘图(CDC型变量,一般命名为pMemDC),然后使用BitBlt()函数将pMemDC中的图像复制到CDC中; 步骤: ①创建内存设备CDC *pMemDC;关联设备CreateCompatibleDC(); ②创建兼容位图 HBITMAP ::CreateCompatibleBitmap(); ③选入设备内存设备(HBITMAP)::SelectObject(m_hDC,hBitmap); ④内存设备绘图 ⑤复制到CDC,使用函数 BitBlt() 2、手动重绘 原理: 利用内存设备的BitBlt()函数将初始CDC选入。将上面第⑤步的设备互换。 */ /* 程序过程: 1、绘制背景,在函数DrawSome()中实现;并将其放在OnPaint()函数中,保证每次刷新时依然存在; 2、修改WM_ERASEBKGND消息响应函数,使得不加入背景刷(此步可以取消,暂时无影响,因为将DrawSome()放在了OnPaint()中); 3、响应鼠标左键按下,记录初始坐标点; 4、响应鼠标按下移动,并实时绘制矩形,此处用到双缓冲绘图技术; 5、响应鼠标左键松开,绘制红色矩形。 */

MFC解决窗口保存及重绘闪烁问题的一种比较好的方案 v1.0.5

包含文件说明: 1. SolveFlashingAndRedrawv1.0.5 纯净版 无闪烁的MFC应用框架,实际使用时把此工程改名成你要建立的项目名称,然后开始开发即可。你熟悉MFC的话研究这个框架的半个小时应该就明白并熟练运用了。 2.SolveFlashingAndRedrawv1.0.5 demo版 利用SolveFlashingAndRedrawv1.0.4框架写的一个示例小程序,主要展示框架要实现的优点特性。 3.VCRn 修改vc工程名工具 ___作者 田彬.exe 用网上找到的一个MFC改工程名称的小工具,很实用。如果你想使用本框架就可以用它来改成你想要的工程名了。 4. 未使用本框架的类似功能简化程序 没有使用框架的程序,实现的功能和Demo类似。但是运行之后改变窗口大小等,会发现图形闪烁很厉害! 5. SolveFlashingAndRedrawv1.0.5 demo版 运行截图.jpg 6. ReadMe.txt 说明文件。 补充说明: 工程使用vc6.0开发,如果你用vc6.0双击.dsw文件无法打开,请先打开vc6.0然后把.dsw拖动到vc上面。 如果这种方法还是无法打开,你新建一个vc6.0 mfc sdi程序,把示例中框架拷贝到这个新工程中,运行即可,代码量不是太多。 框架说明: /****************************************************** SolveFlashingAndRedraw框架说明 ******************************************************/ /** 项目名称: demo框架 版本号: v1.0.5 第一作者: Jef 地址: 中国/江苏 日期: 20100724 电子邮箱: dungeonsnd@126.com 版权: 1.您可以修改及免费使用本程序。 2.修改之后附上您的个人信息发送到上面的作者邮箱,作者负责在全面测试后发布您修改后的新版本。 3.您使用本程序而导致任何伤害以及经济损失,由过错方依法承担所有责任,一概与第一作者及合作单位无关。 4.如果您使用本程序则表示您已经同意此版本协议!否则请勿使用! 项目功能: SolveFlashingAndRedraw框架是MFC解决窗口保存及重绘闪烁问题的一种比较好的方案(Win32解决方法类似)。 版本历史: v1.0.1 20091126 第一版本 v1.0.2 20091212 第二版本 1. 修改了部分变量的名字使其更符合其意义 2. 增加为两个工程,一是带demo例子的,另一是不带demo的纯净版. 3. 修改了其中一个错误. 如 CreateCompatibleDC之后没有调用DeleteDC等. v1.0.3 对v1.0.2进行了整理 v1.0.4 20100416 在v1.0.3的基础上进行整理,并增加了裁剪区,提高了绘图效率! v1.0.5 20100724 1. 添加了一个工具类CMemBmpDc,帮助产生一个内存DC,并把指定的内存位图选进去。方便绘图。 2. 演示了在适当时机如何高效画图,见Demo版的DrawSinwave(bool bDrawOnScreen)函数。 演示了用两种方法来绘图, 方法1. 直接绘图到屏幕上, 同时绘图到内存位图上,内存位图不会立即贴到屏幕上减少了内存拷贝的时间,提高了效率, 将来窗口失效时OnPait贴图到屏幕上. 这种方法的优点时减小了不必要的内存拷贝,缺点时当绘图内存复杂并且非常耗时可能会导致闪烁。 故适用于像本Demo的这样绘图(本例函数只绘制一小段直线)。 方法2. 绘制到内存位图上后把应该重绘的这一小块设成裁剪区,然后立即OnPait重绘这个裁剪区。 运行步骤: 直接运行demo里面的程序,在窗口上任意拖拉鼠标画线,然后点击菜单栏的几个示范菜单项,然后移动窗口、 改变窗口大小、最大最小化窗口、用其它窗口覆盖此窗口、鼠标放到任务栏。。。 以上种种操作观察窗口内的图像变化。可以发现窗口内图像几乎看不到闪烁,而且窗口的元素已经保存下来重绘时任然可以看到图像。 如何使用: 进行项目开发时,可以先建立项目,然后把本解决方案框架拷贝到新建项目中即可。 也可以自己根据需要修改纯净版。 其它: 友情提示,小心 View类头文件及View类的实现文件中有说明,使用时别把它弄到你实际项目里哦! 进行大量复杂的图形的输出,而且对效率要求特别高时要考虑适当修改此框架(如增加裁剪区)后再使用哦。 关于如何在此框架的基础上提高绘图效率可以参阅下面的文章 如何提高绘图的效率 文章摘录 http://hi.baidu.com/new8sun/blog/item/68ccba8a80c3aadafc1f1079.html MFC双缓冲解决图象闪烁 2009-06-13 23:03 显示图形如何避免闪烁,如何提高显示效率是问得比较多的问题。而且多数人认为MFC的绘图函数效率很低,总是想寻求其它的解决方案。 MFC的绘图效率的确不高但也不差,而且它的绘图函数使用非常简单,只要使用方法得当,再加上一些技巧,用MFC可以得到效率很高的绘图程序。

MFC中双缓冲绘图,使用位图掩码技术

MFC中如何实现双缓冲绘图,并且实现如何去除位图中的指定颜色,如去除图片底色等等。不懂请参看代码

基于MFC的C++多窗口图片处理应用实战

MFC(Microsoft Foundation Classes)是一个强大的C++类库,由微软公司于1992年推出,它封装了Windows API,使得开发Windows应用程序更为简便。MFC库以面向对象的方式提供了大量预定义的界面和控制元素,比如按钮、文本框、窗口等,极大地降低了Windows程序开发的复杂性。GDI+是Windows操作系统中的图形设备接口,它提供了丰富的图形处理功能,广泛应用于图像处理、界面设计等领域。

weixin_34547628的博客 879

OpenCV图像在MFC对话框中的显示与类实现

CvvImage 是一个在OpenCV中用于图像处理的辅助类,它在图像的加载、处理和显示方面起着桥梁的作用。这个类通常用于将 OpenCV 的 cv::Mat 图像格式和 MFC 应用程序中的图像格式进行转换。为了实现这一功能,CvvImage类定义了一些私有成员变量和公共接口。该类的定义大致如下所示:public:CvvImage();// 默认构造函数// 复制构造函数// 析构函数// 其他公有成员函数...private:// 存储BGR格式图像的指针// 图像宽度。

weixin_29443363的博客 1264

MFC框架下实现图片双缓冲加载与滚轮缩放功能实战

htmltable {th, td {th {pre {简介:本文深入探讨在Microsoft Foundation Class (MFC) 框架中实现图片的双缓冲加载与鼠标滚轮缩放功能。MFC作为C++开发Windows应用的重要类库,提供了强大的图形界面处理能力。项目通过CImage类实现对BMP、JPEG、PNG等常见图像格式的加载与显示,并采用双缓冲技术有效避免界面绘制时的闪烁与撕裂问题,提升视觉体验。

weixin_42600407的博客 896
上一篇: lib和dll文件的区别和联系
下一篇: win32下用mfc的类出现的问题
furtherli
博客等级 码龄17年 2粉丝 3原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值