2

背景:

我有一个具有每显示器 DPI 感知模式的 MFC 应用程序。当我将窗口转移到另一个具有另一个屏幕缩放比例的监视器时,我会接收并处理该WM_DPICHANGED_AFTERPARENT消息。

我的所有者绘制的组合框(带有 style CBS_OWNERDRAWFIXED)已经填充了我需要根据新的缩放因子更新高度的项目。为此,我计算新高度并调用:

SetItemHeight(-1, height); // resizes the closed box
SetItemHeight(0, height); // do this on every item's index from 0 to n

问题:在以前的缩放中尚未打开的组合框,但在更改项目高度后打开的组合框出现错误。列表以所有条目的后半部分打开,下半部分为空。关闭并重新打开它可以解决问题。

我尝试了从其他更新问题(例如,显示和隐藏组合框)中知道的解决方法Invalidate(),但它没有帮助。完全重新填写所有条目有效,但这很慢并且会导致闪烁(我在那个窗口中有 12 个这样的框)。

任何想法?谢谢!

编辑:问题显然只发生在增加项目的高度时(所以当我的窗口从 100% 移动到 200% 监视器时)。

4

1 回答 1

0

在绝望地尝试了许多尝试之后,我找到了一种解决方法,它似乎有助于通过添加一个虚拟条目并再次删除它而导致问题的所有情况:

// Workaround to avoid combo box bug after resizing (esp. enlarging) the entries' height:
int idx = AddString(L"");
DeleteString(idx);
于 2019-10-07T14:47:36.103 回答