WM_NOTIFY和ON_NOTIFY macro及OnNotify虚函数

1 篇文章 0 订阅

WM_NOTIFY是子控件用来向父窗体发送信息的消息,其参数一般以NMHDR结构来封装,例如
            NMHDR nmh;
            memset(&nmh,0,sizeof(NMHDR));
            nmh.hwndFrom = GetSafeHwnd();
            nmh.idFrom = GetDlgCtrlID();
            nmh.code = NM_CLICK;
            GetParent()->SendMessage(WM_NOTIFY,GetDlgCtrlID(),(LPARAM)&nmh);
如此在父窗体上,OnNotify虚函数就能接收到这个消息,并且进行消息反射或者其他什么处理。而如果父窗体要自己来handle这个消息的话,这就需要通过ON_NOTIFY来进行消息影射,一般声明如下(以上面为例):
ON_NOTIFY(NM_CLICK,819,OnNotifyTabWnd)
afx_msg void OnNotifyTabWnd(NMHDR*pNotifyStruct,LRESULT*result);
void CMainFrame::OnNotifyTabWnd(NMHDR*pNotifyStruct,LRESULT*result)
{
}
WM_NOTIFY是为了扩展WM_COMMAND的,既如此,是否WM_COMMAND也是类似的消息传递路径呢?(是的)
具体可以参考MSDN,以下是片断:

OnNotify processes the message map for control notification.

Override this member function in your derived class to handle the WM_NOTIFY message. An override will not process the message map unless the base class OnNotify is called.

For more information on the WM_NOTIFY message, see Technical Note 61 (TN061), ON_NOTIFY and WM_NOTIFY messages. You may also be interested the related topics described in Control Topics, and TN062, Message Reflection for Windows Controls.

在 C++ 中,树形控件(如 `HTREEITEM` 或 `CTreeCtrl`)通常会发送 WM_NOTIFY 消息来通知应用程序某个节点的状态或内容发生了变化。当你需要处理这些事件时,你需要注册一个窗口消息处理器函数,并在该函数中编写相应的代码。 以下是一个简单的例子,展示了如何在 `CTreeCtrl` 类中处理 WM_NOTIFY 消息: ```cpp // 首先,在你的头文件 (.h) 中声明处理函数 void CYourClass::OnNotify(NMHDR* pNMHDR, LRESULT* pResult); // 然后,在你的 .cpp 文件中实现这个函数 void CYourClass::OnNotify(NMHDR* pNMHDR, LRESULT* pResult) { LPNMTREEVIEW pTV = reinterpret_cast<LPNMTREEVIEW>(pNMHDR); // 根据 WM_NOTIFY 的子消息类型检查具体事件 switch (pNMHDR->code) { case TVN_ITEMEXPANDED: // 当节点展开时的处理 OnItemExpanded(pTV->itemNew.hItem); break; case TVN_ITEMHITTEST: // 节点点击或鼠标悬停时的处理 OnItemHitTest(pTV->pt.x, pTV->pt.y, &pTV->itemFromPoint); break; // 更多其他类型的处理... default: *pResult = CallWindowProc(GetWindowLongPtr(m_hWnd, GWLP_WNDPROC), m_hWnd, pNMHDR, pResult); return; } // 如果需要自定义处理,可以修改这里的代码 *pResult = 0; // 默认返回值,表示接收并处理了消息 } ``` 在这个例子中,`OnItemExpanded` 和 `OnItemHitTest` 是你自定义的虚函数,可以根据实际需求添加对应的实现。在接收到消息后,你可以访问 `pTV` 结构体中的信息,比如新的展开节点 (`itemNew`) 或是用户点击的节点 (`itemFromPoint`)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值