CMFCOutlookBarTabCtrl :: SetActiveTab不起作用

时间:2015-06-01 11:38:42

标签: mfc

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

根据以下链接https://msdn.microsoft.com/en-us/library/bb983453.aspx 我们可以设置我们希望的活动标签(在我的案例树控件中)。

但它似乎不起作用。

如上所述,此函数在成功时返回非零值。事实上,当我用它来设置我选择的树时,它返回1。但在视觉上并没有改变。

有人可以帮助我吗?

2 个答案:

答案 0 :(得分:2)

问题解决了。 CMFCOutlookBarTabCtrl :: SetActiveTab()仅在窗口显示后才有效。 我想这是因为CMFCOutlookBar将其以前的状态存储到下次运行时进行注册和重新加载。如果我们在显示窗口之前使用它,那么这将覆盖SetActiveTab()所做的更改。

答案 1 :(得分:0)

我遇到了同样的问题,而且你在加载时将标签设置为最后一个会话值是正确的 - 实际上它似乎在加载过程中多次设置 - 其中一些似乎对应于每次选项卡添加,然后最后一次调用似乎是上一个会话中的选项卡。

解决方案是在窗口准备好显示后设置值。这可以通过覆盖包含标签栏的视图上的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.
            }
        }
    }
}