【问题标题】:CMFCTabCtrl catch tab change eventCMFCTabCtrl 捕获选项卡更改事件
【发布时间】:2013-07-18 07:46:23
【问题描述】:

我想捕捉 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 ); 
}

【问题讨论】:

  • CMFCTabCtrl 派生出自己的类并在那里添加消息处理程序更容易。
  • 我应该处理什么消息??..

标签: visual-c++ mfc mfc-feature-pack


【解决方案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();

【讨论】:

    【解决方案2】:

    根据this forum thread,需要处理发送到父窗口的AFX_WM_CHANGING_ACTIVE_TAB消息。

    This forum thread 有更多代码示例。

    【讨论】:

    • 不幸的是,它没有抓住这个事件。顺便说一句,该应用程序不是 MDI 选项卡应用程序。
    • 第二个论坛帖子链接还显示了如何捕获CMainFrame 中的消息——如果您没有框架窗口,您如何托管选项卡控件?
    • 我只是重写了 CMFCTabCtrl 类并将这一行添加到 MESSAGE_MAP ON_REGISTERED_MESSAGE(AFX_WM_CHANGING_ACTIVE_TAB, &CMyTabCtrl::OnAfxWmChangingActiveTab)
    • AFX_WM_CHANGING_ACTIVE_TAB 消息没有发送到选项卡控件,而是发送到父级——您是在对话框或 SDIWindow 中嵌入选项卡控件还是在哪种窗口中?跨度>
    • 它在 CDialog 的对象中。
    猜你喜欢
    • 1970-01-01
    • 2011-04-08
    • 2011-10-28
    • 2011-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-21
    • 2020-05-29
    相关资源
    最近更新 更多