在MFC中使用Tab Control的方法

Tab Control的運行效果有點像Property Sheet,但兩者還是有一些區別。我的理解就是Property Sheet主要用在對話框中,對數據進行進行分類管理。而Tab Control使用範圍更廣一些,既可以用在對話框,也可以用在視圖中,除了可以管理配置數據外,還可以對軟件的組織進行規劃,比如可以通過它來切換不同的視圖等等。
 
    當然這不是沒有代價的,Tab Control的編程就比Property Sheet的複雜很多。
 
    我最初有點搞不懂,如何在Tab Control中使用不同的Page,就象Property Page一樣,Tab Control並沒有提供便利的機制讓你輕鬆做到這一點。還好,VC是最棒的,通過變通的方法還是可以做到這一點。
 
    假如我現在有個SDI程序,View是Form View,想在上面放個Tab Control,包含兩個Page。現在讓我們來看看應該怎樣處理。
 
    首先當然要增加一個Tab Control資源,然後利用Class Wizard,在View中增加一個Control變量。
 
    接着建立兩個對話框資源,別忘了把Style改爲Child,Border改爲None。然後就可以在上面加其他控件了。
 
    接着利用Class Wizard,分別爲這兩個對話框建立兩個類,比如CPage1和CPage2。
 
    然後在View類頭文件中,加入這兩個對話框對象。同時增加一個變量int m_CurSelTab,用了表明是哪個Page即將被切換。
 
    爲了避免用戶在切換Tab時,程序對Tab Index的枚舉,可以利用數組來做這個事情。
 
    在View的初始化函數中需要把CPage1、CPage2和Tab Control關聯起來,並保存頁面地址,設置初始頁面,等等。

 void CTab_testView::OnInitialUpdate()

{

   CFormView::OnInitialUpdate();

   GetParentFrame()->RecalcLayout();

   ResizeParentToFit();
    
    //爲Tab Control增加兩個頁面

    m_tab.InsertItem(0, _T(/"First/"));

    m_tab.InsertItem(1, _T(/"Second/"));

//創建兩個對話框

    m_page1.Create(IDD_DIALOG1, &m_tab);

    m_page2.Create(IDD_DIALOG2, &m_tab);
 
    //設定在Tab內顯示的範圍

    CRect rc;

    m_tab.GetClientRect(rc);

    rc.top += 20;

    rc.bottom -= 8;

    rc.left += 8;

    rc.right -= 8;
 
    m_page1.MoveWindow(&rc);

    m_page2.MoveWindow(&rc);
 
    //把對話框對象指針保存起來

    pDialog[0] = &m_page1;

    pDialog[1] = &m_page2;
 
    //顯示初始頁面

    pDialog[0]->ShowWindow(SW_SHOW);

    pDialog[1]->ShowWindow(SW_HIDE);
 
    //保存當前選擇

    m_CurSelTab = 0;

}


    這裏面需要注意的是,我用了一個CDialog指針數組來進行保存,數組的大小是Tab Control頁面的個數,數組下標對應着每個頁面的索引(這樣方便快速存取)。

用戶切換時,需要響應相關的消息。

 void CTab_testView::OnSelchangeTab1(NMHDR* pNMHDR, LRESULT* pResult)

{

 // TODO: Add your control notification handler code here
   
    pDialog[m_CurSelTab]->ShowWindow(SW_HIDE);

    m_CurSelTab = m_tab.GetCurSel();

    pDialog[m_CurSelTab]->ShowWindow(SW_SHOW);

 
 *pResult = 0;

}


    首先我們先把當前的頁面隱藏起來,然後得到新的頁面索引,最後就把相關頁面顯示出來即可。這比一個個去枚舉簡單多了。
 
    還有一點比較有意思,那就是DDX/DDV機制的運用。要想獲得Tab Control各個頁面的數據,可以利用DDX/DDV機制,但需要注意,因爲這是多個頁面,所以需要顯式調用多次。

 void CTab_testView::OnButton1()

{

 // TODO: Add your control notification handler code here
m_page1.UpdateData();

    m_page2.UpdateData();

    CString str1 = m_page1.m_str1;

    CString str2 = m_page2.m_str2;

    AfxMessageBox(str1);

    AfxMessageBox(str2);

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章