我可以改进 window 重绘吗?如果可以,我该怎么做?
Can I improve upon window redraw and if so how can I?
几年前 (2008) 我写了一个在线 Child 支持计算器 使用 PHP/Javascript/Ajax/css Advanced Child Support Calculator - May help to explain what I am replicating.
一段时间后(我想是 2009 年)我开始为 Windows 写一个等价物,现在正在重新审视它。此版本的基础功能正常。
但是,当动态添加控件并且 window 为 redrawn/rebuilt 时,我的 window 问题明显 flickering/changing。 89=]
Note! This calculator is specific to Australia.
简而言之,我正在寻找一种方法,如果可能的话,在添加所有组件后仅 refresh/re-display/redraw window。
基本上,windows 控件需要动态 added/removed 取决于场景(涉及的成人和 children 的数量)。
添加或删除 child 或成人或执行计算,会导致 window 的完整重建。也就是说,所有现有控件都被销毁,然后添加所有有效控件(这可能可以通过复杂的逻辑最小化)。
问题是控件被删除但短暂地重新出现(以有序的方式)导致显示闪烁(需要更好的描述)。
以下屏幕截图展示了复杂性因素(例如 child 为每个定义的成人都有一个下拉列表),但没有 闪烁 (sic)。
这是初始显示的屏幕截图(目前还算丑陋):-
然后如果添加 成人(请注意 child 现在有一个 额外的下拉列表 for Adult 3, 新成人):-
现在,成人(如上)和Child:-
编码方面,有一个 RebuildAll
函数。这有两个主要阶段。 (1) 取消控制。 (2) 重建(重新创建)相应的控件(Create Window
、SendMessage
和 ShowWindow
)
至少有 61 个控件。控件的数量是
23 + ((#children * 12) - 2) + (#children * (#Adults * 8 )) + ((#adults * 10) -4)。可以说控件的数量增加了 rapidly/exponentially.
我怀疑可以将 ShowWindow
推迟到所有构建完成之后。解决方案是否像这样简单(理论上),假设这是可行的,或者是否有另一种方法可以避免更改所有代码以删除 'ShowWindow' 并在构建结束时添加 ShowWindow 的需要?
请注意,将单个 ShowWindow
替换为一个显着减少了 "flicker",但并未消除它。(根据下面的 更新)。
As an endnote I'm pretty sure that something should be feasible as the
windows program I have to date is a very poor reflection of the speed
of the browser/javascript version, which basically does the same thing
on windows (albeit 64bit).
更新
我浏览并注释掉了所有AddItem????
函数中的ShowWindows
,并在调用所有函数的函数中添加了一个ShowWindows
。这改善了事情。但是,在删除所有控件时,大量 DestroyWindow
调用仍然会导致闪烁。所以现在我想我正在寻找可以禁用它们的东西,显然相当于 ShowWindow
.
更新 2
我找到了 SendMessage(hwnd, WM_SETREDRAW, FALSE, 0);
(正确打开绘图)。但是,这似乎抑制了 DestroyWindow
,因为控件的显示方面仍然存在(尽管控件本身似乎没有响应)。
通过消除过程,我在相关点结合 ShowWindow
和 WM_SETREDRAW
消除了闪烁。
简单地重新描述一下这个问题。添加儿童或成人,或进行计算时。整个显示被重建。重建基本上包括两个阶段。首先,销毁现有控件 windows,然后添加 new/replacement 组 window 的控件。
决议是:-
- 发出
ShowWindow(hwnd,SW_SHOW);
(对于main/containing
window) 在所有预先存在的 windows 控件被删除之后
销毁。
- 在重建 windows 控件之前,根据
SendMessage(hwnd,
WM_SETREDRAW, FALSE, 0);
发出 WM_SETREDRAW FALSE 消息。
没有任何ShowWindow
被使用。
- 通过各种函数构建 windows 控件。
- 最后,当所有 windows 控件都构建完成后,发出一个
ShowWindow(hwnd,SW_SHOW);
(对于 main/containing window)。
而不是看到控件出现然后消失,“闪烁”。 window一会空白,然后一下子显示所有控件。
我仍然对实际发生的事情感到困惑,因为:-
经过深思熟虑,我决定在所有破坏之后使用 MessageBox
。显示消息时,window 为空白。但是,当单击按钮并恢复处理时,在控件数量相对较多的情况下,控件会以有序的方式出现然后消失,尽管只是暂时的。
My guess, is that creating a control in an area where an existing
control had been, was causing that previous control to momentarily
display.
几年前 (2008) 我写了一个在线 Child 支持计算器 使用 PHP/Javascript/Ajax/css Advanced Child Support Calculator - May help to explain what I am replicating.
一段时间后(我想是 2009 年)我开始为 Windows 写一个等价物,现在正在重新审视它。此版本的基础功能正常。
但是,当动态添加控件并且 window 为 redrawn/rebuilt 时,我的 window 问题明显 flickering/changing。 89=]
Note! This calculator is specific to Australia.
简而言之,我正在寻找一种方法,如果可能的话,在添加所有组件后仅 refresh/re-display/redraw window。
基本上,windows 控件需要动态 added/removed 取决于场景(涉及的成人和 children 的数量)。
添加或删除 child 或成人或执行计算,会导致 window 的完整重建。也就是说,所有现有控件都被销毁,然后添加所有有效控件(这可能可以通过复杂的逻辑最小化)。
问题是控件被删除但短暂地重新出现(以有序的方式)导致显示闪烁(需要更好的描述)。
以下屏幕截图展示了复杂性因素(例如 child 为每个定义的成人都有一个下拉列表),但没有 闪烁 (sic)。
这是初始显示的屏幕截图(目前还算丑陋):-
然后如果添加 成人(请注意 child 现在有一个 额外的下拉列表 for Adult 3, 新成人):-
现在,成人(如上)和Child:-
编码方面,有一个 RebuildAll
函数。这有两个主要阶段。 (1) 取消控制。 (2) 重建(重新创建)相应的控件(Create Window
、SendMessage
和 ShowWindow
)
至少有 61 个控件。控件的数量是 23 + ((#children * 12) - 2) + (#children * (#Adults * 8 )) + ((#adults * 10) -4)。可以说控件的数量增加了 rapidly/exponentially.
我怀疑可以将 ShowWindow
推迟到所有构建完成之后。解决方案是否像这样简单(理论上),假设这是可行的,或者是否有另一种方法可以避免更改所有代码以删除 'ShowWindow' 并在构建结束时添加 ShowWindow 的需要?
请注意,将单个 ShowWindow
替换为一个显着减少了 "flicker",但并未消除它。(根据下面的 更新)。
As an endnote I'm pretty sure that something should be feasible as the windows program I have to date is a very poor reflection of the speed of the browser/javascript version, which basically does the same thing on windows (albeit 64bit).
更新
我浏览并注释掉了所有AddItem????
函数中的ShowWindows
,并在调用所有函数的函数中添加了一个ShowWindows
。这改善了事情。但是,在删除所有控件时,大量 DestroyWindow
调用仍然会导致闪烁。所以现在我想我正在寻找可以禁用它们的东西,显然相当于 ShowWindow
.
更新 2
我找到了 SendMessage(hwnd, WM_SETREDRAW, FALSE, 0);
(正确打开绘图)。但是,这似乎抑制了 DestroyWindow
,因为控件的显示方面仍然存在(尽管控件本身似乎没有响应)。
通过消除过程,我在相关点结合 ShowWindow
和 WM_SETREDRAW
消除了闪烁。
简单地重新描述一下这个问题。添加儿童或成人,或进行计算时。整个显示被重建。重建基本上包括两个阶段。首先,销毁现有控件 windows,然后添加 new/replacement 组 window 的控件。
决议是:-
- 发出
ShowWindow(hwnd,SW_SHOW);
(对于main/containing window) 在所有预先存在的 windows 控件被删除之后 销毁。 - 在重建 windows 控件之前,根据
SendMessage(hwnd, WM_SETREDRAW, FALSE, 0);
发出 WM_SETREDRAW FALSE 消息。 没有任何ShowWindow
被使用。 - 通过各种函数构建 windows 控件。
- 最后,当所有 windows 控件都构建完成后,发出一个
ShowWindow(hwnd,SW_SHOW);
(对于 main/containing window)。
而不是看到控件出现然后消失,“闪烁”。 window一会空白,然后一下子显示所有控件。
我仍然对实际发生的事情感到困惑,因为:-
经过深思熟虑,我决定在所有破坏之后使用 MessageBox
。显示消息时,window 为空白。但是,当单击按钮并恢复处理时,在控件数量相对较多的情况下,控件会以有序的方式出现然后消失,尽管只是暂时的。
My guess, is that creating a control in an area where an existing control had been, was causing that previous control to momentarily display.