CMFCOutlookBarTabCtrl::SetActiveTab 不工作

CMFCOutlookBarTabCtrl::SetActiveTab not working

我已将 CMFCOutlookBar 控件添加到对话框中。这个 outlookbar 包含大约 12 棵树。

如下 link https://msdn.microsoft.com/en-us/library/bb983453.aspx 我们可以根据需要设置活动选项卡(在我的例子中是树控件)。

但是好像不行。

按照上述 link 此函数 returns 成功时非零值。当我用它来设置我选择的树时,它确实返回了 1。但视觉上没有改变。

有人可以帮助我吗?

问题已解决。 CMFCOutlookBarTabCtrl::SetActiveTab() 仅在 window 显示后有效。 我猜这是因为 CMFCOutlookBar 将其先前的状态存储到注册表并在下一个 运行 时重新加载。如果我们在显示 window.

之前使用它,这将覆盖 SetActiveTab() 所做的更改

我遇到了同样的问题,你是对的,在加载时选项卡被设置为最后一个会话值 - 实际上它似乎在加载过程中被设置了几次 - 其中一些似乎每次都对应添加了一个tab,然后最后一次调用好像是上次session的tab

解决方案是在 window 准备好显示后设置值。这可以通过覆盖包含选项卡栏的视图上的 OnShowWindow 回调来完成。

在我的例子中,标签栏被添加到一个名为 MainFrame 的视图中,它有一个成员变量 CMFCOutlookBarTabCtrl* m_pOutlookBar;,它在 OnCreate 回调中被初始化。

然后我可以通过覆盖 OnShowWindow 以包含以下内容来正确设置选项卡:

void MainFrame::OnShowWindow(BOOL bShow, UINT nStatus)
{
    CFrameWndEx::OnShowWindow(bShow, nStatus);

    if ((m_pOutlookBar != NULL) && bShow) {
        //When the tab bar is shown, select the correctview
        for (int tabIdx = 0; tabIdx < m_pOutlookBar->GetTabsNum(); tabIdx++) {
            CString requiredLabel;
            CString thisLabel;
            requiredLabel.LoadString(IDS_OF_TAB); //The ID of the tab wanted
            m_pOutlookBar->GetTabLabel(tabIdx,thisLabel);
            if (requiredLabel.Compare(thisLabel) == 0) {
                //If the tab label matches the one required
                m_pOutlookBar->SetActiveTab(tabIdx); //set it as the active one.
                break; //done.
            }
        }
    }
}