【问题标题】:Combo box in a MFC applicationMFC 应用程序中的组合框
【发布时间】:2017-10-20 09:11:22
【问题描述】:

我的问题是关于 Windows MFC 应用程序中的组合框。

组合框的下拉部分包含由位图和字符串组成的项目。

有时,字符串太长,我必须使用CComboBox::SetDroppedWidth() 方法调整组合框下拉部分的宽度。

我的问题是,当组合框靠近电脑屏幕的右边缘时,下拉菜单的右侧部分被隐藏(参见下面的image_1image_2)。

我希望它的行为类似于 Excel(请参阅下面的 image_3),这意味着我希望下拉列表相应地移动,以便可以看到其中的所有项目而不会被裁剪。

如何做到这一点?

image_1:下拉菜单的右侧部分未隐藏

image_2:靠近计算机右边缘,下拉菜单的右侧部分被隐藏

image_3:Excel 组合框

================================================ ===================

编辑 1

================================================ ===================

编辑 2

好的。我忘了提到 m_cbXmodels 是一个 CComboBoxEx 对象。这就是句柄为 NULL 的原因。我可以通过GetComboBoxCtrl()获取句柄...

【问题讨论】:

标签: combobox mfc dropdown


【解决方案1】:

处理CBN_DROPDOWN 通知。

使用GetComboBoxInfo 获取列表控件的句柄。

现在使用 MoveWindow 根据需要调整窗口。

通过MonitorFromWindow 可以获取当前屏幕尺寸。请参阅MONITORINFO 中的rcWork 成员。只需要调整左右坐标即可。

编辑:正如您在 cmets 中所读到的:我的 CBN_DROPDOWN 方法是早期的,感谢 zett42)。无法在此处调整组合框列表部分的大小。
但是可以将用户定义的消息发布到同一个窗口并重新定位窗口。

【讨论】:

  • 谢谢。当我调用 GetComboBoxInfo() 时,我注意到列表控件的句柄为 NULL(hwndCombo、hwndItem 和 hwndList 为 NULL)。
  • 你必须预设cbSize成员!
  • 新问题:下拉列表不动。代码为:HWND hwndList = info.hwndList; ::MoveWindow(hwndList, 40, 40, 100, 100, 1);
  • @LéaMassiot 来自 CBN_DROPDOWN 的 MSDN 参考:当组合框的列表框 *about* 可见时发送。 - 所以 MoveWindow 可能会出现到早。尝试做一个PostMessage(WM_APP + n),为WM_APP + n 添加一个消息映射条目,并在你的这个消息的处理程序中做MoveWindow。这应该在组合框完成列表框的默认定位之后安排您的MoveWindow
  • 在我看来,组合框类确实应该在默认情况下更新以执行此操作。
猜你喜欢
  • 1970-01-01
  • 2012-01-23
  • 1970-01-01
  • 2011-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多