簡體   English   中英

MFC:根據請求將 CListView 選項卡添加到 CTabView (CBCGPTabView) 不會調用 CMyListView::OnInitialUpdate()

[英]MFC: Adding CListView tab to a CTabView (CBCGPTabView) on request doesn't call CMyListView::OnInitialUpdate()

我有一個從CMyTabView ( CTabView ) 派生的CBCGPTabView ,我想動態添加選項卡。 添加的選項卡將是從CListView派生的CMyListView 如果我在CMyTabView::OnCreate()期間添加選項卡,它工作正常。 如果我嘗試通過自定義消息執行此操作,它會添加選項卡,但它是空白的( CMyListView::OnInitialUpdate()永遠不會被調用)。

我需要做什么才能讓它工作?

這是有效的(測試選項卡):

int CMyTabView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
  if (__super::OnCreate(lpCreateStruct) == -1)
    return -1;

  CBCGPTabWnd &tabctrl=GetTabControl();

  int index=AddView(RUNTIME_CLASS(CMyForm), _T("My Form"));
  if (index!=-1) {
    m_IDTabMyForm=tabctrl.GetTabID(index);
  }

  AddView(RUNTIME_CLASS(CMyListView), _T("Test"));

  tabctrl.HideNoTabs();

  return 0;
}

這不會(除了添加帶有空白窗口的選項卡)。

afx_msg LRESULT CMyTabView::OnUwmAddMyListViewTab(WPARAM wparam, LPARAM lparam)
{
  CString mytabname;
  mytabname=_T("My ListView");
  
  // check if tab already exists - if so select it
  CBCGPTabWnd &tabcontrol=GetTabControl();
  for (int i=0; i<tabcontrol.GetTabsNum(); i++) {
    CString tablabel;
    if (tabcontrol.GetTabLabel(i, tablabel)) {
      if (tablabel==mytabname) {
        tabcontrol.SetActiveTab(i);
        return 0;
      }
    }
  }
  // new tab so add it
  int index=AddView(RUNTIME_CLASS(CMyListView), mytabname);
  if (index!=-1) {
    tabcontrol.SetActiveTab(index);
  }
  
  return 0;
}

事實證明,您必須自己調用它,以下版本有效:

afx_msg LRESULT CMyTabView::OnUwmAddMyListViewTab(WPARAM wparam, LPARAM lparam)
{
  CString mytabname;
  mytabname=_T("My ListView");
  
  // check if tab already exists - if so select it
  CBCGPTabWnd &tabcontrol=GetTabControl();
  for (int i=0; i<tabcontrol.GetTabsNum(); i++) {
    CString tablabel;
    if (tabcontrol.GetTabLabel(i, tablabel)) {
      if (tablabel==mytabname) {
        tabcontrol.SetActiveTab(i);
        return 0;
      }
    }
  }
  // new tab so add it
  int index=AddView(RUNTIME_CLASS(CMyListView), mytabname);
  if (index!=-1) {
    CView* thetabview=GetView(index);
    if (thetabview) {
      // we need to call OnInitUpdate ourself
      thetabview->SendMessage(WM_INITIALUPDATE);
      //make sure any child windows of the view get the message too
      thetabview->SendMessageToDescendants(WM_INITIALUPDATE, 0, 0, TRUE, TRUE);
    }

    tabcontrol.SetActiveTab(index);
  }
  
  return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM