在Visual C++中完成特征表
發(fā)表時間:2024-02-21 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]Windows 95 以及Windows NT 4.0 較之以前的Windows 操作系統(tǒng)增加了許多先進特性,特性表就是其中一個。大家熟知的特性表的實例是Windows 中屏幕顯示屬性的設(shè)置,它包括背景、屏幕保護程序、外觀、設(shè)置等特性頁。使用特性表的最大的好處在于它可以非常方便地將大量的信息提供給...
Windows 95 以及Windows NT 4.0 較之以前的Windows 操作系統(tǒng)增加了許多先進特性,特性表就是其中一個。大家熟知的特性表的實例是Windows 中屏幕顯示屬性的設(shè)置,它包括背景、屏幕保護程序、外觀、設(shè)置等特性頁。使用特性表的最大的好處在于它可以非常方便地將大量的信息提供給用戶,從而有效地節(jié)省屏幕空間,因為它是包含若干個其它對話框的對話框。
創(chuàng)建特性表
---- Visual C++ 中MFC 提供了兩個類,CPropertySheet 和CPropertyPage,使編程人員可以輕松地在程序中實現(xiàn)特性表。以VC4.0 為例,在程序中建立一個特性表可按如下步驟進行:
---- 1. 在Microsoft Developer Studio 中選擇菜單Insert /Component...,屏幕上會彈出一個"Component Gallery "對話框。(注意,此對話框本身就是特性表的一種。)
---- 2. 在對話框中的Microsoft 頁選中Property Sheet,單擊"Insert ",屏幕上出現(xiàn)創(chuàng)建特性表的向?qū)А?br>
---- 3. 在向?qū)У牡谝徊竭x擇"Property Sheet ";第二步選擇是否生成無模式的特性表以及是否要在特性表中支持預(yù)覽功能;第三步選擇創(chuàng)建特性表函數(shù)作為哪一個類的成員函數(shù)(即在哪一個類中起用特性表);第四步設(shè)置特性表所包含的頁數(shù);第五步為新生成的類(特性表本身及其包含的每一頁都是一個單獨的類)確定名稱。這樣,一個特性表就生成了。Visual C++ 已經(jīng)為你編寫了基本的源代碼。
---- 4. 自動生成的代碼中,啟動此特性表的函數(shù)一般名為OnProperties( ),在你需要的地方調(diào)用它,然后編譯,連接,運行,你會看到一個特性表已經(jīng)可以在你需要的地方彈出來了。
---- 5. 截止目前,特性表中的每一頁還是空白。在一頁中加入需要的控件(controls)和一般的對話框一樣簡單,因為它本身就是一種對話框。打開ResourceView 中的Dialog,特性表的每一頁都作為一個對話框列于其中,只要對它們進行編輯,再在程序中實現(xiàn)相應(yīng)功能就可以了,F(xiàn)在,一個特性表已經(jīng)全部完成。
---- 特性表中的頁雖然和普通對話框基本一致,但還有幾點需要注意的問題:
---- 1. 頁中的各控件不能使用其擴展風(fēng)格(extended styles);
---- 2. 頁中的各控件不能使用Help ID;
---- 3. control ID 不能是DWORD 類型;
---- 4. 不能在頁的字體中設(shè)置粗細、斜體、字符集等屬性。
---- 如果不能遵循以上規(guī)則,程序運行時將會出現(xiàn)錯誤。
特性表的使用技巧
---- 用Com ent Gallery 創(chuàng)建的特性表的下端包括三個按鈕:確定、取消、應(yīng)用、幫助。但是,有時侯你需要的不是這幾個按鈕,甚至完全不需要按鈕,那么如何修改呢?
---- 在MFC 程序內(nèi)部,這幾個按鈕都有著自己ID,分別為IDOK、IDCANCEL、ID_APPLY_NOW、IDHELP。這些宏在文件AFXRES.H 和WINRES.H 中定義,應(yīng)用程序一般已經(jīng)間接地包含了它們,可以直接引用。利用它們調(diào)用GetDlgItem 函數(shù)可以得到各按鈕的窗口句柄。有了句柄,對按鈕進行改動就變得非常簡單:用SetWindowText 改變按鈕的字符,用ShowWindow 和EnableWindow 隱含按鈕,用MoveWindow 改變按鈕位置。
---- 假設(shè)特性表的類名為CMyPropertySheet,以隱含`應(yīng)用'、`幫助'兩個按鈕為例,應(yīng)該在特性表的程序中加入如下代碼:
......
static int rgiButtons[] =
{ IDOK, IDCANCEL, ID_APPLY_NOW, IDHELP };
......
BOOL CMyPropertySheet::OnInitDialog()
{
BOOL bResult = CPropertySheet::OnInitDialog();
for ( int i = 2; i < 4; i++ )
{
HWND hWnd = ::GetDlgItem( m_hWnd, rgiButtons[i] );
if ( hWnd != NULL )
{
::ShowWindow( hWnd, SW_HIDE );
::EnableWindow( hWnd, FALSE );
}
}
CenterWindow();
return bResult;
}
---- 如果在四個按鈕之外還需加入另外的按鈕則相對復(fù)雜一些,因為這不能在ResourceView 中實現(xiàn),必須完全在代碼中完成。首先,在類CMyPropertySheet 中加入成員變量:
---- protected:
---- CButton m_btn;
---- 還要為按鈕加入點按響應(yīng)的成員函數(shù)的定義。為了使之能為ClassWizard 所識別,代碼如下:
protected:
//{{AFX_MSG(CMyPropertySheet)
afx_msg void OnBnClicked();
//}}AFX_MSG
程序中還要加入消息映射如下:
BEGIN_MESSAGE_MAP(CMyPropertySheet, CPropertySheet)
//{{AFX_MSG_MAP(CMyPropertySheet)
ON_BN_CLICKED(ID_MYBUTTON,OnBnClicked)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
準備工作完畢之后,要在OnInitDialog函數(shù)中創(chuàng)建此按鈕:
CRect rect;
rect.SetRect
(BUTTONLEFT, BUTTNTOP, BUTTONRIGHT, BUTTONBOTTOM);
m_btn.Create("MyButton", BS_PUSHBUTTON WS_VISIBLE,
rect, this, ID_MYBUTTON);
最后,在程序中完成點按按鈕的響應(yīng)函數(shù):
void CMyPropertySheet::OnBnClicked()
{
......
}
結(jié)論
---- 基本上大部分Windows 95 程序都會用到特性表,特性表可以有效地節(jié)省屏幕空間。本文介紹了一些相關(guān)技術(shù)。相似的技術(shù)也可以用在另一項先進技術(shù)──向?qū)В╓izard)中,讀者可以自己去嘗試。