Tab屬性頁控件可以在一個窗口中添加不同的頁面,然后在頁選擇發(fā)生改變時得到通知。MFC中使用CTabCtrl類來封裝屬性頁控件的各種操作。通過調(diào)用BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );創(chuàng)建一個窗口,dwStyle中可以使用以下一些屬性頁控件的專用風(fēng)格:
TCS_BUTTONS 使用按鈕來表示頁選擇位置
TCS_MULTILINE 分行顯示頁選擇位置
TCS_SINGLELINE 只使用一行顯示頁選擇位置
在控件創(chuàng)建后必需向其中添加頁面才可以使用,添加頁面的函數(shù)為:
BOOL InsertItem( int nItem, LPCTSTR lpszItem );nItem為位置,從零開始,lpszItem為頁選擇位置上顯示的文字。如果你希望在頁選擇位置處顯示一個圖標(biāo),你可以調(diào)用BOOL InsertItem( int nItem, LPCTSTR lpszItem, int nImage );nImage指明所使用的圖片位置。(在此之前必須調(diào)用CImageList * SetImageList( CImageList * pImageList );設(shè)置正確的ImageList)
此外CTabCtrl還提供了一些函數(shù)用于得到/修改控件的狀態(tài)。
int GetCurSel( )/int SetCurSel( int nItem );用于得到/設(shè)置當(dāng)前被選中的頁位置。
BOOL DeleteItem( int nItem )/BOOL DeleteAllItems( );用于刪除指定/所有頁面。
void RemoveImage( int nImage );用于刪除某頁選擇位置上的圖標(biāo)。
屬性頁控件的消息映射同樣使用ON_NOTIFY宏,形式如同:ON_NOTIFY( wNotifyCode, id, memberFxn ),wNotifyCode為通知代碼,id為產(chǎn)生該消息的窗口ID,memberFxn為處理函數(shù),函數(shù)的原型如同void OnXXXTab(NMHDR* pNMHDR, LRESULT* pResult),其中pNMHDR為一數(shù)據(jù)結(jié)構(gòu),在具體使用時需要轉(zhuǎn)換成其他類型的結(jié)構(gòu)。對于列表控件可能取值和對應(yīng)的數(shù)據(jù)結(jié)構(gòu)為:
TCN_SELCHANGE 在當(dāng)前頁改變后發(fā)送,所用結(jié)構(gòu):NMHDR
TCN_SELCHANGING 在當(dāng)前頁改變時發(fā)送可以通過返回TRUE來禁止頁面的改變,所用結(jié)構(gòu):NMHDR
一般來講在當(dāng)前頁發(fā)生改變時需要隱藏當(dāng)前的一些子窗口,并顯示其它的子窗口。下面的偽代碼演示了如何使用屬性頁控件:
CParentWnd::OnCreate(...)
{
m_tab.Create(...);
m_tab.InsertItem(0,"Option 1");
m_tab.InsertItem(1,"Option 2");
Create a edit box as the m_tab's Child
Create a static box as the m_tab's Child
edit_box.ShowWindow(SW_SHOW); // edit box在屬性頁的第一頁
static_box.ShowWindow(SW_HIDE); // static box在屬性頁的第二頁
}
void CParentWnd::OnSelectChangeTab(NMHDR* pNMHDR, LRESULT* pResult)
{//處理頁選擇改變后的消息
if(m_tab.GetCurSel()==0)
{//根據(jù)當(dāng)前頁顯示/隱藏不同的子窗口
edit_box.ShowWindow(SW_SHOW);
static_box.ShowWindow(SW_HIDE);
}
else
{//
edit_box.ShowWindow(SW_HIDE);
static_box.ShowWindow(SW_SHOW);
}
}