【问题标题】:The MFC ComboBox dropdown button is missing after using SetDroppedWidth使用 SetDroppedWidth 后 MFC ComboBox 下拉按钮丢失
【发布时间】:2013-02-21 22:40:25
【问题描述】:

这是一个 Windows MFC 编程问题。 我有一个派生的 CComboBox 实现自己的项目绘制和测量。我做了一些改进,下拉列表宽度可以根据列表内容进行调整。 我在 OnDropDown 消息处理程序中使用 SetDroppedWidth 来做到这一点。 插入字符串并单击组合框后,所选字符串内容占用了所有静态/编辑区域,并且缺少下拉按钮。 我可以看到项目 ID 为 -1 的项目的宽度已更改/重置为 ItemDraw 方法中新放置的宽度。我不认为这是正确的行为。我希望新的下拉宽度仅对列表项生效,其项 ID 不小于 0。 有什么想法吗?

【问题讨论】:

  • 在初始化组合框项目后尝试调用 SetDroppedWidth。我认为在 OnDropDown 方法中调用它不是一个正确的地方
  • 但是这样一来,combobox的宽度只能调整一次,因为初始化只调用了一次。

标签: windows winapi mfc gdi


【解决方案1】:

尝试使用它。

在您的 OnDropDown 处理程序中调用 CComboBox::GetComboBoxInfo。它将返回COMBOBOXINFO 结构的指针。此结构中包含下拉列表框hwndList 的HWND。直接在这个 hwndList 上使用 MoveWindow() API,看看它是否有效

如果这不起作用,请尝试发布CB_SETDROPPEDWIDTH 消息。如您所知,SetDroppedWidth 只是CB_SETDROPPEDWIDTH 消息的包装器。它被实现为SendMessage 调用。试试这个:

::PostMessage(m_myComboBox.GetSafeHwnd(), CB_SETDROPPEDWIDTH, nWidth, 0); 

【讨论】:

  • 谢谢!有用。为什么选择 PostMessage 而不是 SendMessage?
  • 通常当您从消息处理程序中发送消息时,它会导致各种麻烦。发布消息只是将其放入消息队列中。
猜你喜欢
  • 1970-01-01
  • 2010-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-22
相关资源
最近更新 更多