• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            幽幽
             
            posts - 51,  comments - 28,  trackbacks - 0

            說實話,我剛開始看見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);
            }

            經過這幾步處理,基本上我們就可以利用Tab Control的強大功能了。

            posted on 2008-05-19 02:18 幽幽 閱讀(1690) 評論(0)  編輯 收藏 引用

            <2008年6月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            293012345

            常用鏈接

            留言簿(6)

            隨筆分類(35)

            隨筆檔案(51)

            文章分類(3)

            文章檔案(3)

            相冊

            我的鏈接

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            久久99精品久久久久久噜噜| 婷婷久久久亚洲欧洲日产国码AV| 久久婷婷久久一区二区三区| 国产精品免费久久| 中文字幕无码久久精品青草 | 99久久婷婷国产一区二区 | 日韩久久久久久中文人妻| 99久久精品国产综合一区| 久久精品国产色蜜蜜麻豆| 久久精品9988| 久久精品无码午夜福利理论片| 国产精品伊人久久伊人电影 | 亚洲精品无码久久久久久| 久久精品国产黑森林| 国产麻豆精品久久一二三| 亚洲日韩欧美一区久久久久我 | 亚洲国产精品久久久天堂 | 国产精品久久影院| 人妻丰满?V无码久久不卡| 久久精品国产91久久综合麻豆自制 | 国产婷婷成人久久Av免费高清| 超级97碰碰碰碰久久久久最新 | 熟妇人妻久久中文字幕| 久久九九兔免费精品6| 色99久久久久高潮综合影院| 久久成人永久免费播放| 国产精品成人久久久久久久| 精品999久久久久久中文字幕| 久久久久亚洲AV无码麻豆| 亚洲国产美女精品久久久久∴| 久久久久亚洲AV无码专区首JN| 久久久久久综合网天天| 亚洲国产天堂久久综合| 国产精品久久久久蜜芽| 亚洲国产视频久久| 婷婷伊人久久大香线蕉AV| 国产99精品久久| 国产成人精品久久综合| 久久亚洲国产成人精品无码区| 久久人人爽人人爽AV片| 狠狠色丁香久久婷婷综合_中 |