Windows 使用SetDroppedWidth后,MFC组合框下拉按钮丢失

Windows 使用SetDroppedWidth后,MFC组合框下拉按钮丢失,windows,winapi,mfc,gdi,Windows,Winapi,Mfc,Gdi,这是一个Windows MFC编程问题。 我有一个派生的cmbobox,它实现了自己的项目绘制和测量。我做了一点改进,下拉列表的宽度可以根据列表内容进行调整。 我在OnDropDown消息处理程序中使用SetDroppedWidth来完成此操作。 插入字符串并单击组合框后,选定的字符串内容占据了所有静态/编辑区域,并且缺少下拉按钮。 我可以看到项目ID为-1的项目的宽度在ItemDraw方法中被更改/重置为新的删除宽度。我认为这不是正确的行为。我希望新的删除宽度仅对列表项生效,列表项的项ID不小

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

试着用这个

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

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

::PostMessage(m_myComboBox.GetSafeHwnd(), CB_SETDROPPEDWIDTH, nWidth, 0); 
试着用这个

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

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

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

初始化组合框项目后,尝试调用SetDroppedWidth。我认为在OnDropDown方法中调用它是不正确的,但是这样,combobox宽度只能调整一次,因为初始化只调用一次。在初始化combobox项后,尝试调用SetDroppedWidth。我认为在OnDropDown方法中调用它是不合适的,但是这样,组合框的宽度只能调整一次,因为初始化只调用一次。谢谢!它起作用了。为什么选择PostMessage而不选择SendMessage?通常,当您从消息处理程序中发送消息时,会导致各种各样的问题。发布消息只会将其放入消息队列中。谢谢!它起作用了。为什么选择PostMessage而不选择SendMessage?通常,当您从消息处理程序中发送消息时,会导致各种各样的问题。发布消息只会将其放入消息队列中。