我可以改进窗口重绘吗?如果可以,我该如何改进?

时间:2016-08-24 02:48:30

标签: winapi gcc user-controls c++14

几年前(2008年),我使用PHP / Javascript / Ajax / css Advanced Child Support Calculator - May help to explain what I am replicating编写了一个在线儿童支持计算器

一段时间后(2009年我认为)我开始为Windows写一个等价物,现在我正在重新审视这个。这个版本的基础正在发挥作用。

但是,当动态添加控件并重新绘制/重建窗口时,窗口会出现明显闪烁/变化的问题。

  

请注意!此计算器特定于澳大利亚。

简而言之,我想寻找一种方法,如果可能的话,只在添加完所有组件后刷新/重新显示/重绘窗口。

基本上,Windows控件需要动态添加/删除,具体取决于场景(涉及的成人和儿童的数量)。

添加或删除儿童或成人或执行计算会导致完全重建窗口。也就是说,销毁所有现有控件,然后添加所有有效控件(这可能通过复杂逻辑最小化)。

问题是控制被移除但是短暂地重新出现(以有序的方式)导致显示闪烁(为了更好的描述)。

以下屏幕截图显示了复杂因素(例如,每个定义的成人都有一个下拉菜单),但 flicckering (原文如此)。

这是初始显示的屏幕截图(目前确实非常难看): -

Initial Display

然后,如果添加成人请注意,该成人3现在有一个额外下拉,新成人): -

Adult Added

现在,成人(如上所述)和儿童: -

Adult and Child Added

明智的编码,有一个RebuildAll函数。这有两个主要阶段。 (1)删除控件。 (2)重建(重新创建)适当的控件(Create WindowSendMessage' s然后ShowWindow

至少有61个控件。控件的数量是 23 +((#children * 12) - 2)+(#children *(#Adults * 8))+((#adults * 10)-4)。可以说控件的数量快速/指数地增加。

我怀疑在完成所有构建之后,有可能推迟ShowWindow。解决方案与此一样简单(理论上),假设这是可行的,或者是否有另一种方法可以避免更改所有代码以删除“ShowWindow”的需要。并在构建结束时添加一个ShowWindow?

注意用一个明显减少个别ShowWindow" flicker"但是没有消除它。 (根据下面的更新)。

  

作为尾注,我非常确定某些东西应该是可行的   Windows程序我要约会的速度很差   浏览器/ javascript版本,基本上做同样的事情   在Windows上(尽管是64位)。

更新

我仔细检查了所有ShowWindows函数中的AddItem????,并在调用所有函数的函数中添加了ShowWindows。这改善了事情。但是,在删除所有控件时,许多DestroyWindow调用仍然会导致闪烁。所以现在我想我正在寻找可以禁用它们的东西,显然是在做ShowWindow

更新2

我找到了SendMessage(hwnd, WM_SETREDRAW, FALSE, 0);(TRUE要重新开启)。但是,这似乎压制了DestroyWindow,因为控件的显示方面仍然存在(控件本身似乎没有响应)。

1 个答案:

答案 0 :(得分:1)

通过消除过程,我在相关点上结合ShowWindowWM_SETREDRAW来治愈闪烁。

简要地重新描述一下这个问题。添加儿童或成人或进行计算时。整个显示器重建。重建基本上包括两个阶段。首先,破坏现有的控制窗口,然后添加新的/替换的窗口控件集。

决议是: -

  1. 发出 ShowWindow(hwnd,SW_SHOW); (对于main / contains) 在所有预先存在的窗口控件已经完成之后 破坏。
  2. 在重建Windows控件之前,根据SendMessage(hwnd, WM_SETREDRAW, FALSE, 0);发出 WM_SETREDRAW FALSE消息没有正在使用任何ShowWindow
  3. 通过各种功能构建Windows控件。
  4. 最后,在构建完所有Windows控件后,发出一个 ShowWindow(hwnd,SW_SHOW); (对于主/包含窗口)。
  5. 而不是看到控件出现然后消失," 闪烁的"。窗口空白一段时间,然后一次显示控件。

    我仍然对实际发生的事情感到困惑,原因是: -

    经过一番思考后,我决定在所有毁灭之后使用MessageBox。显示消息时,窗口为空白。然而,当点击按钮并且处理恢复时,在控件数量相对较高的情况下,控件将出现然后以有序的方式消失,尽管它是暂时的。

      

    我的猜测是,在现有区域中创建控件   控制已经,导致以前的控制暂时   显示。