我在对话框中添加了一个CMFCOutlookBar控件。这个outlook栏包含大约12棵树。
按照以下链接https://msdn.microsoft.com/en-us/library/bb983453.aspx我们可以设置我们想要的活动选项卡(在我的例子中是树控制)。
但是它似乎不工作。
根据上面的链接,此函数在成功时返回非零值。事实上,当我使用它来设置我选择的树时,它返回1。但从视觉上看,它并没有改变。
有人能帮帮我吗?
问题解决。CMFCOutlookBarTabCtrl::SetActiveTab()仅在窗口显示后有效。我想这是因为CMFCOutlookBar存储它以前的状态注册和重新加载在下次运行。这将覆盖SetActiveTab()所做的更改,如果我们在显示窗口之前使用它。
我有同样的问题,你是正确的,在加载选项卡设置为最后一个会话值-实际上它似乎在加载过程中设置了几次-其中一些似乎对应于每次添加选项卡,然后最后一次调用它似乎是从上一个会话的选项卡。
解决方案是在窗口准备显示时设置该值。这可以通过重写包含选项卡栏的视图的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.
}
}
}
}