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,可以这么写:






综上所述,此种情况下还是用SendMessage较好。