2015-06-01 4 views
3

Я добавил элемент управления CMFCOutlookBar в диалог. Этот обзорный план содержит около 12 деревьев.CMFCOutlookBarTabCtrl :: SetActiveTab не работает

В соответствии со следующей ссылкой https://msdn.microsoft.com/en-us/library/bb983453.aspx мы можем установить активную вкладку (в моем случае дерево управления) нашего желания.

но, похоже, не работает.

как указано выше, эта функция возвращает ненулевое значение при успешном выполнении. Действительно, он возвращает 1, когда я использовал его для установки дерева по своему выбору. но визуально это не изменилось.

Может кто-нибудь мне помочь?

ответ

2

Проблема решена. CMFCOutlookBarTabCtrl :: SetActiveTab() работает только после отображения окна. Я предполагаю, что это потому, что CMFCOutlookBar сохраняет предыдущее состояние в регистре и перезагружается при следующем запуске. И это переопределяет изменения, внесенные SetActiveTab(), если мы используем его перед отображением окна.

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. 
      } 
     } 
    } 
} 
Смежные вопросы