模拟CTabCtrl控件的单击事件

1、必须在CTabCtrl所在父窗体处理WM_NOTIFY消息

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);

以上是用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较好。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值