1、必须在CTabCtrl所在父窗体处理WM_NOTIFY消息
2、用一下代码段模拟单击事件
以上是用SendMessage,如果用PostMessage,则出错,个人分析原因如下:
SendMessage等待消息返回,类似于调用函数;若单纯地改为PostMessage,则以上代码块中在栈上分配的NMHDR nh;推出命名空间时被销毁,而此时很有可能在WM_NOTIFY的处理中需要该结构体实例,所以出错了。
若非要改用PostMessage,可以这么写:
m_wndView.m_Tab.SetCurSel(m_wndView.m_Tab.GetItemCount()-1);
LPNMHDR pnh=new NMHDR;
pnh->hwndFrom=m_wndView.m_Tab.m_hWnd;
pnh->idFrom=IDC_TABCTRL;
pnh->code=TCN_SELCHANGE;
m_wndView.PostMessage(WM_NOTIFY,IDC_TABCTRL,(LPARAM)pnh);
如此可以正常跑起来,但是很显然,new出来的NMHDR(堆上分配)未被回收,存在潜在的问题。
综上所述,此种情况下还是用SendMessage较好。
2、用一下代码段模拟单击事件
m_wndView.m_Tab.SetCurSel(m_wndView.m_Tab.GetItemCount()-1);
NMHDR nh;
nh.hwndFrom=m_wndView.m_Tab.m_hWnd;
nh.idFrom=IDC_TABCTRL;
nh.code=TCN_SELCHANGE;
m_wndView.SendMessage(WM_NOTIFY,IDC_TABCTRL,(LPARAM)&nh);
NMHDR nh;
nh.hwndFrom=m_wndView.m_Tab.m_hWnd;
nh.idFrom=IDC_TABCTRL;
nh.code=TCN_SELCHANGE;
m_wndView.SendMessage(WM_NOTIFY,IDC_TABCTRL,(LPARAM)&nh);
以上是用SendMessage,如果用PostMessage,则出错,个人分析原因如下:
SendMessage等待消息返回,类似于调用函数;若单纯地改为PostMessage,则以上代码块中在栈上分配的NMHDR nh;推出命名空间时被销毁,而此时很有可能在WM_NOTIFY的处理中需要该结构体实例,所以出错了。
若非要改用PostMessage,可以这么写:
m_wndView.m_Tab.SetCurSel(m_wndView.m_Tab.GetItemCount()-1);
LPNMHDR pnh=new NMHDR;
pnh->hwndFrom=m_wndView.m_Tab.m_hWnd;
pnh->idFrom=IDC_TABCTRL;
pnh->code=TCN_SELCHANGE;
m_wndView.PostMessage(WM_NOTIFY,IDC_TABCTRL,(LPARAM)pnh);综上所述,此种情况下还是用SendMessage较好。
本文介绍如何在CTabCtrl所在的父窗体处理WM_NOTIFY消息,并通过代码模拟单击事件来实现Tab页的选择变化。文章对比了使用SendMessage与PostMessage的不同效果及原因,推荐在特定场景下使用SendMessage。
554

被折叠的 条评论
为什么被折叠?



