如何以编程方式发送 TVN_SELCHANGING 消息到父窗口

问题描述 投票:0回答:1

我正在尝试以编程方式向我的窗口发送一条消息,以通知它我的单个选择树中的选择更改:

void SelectionChangingEvent()
{
    CWnd* mainwindow = AfxGetMainWnd();
    NMHDR hdr;
    hdr.hwndFrom = mainwindow->GetSafeHwnd();
    hdr.idFrom = IDC_TREEVIEW;
    hdr.code = LVN_ITEMCHANGING;
    mainwindow->SendMessage(WM_NOTIFY, (WPARAM)IDC_TREEVIEW, (LPARAM)&hdr);
}

消息映射是在视图中完成的:

BEGIN_MESSAGE_MAP(CMainView, CFormView)
    /*...*/
    ON_NOTIFY(TVN_SELCHANGING, IDC_TREEVIEW, OnSelChangingTree)
    /*...*/
END_MESSAGE_MAP()

发送消息时,

OnSelChangingTree()
功能不会被触发。我在这里做错了什么?

我使用

hdr.code = LVN_ITEMCHANGED;
实现了类似的用于选择树项目的消息,它在
TVN_SELCHANGED
映射函数中正确运行。

c++ mfc
1个回答
0
投票

错误可能是这样的:

hdr.hwndFrom = mainwindow->GetSafeHwnd();

hwndFrom
是消息来自的窗口的句柄,而不是应该接收消息的窗口的句柄。根据NMHDR
参考

hwndFrom


类型:

HWND


发送消息的控件的窗口句柄。

所以应该是树形视图控件的

HWND


您还混淆了控制代码:

hdr.code = LVN_ITEMCHANGING;

ON_NOTIFY(TVN_SELCHANGING, IDC_TREEVIEW, OnSelChangingTree)
它是树视图控件(如

TVN_SELCHANGING

所示)还是列表视图控件(如
LVN_ITEMCHANGING
所示)?

事实上,这似乎比窗口句柄不匹配更有可能是罪魁祸首。

© www.soinside.com 2019 - 2024. All rights reserved.