当我使用函数combobox_setcursel时,cbn_selchange通知不起作用
The CBN_SELCHANGE notification not works when i use the function ComboBox_SetCurSel
我在窗口中有一个ComboBox,我想在更改选定的项目后执行功能。当我通过鼠标或键盘更改Combobox的选定项目时,窗口消息中的CBN_SELCHANGE
事件WM_COMMAND
效果很好,我的功能执行。
但是,如果我使用函数ComboBox_SetCurSel
来更改所选项目,则无效。
我使用什么窗口消息WM_****
和Combox通知我用于处理事件更改选定项目的事件。
通常,当您编程操纵控件时,相应的通知是 not 发送给其父的。仅当用户操纵控件时,该通知才会发送。
因此,当您调用ComboBox_SetCurSel
(这是执行与发送CB_SETCURSEL
消息相同的任务的宏)时,该编程方式更改控件的当前选择,因此不是发送CBN_SELCHANGE
通知。但是,如果用户更改ComboBox的选择,则CBN_SELCHANGE
die 会发送。
在CBN_SELCHANGE
的文档的"备注"部分中明确提出了这一点:
使用
CB_SETCURSEL
消息设置当前选择时,CBN_SELCHANGE
通知代码未发送。
要解决这个问题,您可以做两件事之一:
-
直接调用事件处理程序方法。例如,在MFC中,您将拥有框架附加
OnCbnSelChange
成员函数以处理Combobox的CBN_SELCHANGE
通知。在称为ComboBox_SetCurSel
的代码之后,您只需手动调用OnCbnSelChange
成员函数:ComboBox_SetCurSel(hwndComboBox, 0); // select 1st item this->OnCbnSelChange(); // invoke the change event-handler
您的GUI框架无疑具有类似的东西。
-
手动将
CBN_SELCHANGE
通知发送给控件的父。我真的不知道为什么您会这样做,因为默认窗口过程在收到此通知后没有做任何有趣的事情。只要直接致电自己的处理程序,您就会更好。::PostMessage(hwndParent, WM_COMMAND, MAKEWPARAM(IDC_COMBOBOX, CBN_SELCHANGE), reinterpret_cast<LPARAM>(hwndComboBox);
或,如果您是从Combobox的一个子类中进行的,那么
HWND hwndParent = ::GetAncestor(hwndComboBox, GA_PARENT); int ctrlID = static_cast<int>(::GetWindowLongPtr(hwndComboBox, GWLP_ID)); ::PostMessage(hwndParent, WM_COMMAND, MAKEWPARAM(ctrlID, CBN_SELCHANGE), reinterpret_cast<LPARAM>(hwndComboBox));
- 没有找到相关文章