【Visual C++】Windows GDI贴图闪烁解决方法

深入分析MFC之GDI原理透析 为什么会使用GDI呢? 首先要理解一般显示器,是将要显示的内容存放在显存中,framebuffer就是用来存储显示的数据,由DMA自动读取数据将其显示在窗口中,而这里显示的只是一个个的像素点。通常是先显示一行的像素点,发出水平同步信号后,再显示下一行,当整个一屏幕的数据显示完全后,才会发出垂直同步信号,发出下一帧数据。注意这里。。。 MFC如何使用GDI? 首先对于GDI而言,他并不是将图像直接显示在设备上,而是将显示的数据首先绘制在一个设备描述表DC中,这里面存储了显示图像的描述字段,包括物理设备和各种状 阅读详情

转自:http://blog.youkuaiyun.com/poem_qianmo/article/details/7436397


一般的windows 复杂的界面需要使用多层窗口而且要用贴图来美化,所以不可避免在窗口移动或者改变大小的时候出现闪烁。

先来谈谈闪烁产生的原因

原因一:
如果熟悉显卡原理的话,调用GDI函数向屏幕输出的时候并不是立刻就显示在屏幕
上只是写到了显存里,而显卡每隔一段时间把显存的内容输出到屏幕上,这就是刷新周期。

一般显卡的刷新周期是 1/80秒左右,具体数字可以自己设置的。

这样问题就来了,一般画图都是先画背景色,然后再把内容画上去,如果这两次操作不在同一个
刷新周期内完成,那么给人的视觉感受就是,先看到只有背景色的图像,然后看到画上内容的图像,
这样就会感觉闪烁了。

解决方法:尽量快的输出图像,使输出在一个刷新周期内完成,如果输出内容很多比较慢,那么采用
内存缓冲的方法,先把要输出的内容在内存准备好,然后一次输出到显存。要知道一次API调用一般可以
在一个刷新周期内完成。

对于GDI,用创建内存DC的方法就可以了

原因二:

复杂的界面有多层窗口组成,当windows在窗口改变大小的时候是先重画父窗口,然后重画子窗口,子父
窗口重画的过程一般无法在一个刷新周期内完成,所以会呈现闪烁。

我们知道父窗口上被子窗口挡住的部分其实没必要重画的

解决方法:给窗口加个风格 WS_CLIPCHILDREN ,这样父窗口上被子窗口挡住的部分就不会重画了。

如果同级窗口之间有重叠,那么需要再加上 WS_CLIPSIBLINGS 风格

原因三:

有时候需要在窗口上使用一些控件,比如IE,当你的窗口改变大小的时候IE会闪烁,即使你有了WS_CLIPCHILDREN
也没用。原因在于窗口的类风格有CS_HREDRAW 或者 CS_VREDRAW,这两个风格表示窗口在宽度或者高度变化的时候
重画,但是这样就会引起IE闪烁

解决方法:注册窗口类的时候不要使用这两个风格,如果窗口需要在改变大小的时候重画,那么可以在WM_SIZE的时候
调用RedrawWindow。

原因四:

界面上窗口很多,而且改变大小时很多窗口都要移动和改变大小,如果使用MoveWindow或者SetWindowPos两个API来
改变窗口的大小和位置,由于他们是等待窗口重画完成后才返回,所以过程很慢,这样视觉效果就可能会闪烁。

解决方法:

使用以下API来处理窗口移动,BeginDeferWindowPos, DeferWindowPos,EndDeferWindowPos
先调用 BeginDeferWindowPos 设定需要移动的窗口的个数
使用DeferWindowPos,来移动窗口,这个API并不真的造成窗口移动
EndDeferWindowPos 一次性完成所有窗口的大小和位置的改变。

有个地方要特别注意,要仔细计算清楚要移动多少个窗口,BeginDeferWindowPos设定
的个数一定要和实际的个数一致,否则在Win9x下,如果实际移动的窗口数多于调用BeginDeferWindowPos
时设定的个数,可能会造成系统崩溃。在Windows NT系列下不会有这样的问题。


Visual C++ MFC指针式时钟开发:GDI绘图与Windows消息机制实战 在Windows桌面应用开发中,图形设备接口(GDI)是实现自定义绘图的核心技术,它允许开发者通过代码精确控制图形元素的绘制。其原理是通过设备上下文(DC)提供绘图接口,结合数学计算(如三角函数)实现坐标转换与图形渲染。掌握GDI不仅能深入理解Windows图形子系统,还能为后续学习DirectX等高级图形技术打下基础。在工程实践中,GDI常与消息循环机制结合,例如通过定时器消息驱动动画更新,实现动态效果。本文以指针式时钟为例,具体展示了如何运用GDI绘制表盘刻度与指针,并利用定时器实现秒针平滑移动,同时涉 阅读详情

相关推荐

Go实战--使用golang开发Windows Gui桌面程序(lxn/walk)

生命不止,继续 go go go!!!golang官方并没有提供Windows gui库,但是今天还是要跟大家分享一下使用golang开发Windows桌面程序,当然又是面向github编程了。知乎上有一个问答: golang为什么没有官方的gui包?这里,主要使用第三方库lxn/walk,进行Windows GUI编程。lxn/walkgithub地址: https://github.com/

一蓑烟雨任平生 也无风雨也无晴 9万+

解决Windows 程序界面闪烁问题的一些经验

