4

我想捕捉 CMFCTabCtrl 的选项卡更改事件。下面是我试图这样做的代码。但它没有捕捉到变化事件。

BOOL SurvChatDlg::OnNotify( WPARAM wParam, LPARAM lParam, LRESULT* 
                               pResult ) 
{ 
if(((LPNMHDR)lParam)->code==TCN_SELCHANGE) 
{ 
    int i = m_TabControl.GetActiveTab();
    AfxMessageBox("Changed");
} 
return CDialog::OnNotify( wParam, lParam, pResult ); 
}
4

2 回答 2

1

根据这个论坛帖子,您需要处理发送到父窗口的AFX_WM_CHANGING_ACTIVE_TAB消息。

此论坛主题有更多代码示例。

于 2013-07-20T07:44:16.820 回答
1

如果您想捕捉帖子标签更改,激活的标签需要AFX_WM_CHANGE_ACTIVE_TAB即;

ON_REGISTERED_MESSAGE(AFX_WM_CHANGE_ACTIVE_TAB,OnTabSetActive)

LRESULT CYourClass::OnTabSetActive(WPARAM wParam, LPARAM lParam)
{
    const int iActiveTab = (int)wParam;
    int iCheckActiveTab = m_wndTabs.GetActiveTab(); //CMFCTabCtrl m_wndTabs;
    m_wndTabs.SetActiveTab(iActiveTab); //good idea to also add this depending on usage.
    return 0;
}

如果您需要使用手动更改选项卡调用;

    SendMessage(AFX_WM_CHANGE_ACTIVE_TAB, iTabNum2ChangeTo, 0);

在尝试找到解决我使用问题的方法后发布了上述内容

CMFCTabCtrl::SetActiveTab() 

会崩溃,但仅在调试模式下。而这个 OP 是谷歌的最佳答案。

AFX_WM_CHANGING_ACTIVE_TAB似乎在实际选项卡更改之前捕获了事件,因此为什么对 OP 不起作用,可以通过以下方式检查;

int iCheckActiveTab = m_wndTabs.GetActiveTab();
于 2017-08-24T10:55:17.060 回答