当我使用函数combobox_setcursel时,cbn_selchange通知不起作用

The CBN_SELCHANGE notification not works when i use the function ComboBox_SetCurSel

本文关键字:cbn selchange 通知 不起作用 setcursel 函数 combobox      更新时间:2023-10-16

我在窗口中有一个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通知代码未发送。

要解决这个问题,您可以做两件事之一:

  1. 直接调用事件处理程序方法。例如,在MFC中,您将拥有框架附加OnCbnSelChange成员函数以处理Combobox的CBN_SELCHANGE通知。在称为ComboBox_SetCurSel的代码之后,您只需手动调用OnCbnSelChange成员函数:

    ComboBox_SetCurSel(hwndComboBox, 0);  // select 1st item
    this->OnCbnSelChange();               // invoke the change event-handler
    

    您的GUI框架无疑具有类似的东西。

  2. 手动将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));
    
相关文章:
  • 没有找到相关文章