介绍和相关信息:
我已经实现了主窗口背景和其子静态控件的复杂绘制。
下面的图片展示了它的外观。
静态控件具有SS_NOTIFY
样式,这一点很重要,因为当用户点击它们时会发生某些事情。
此时,单击它们激活的操作并不相关。
主窗口和静态控件都具有渐变背景,这是通过使用GradientFill(...)
API实现的。
主窗口的顶部横幅是用灰色画刷创建的,网格线是使用LineTo(...)
和MoveTo(...)
API创建的。
橙色静态控件上的地图和左上角的标志是EMF
文件,右上角的标志是PNG
文件,其他图片是位图。
橙色静态控件有4个子静态控件,这些控件是owner drawn
并且也具有SS_NOTIFY
样式。
这是我能想到的唯一方法,它使我能够按照要求绘制控件(如果我能改进这个方法,请建议,我会接受任何合理的建议)。
为了绘制橙色静态控件,我决定在WM_CTLCOLORSTATIC
处理程序中绘制其背景,并在子类过程中绘制子静态控件。
从子静态控件接收到的通知也在橙色静态控件的子类过程中处理,因为我不知道如何将它们转发给父窗口,但由于它们此时也不相关,所以被省略了。
我决定提供演示项目的链接,而不是用代码片段让这篇文章变得很长。
我已经尽可能地提交了简单小巧的演示应用程序。
我没有吝啬评论,因此我相信源代码中的所有内容都很好地涵盖和解释了。
如果仍有问题,请留言,我会尽快回复(通常是立即或同一天内回复)。
这是演示项目的链接:http://www.filedropper.com/geotermistgrafika_1
重要更新:
/==========================================================/
方括号中的文本是问题的原始部分,但现在已被省略,因为该项目存在内存泄漏。上面的链接链接到改进版本。
[响应成员xMRi的评论更新:此链接应该没问题:http://www.filedropper.com/geotermistgrafika]
/ ========================================================== /
我使用MS Visual Studio C++和纯Win32 API在Windows XP上工作。
一个注意事项:由于VS Express版没有资源编辑器,因此使用ResEdit从这里创建了资源文件和资源头:http://www.resedit.net/。
问题:
当我调整窗口大小时,静态控件会轻微闪烁。
解决问题的努力:
我认为我的代码没有内存泄漏-因此我怀疑这不是问题,但由于缺乏经验,如果可以确认我的假设,我将不胜感激。
我认为我已经正确处理了WM_ERASEBKGND
,并且我已经从我的窗口类中排除了样式CS_VREDRAW
和CS_HREDRAW
-因此不应该因此导致闪烁。
我忘记提到,我的窗口具有WS_CLIPCHILDREN
样式,因此我在回应成员Roger Rowland的评论下面提到了这一点。
我已经为两个处理程序实现了双缓冲,以避免闪烁。
问题:
如何修改演示项目中的代码以消除闪烁?
我需要建议如何优化
WM_PAINT
和WM_CTLCOLORSTATIC
处理程序,以使我的绘画代码更有效和更快。
第二个问题的小注释:
我想通过在主窗口的背景上绘制整个图片,并在对应静态控件的背景上放置透明的静态控件来改进我的代码。
那样,我只会在我的WM_CTLCOLORSTATIC
处理程序中返回NULL_BRUSH
,并在WM_PAINT
中完成所有工作。
我的想法正确吗?这可以工作吗?
谢谢。 问候。
WM_PAINT
中不做任何事情。所有的工作都在WM_CTLCOLORSTATIC
中完成,其中你只需要绘制一次屏幕。(将所有内容组合成一个位图,然后使用BitBlt
将位图复制到屏幕上。) - Raymond Chen