几年前(2008年),我使用PHP / Javascript / Ajax / css Advanced Child Support Calculator - May help to explain what I am replicating编写了一个在线儿童支持计算器。
一段时间后(2009年我认为)我开始为Windows写一个等价物,现在我正在重新审视这个。这个版本的基础正在发挥作用。
但是,当动态添加控件并重新绘制/重建窗口时,窗口会出现明显闪烁/变化的问题。
请注意!此计算器特定于澳大利亚。
简而言之,我想寻找一种方法,如果可能的话,只在添加完所有组件后刷新/重新显示/重绘窗口。
基本上,Windows控件需要动态添加/删除,具体取决于场景(涉及的成人和儿童的数量)。
添加或删除儿童或成人或执行计算会导致完全重建窗口。也就是说,销毁所有现有控件,然后添加所有有效控件(这可能通过复杂逻辑最小化)。
问题是控制被移除但是短暂地重新出现(以有序的方式)导致显示闪烁(为了更好的描述)。
以下屏幕截图显示了复杂因素(例如,每个定义的成人都有一个下拉菜单),但 flicckering (原文如此)。
这是初始显示的屏幕截图(目前确实非常难看): -
然后,如果添加成人(请注意,该成人3现在有一个额外下拉,新成人): -
现在,成人(如上所述)和儿童: -
明智的编码,有一个RebuildAll
函数。这有两个主要阶段。 (1)删除控件。 (2)重建(重新创建)适当的控件(Create Window
,SendMessage
' 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
。
我找到了SendMessage(hwnd, WM_SETREDRAW, FALSE, 0);
(TRUE要重新开启)。但是,这似乎压制了DestroyWindow
,因为控件的显示方面仍然存在(控件本身似乎没有响应)。
答案 0 :(得分:1)
通过消除过程,我在相关点上结合ShowWindow
和WM_SETREDRAW
来治愈闪烁。
简要地重新描述一下这个问题。添加儿童或成人或进行计算时。整个显示器重建。重建基本上包括两个阶段。首先,破坏现有的控制窗口,然后添加新的/替换的窗口控件集。
决议是: -
ShowWindow(hwnd,SW_SHOW);
(对于main / contains)
在所有预先存在的窗口控件已经完成之后
破坏。SendMessage(hwnd,
WM_SETREDRAW, FALSE, 0);
发出 WM_SETREDRAW FALSE消息。
没有正在使用任何ShowWindow
。ShowWindow(hwnd,SW_SHOW);
(对于主/包含窗口)。而不是看到控件出现然后消失," 闪烁的"。窗口空白一段时间,然后一次显示控件。
我仍然对实际发生的事情感到困惑,原因是: -
经过一番思考后,我决定在所有毁灭之后使用MessageBox
。显示消息时,窗口为空白。然而,当点击按钮并且处理恢复时,在控件数量相对较高的情况下,控件将出现然后以有序的方式消失,尽管它是暂时的。
我的猜测是,在现有区域中创建控件 控制已经,导致以前的控制暂时 显示。