我已将CMFCOutlookBar控件添加到对话框中。这个outlookbar包含大约12棵树。
根据以下链接https://msdn.microsoft.com/en-us/library/bb983453.aspx 我们可以设置我们希望的活动标签(在我的案例树控件中)。
但它似乎不起作用。
如上所述,此函数在成功时返回非零值。事实上,当我用它来设置我选择的树时,它返回1。但在视觉上并没有改变。
有人可以帮助我吗?
答案 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.
}
}
}
}