简介及相关信息:
我有一个复杂的绘画要在我的主窗口中实现WM_PAINT
处理程序。
我提交了下面的图片来说明:
主窗口有静态控件,而不是具有样式的按钮SS_NOTIFY
.
当用户单击它们时,程序中会发生某些操作。
下图显示了主窗口中静态控件的位置:
橙色面板上的地图是EMF
文件,左上角和右上角的标志是PNG
文件,其他图片是位图。
为了实现这个任务,我决定把整个图画出来WM_PAINT
,并对对应图片上的图像放置不可见的静态控件。
因此,我只返回NULL_BRUSH
in WM_CTLCOLORSTATIC
像这样的处理程序:
case WM_CTLCOLORSTATIC:
return (LRESULT)( (HBRUSH)GetStockObject(NULL_BRUSH) );
我致力于Windows XP
, using MS Visual Studio C++ 2008 Express Edition
and pure Win32 API
.
One note:从 VS 的 Express 版本开始doesn't有资源编辑器、资源文件和资源头是使用创建的ResEdit从这里:http://www.resedit.net/.
PROBLEM:
当我调整窗口大小时,静态控件会轻微闪烁。
我为解决问题所做的努力:
我已经处理过WM_ERASEBKGND
(回(LRESULT)1
),并且我排除了样式CS_VREDRAW
and CS_HREDRAW
从我的窗口类来看,因此不应因此而导致闪烁。
我的窗户没有WS_CLIPCHILDREN
style.
EDIT:为了回应下面的评论,我解释了为什么我的窗口没有设置这种样式:
问题是桌面图片的一部分在静态控件所在的位置可见。
我为两个处理程序实现了双缓冲,以避免闪烁。
我已经使用过该工具GDIView
,从这里下载:http://www.nirsoft.net/utils/gdi_handles.html追查GDI leaks
.
每次我调整窗口大小时,GDIView
在区域列中显示+4,这意味着我泄漏了区域。
我不明白这怎么可能,因为我不使用操作区域的 API。
为了准确说明我所面临的情况,我制作了一个演示应用程序,并附有详尽的评论:http://www.filedropper.com/geotermistgrafika
我相信这是比发布代码更有效的方法,因为它会消耗太多空间。
问题:
如何修改演示项目中的代码以消除闪烁?
我的方法是否错误?如果是,正确的方法是什么?
谢谢。
问候。