Windows 更改组合框';项目';height lateron(用于DPI感知)

Windows 更改组合框';项目';height lateron(用于DPI感知),windows,mfc,dpi-aware,Windows,Mfc,Dpi Aware,背景: 我有一个带有每监视器DPI感知模式的MFC应用程序。当我将窗口切换到另一个具有另一屏幕缩放的监视器时,我接收并处理WM\u DPICHANGED\u AFTERPARENT消息 我的所有者绘制的组合框(样式为CBS\u OWNERDRAWFIXED)中已填充了需要根据新比例因子更新高度的项目。为此,我计算新高度并调用: SetItemHeight(-1, height); // resizes the closed box SetItemHeight(0, height); // do

背景:

我有一个带有每监视器DPI感知模式的MFC应用程序。当我将窗口切换到另一个具有另一屏幕缩放的监视器时,我接收并处理
WM\u DPICHANGED\u AFTERPARENT
消息

我的所有者绘制的组合框(样式为CBS\u 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%监视器时)。

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

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

这可能与您的问题无关,但您没有正确使用
索引
参数。根据,
nIndex必须为0,并且所有列表项的高度都将设置为
。在过去,当控件的某些内部状态需要更新时,我对使用
SetWindowPos()
函数()和
SWP\u FRAMECHANGED
有很好的经验。@VladFeinstein:谢谢!您的第一个提示实际上与此问题无关,但无论如何,它有助于简化我的代码。您的第二个提示尝试起来很有趣,但不幸没有帮助:-((但我找到了另一个解决方法,请参阅下面的答案)。