一般的windows 复杂的界面需要使用多层窗口而且要用贴图来美化,所以不可避免在窗口移动或者改变大小的时候出现闪烁。先来谈谈闪烁产生的原因原因一:如果熟悉显卡原理的话,调用GDI函数向屏幕输出的时候并不是立刻就显示在屏幕上只是写到了显存里,而显卡每隔一段时间把显存的内容输出到屏幕上,这就是刷新周期。一般显卡的刷新周期是 1/80秒左右,具体数字可以自己设置的。这样问题就来了,一般

gxh973121的资料 1629

OpenGL与GDI混合编程:Visual C++图形绘制实战解析

在Windows图形编程中,GDI与OpenGL分别代表了CPU软绘制与GPU硬件加速两条技术路径。GDI擅长线条、文字等基础2D绘制,而OpenGL通过渲染管线和着色器实现复杂3D场景与高效图形输出。理解二者在像素格式、渲染上下文、双缓冲交换等底层机制上的差异,是构建混合渲染架构的关键。实际桌面应用中,常以GDI实现HUD、坐标轴等覆盖层,用OpenGL承载主场景渲染,兼顾开发效率与性能表现。本文以“OpenGL-Drawing.rar”示例工程为切入点,从工程配置、固定管线代码拆解到glUniformM

weixin_34356555的博客 304

Go语言学习笔记(十七)

命令行程序也叫命令行使用程序或工具,它被设计在终端运行。本章介绍如何使用Go语言创建命令行程序,您将了解如何分析参数以及如何创建子命令

LiMo-bit的杂货 485

GDI+“双缓冲”绘图,避免闪烁源码

资源介绍:。源码结合GDI+模块,在画板上画出和定位文本。资源作者:。@易语言自学网。资源界面:。资源下载:。

HALCON实战:用两个工业相机实现无缝大视野拼接(附完整代码与避坑指南)

本文详细介绍了使用HALCON软件实现双工业相机图像无缝拼接的完整解决方案,涵盖硬件配置、相机标定、坐标系转换和图像拼接等关键步骤。通过高精度标定和矩阵变换技术,可构建大视野检测系统,适用于液晶面板、PCB等工业检测场景,显著提升检测效率和精度。

weixin_29050513的博客 192

MapReduce 核心原理与调优实战:从分片到 Shuffle 的完整链路解析

大数据计算框架中,分布式数据处理是海量信息挖掘的基础能力。MapReduce 作为经典的分布式计算模型,通过“分而治之”的思想将复杂任务拆解为并行子任务。其核心机制包括输入分片(InputSplit)、环形缓冲区溢写、分区排序(Sort)以及 Shuffle 洗牌过程,这些设计共同保证了框架能在多节点环境下稳定高效运行。理解从 HDFS 读取数据、经过 Map 阶段处理、中间结果落盘、Reduce 拉取归并再到最终写回分布式存储的完整数据流,是掌握大数据调优的关键。实际应用中,数据倾斜、内存溢出和作业长时间

weixin_34327223的博客 169

从零到一:手把手教你用C# WinForms搭建工控上位机(含Panel控件布局与事件处理详解)

本文详细介绍了如何使用C# WinForms框架从零开始搭建工控上位机系统,重点讲解了Panel控件的布局技巧和事件处理机制。通过实战案例,帮助开发者掌握界面分区规划、动态窗体切换及数据通信等核心功能,适用于工业自动化监控系统的开发。

weixin_30321709的博客 611

[转]【Visual C++】Windows GDI贴图闪烁解决方法

一般的windows复杂的界面需要使用多层窗口而且要用贴图来美化,所以不可避免在窗口移动或者改变大小的时候出现闪烁。先来谈谈闪烁产生的原因原因一:如果熟悉显卡原理的话,调用GDI函数向屏幕输出的时候并不是立刻就显示在屏幕上只是写到了显存里,而显卡每隔一段时间把显存的内容输出到屏幕上,这就是刷新周期。一般显卡的刷新周期是1/80秒左右,具体数字可以自己设置的...

weixin_30849591的博客 83

【网络与爬虫 62】小程序爬虫终极攻略:微信支付宝小程序数据采集完全指南

本文深入解析微信和支付宝小程序的爬虫技术,从基础架构分析到高级逆向工程,涵盖WXML/AXML模板解析、API接口拦截、网络流量分析等核心技术。通过实战案例和代码示例,帮助开发者掌握小程序数据采集的完整技术栈。

熵数实验室 3420

基于Python的电商平台商品信息爬取与价格监控系统设计与实现

本文详细介绍了一个基于Python的电商平台商品信息爬取与价格监控系统的设计与实现。系统采用最新的Python爬虫技术栈,包括Scrapy框架、Selenium自动化测试工具、BeautifulSoup解析库等,实现了对主流电商平台商品信息的自动化采集、存储、分析和可视化展示。文章从系统架构设计、关键技术实现、核心代码解析等方面进行了全面阐述,并提供了完整的代码实现。该系统不仅适用于毕业设计,也可作为商业价格监控系统的原型。关键词:Python爬虫;电商数据采集;价格监控;Scrapy;Selenium;

2201_76125261的博客 964
上一篇: OpenCV中Mat与IplImage和CvMat类型之间的相互转换
下一篇: 可变参数函数的使用:va_start() , va_end() , va_list
知行且执行
博客等级 码龄14年 38粉丝 73原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值