稍后更改组合框的项目高度(以了解DPI)

时间:2019-10-02 15:58:35

标签: windows mfc dpi-aware

背景:

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

我的所有者绘制的组合框(样式为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%监视器时会出现此问题。)

1 个答案:

答案 0 :(得分:0)

经过反复尝试后,我发现了一种变通办法,它似乎可以解决所有情况,通过添加虚拟条目并再次将其删除来解决问题:

// Workaround to avoid combo box bug after resizing (esp. enlarging) the entries' height:
int idx = AddString(L"");
DeleteString(idx);