?? 讓vc中的非模式屬性表propertysheet出現(xiàn)okcancelapply按鈕.txt
字號:
作者:茶館主人
日期:2001-6-3 20:55:08
讓VC中的非模式屬性表PropertySheet出現(xiàn)OK/Cancel/Apply按鈕
北京商即通數(shù)碼科技有限公司 張宏
很多VC程序員都遇到過這個問題,當(dāng)建立一個非模式的屬性表(不是向?qū)J?時,此時正常用DoModal()調(diào)用時可以出現(xiàn)的OK/Cancel/Apply等按鈕全都不見了,真讓人郁悶!筆者查找了很多資料,均沒有正確的答案,最后,筆者自己分析,在CPropertySheet調(diào)用初始化對話框CPropertySheet::OnInitDialog()時由于m_psh中自動設(shè)置了PSH_MODELESS屬性,導(dǎo)致自動調(diào)整對話框大小,隱藏了對話框中的OK按鈕部分,因此,筆者考慮以下解決辦法:
1.從CPropertySheet派生一個自己的屬性表類,將要加入的頁面作為其成員變量:
class CMySheet : public CPropertySheet
{
DECLARE_DYNAMIC(CMySheet)
// Construction
public:
CMySheet(UINT nIDCaption, CWnd* pParentWnd = NULL, UINT iSelectPage = 0);
CMySheet(LPCTSTR pszCaption, CWnd* pParentWnd = NULL, UINT iSelectPage = 0);
// Attributes
public:
// Operations
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CMySheet)
public:
virtual BOOL OnInitDialog();
//}}AFX_VIRTUAL
// Implementation
public:
virtual ~CMySheet();
// Generated message map functions
protected:
//{{AFX_MSG(CMySheet)
// NOTE - the ClassWizard will add and remove member functions here.
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
private:
void AddPages(); //添加屬性頁
CPage2 page2; //定義屬性頁變量
CPage1 page1;
};
2.添加屬性頁:
void CMySheet::AddPages()
{
AddPage(&page1);
AddPage(&page2);
}
CMySheet::CMySheet(UINT nIDCaption, CWnd* pParentWnd, UINT iSelectPage)
:CPropertySheet(nIDCaption, pParentWnd, iSelectPage)
{
AddPages();
}
CMySheet::CMySheet(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage)
:CPropertySheet(pszCaption, pParentWnd, iSelectPage)
{
AddPages();
}
3.在屬性頁的初始化對話框中拉大對話框高度,并且將OK/Cancel/Apply按鈕顯示、激活。
BOOL CMySheet::OnInitDialog()
{
BOOL bResult = CPropertySheet::OnInitDialog();
RECT rc;
// 調(diào)整屬性頁對話框的大小
GetWindowRect (&rc);
rc.bottom += 30; //窗口向下拉30點(diǎn),讓OK按扭可以顯示出來
MoveWindow (&rc); //調(diào)整窗口
GetDlgItem(IDOK)->ShowWindow(SW_SHOW); //顯示隱藏的OK按鈕
GetDlgItem(IDOK)->EnableWindow(); //激活OK按鈕
GetDlgItem(IDCANCEL)->ShowWindow(SW_SHOW); //顯示隱藏的Cancel按鈕
GetDlgItem(IDCANCEL)->EnableWindow(); //激活Cancel按鈕
GetDlgItem(ID_APPLY_NOW)->ShowWindow(SW_SHOW); //顯示Apply按鈕
GetDlgItem(ID_APPLY_NOW)->EnableWindow(); //激活A(yù)pply按鈕
return bResult;
}
好了,在主對話框中加入一個測試按鈕,加入一個CmySheet *sh指針成員變量,并且加入以下代碼:
CTestPropertySheetDlg::CTestPropertySheetDlg(CWnd* pParent /*=NULL*/)
: CDialog(CTestPropertySheetDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
sh=NULL;
}
void CTestPropertySheetDlg::OnButton1()
{
sh=new CMySheet("測試對話框");
sh->Create(this);
}
void CTestPropertySheetDlg::OnDestroy()
{
CDialog::OnDestroy();
if (sh) delete sh;
}
編譯工程并運(yùn)行,你看到了什么?OK/Cancel/Apply全都出來了!
可是,點(diǎn)擊OK按鈕看看?怎么?不會關(guān)閉對話框!!! >:-(((
怎么辦?是非模式對話框沒有響應(yīng)OK按鈕嗎?不是,當(dāng)前的各屬性頁已經(jīng)得到了OK按鈕事件,但是屬性表沒有對OK按鈕響應(yīng),加上對事件的處理以后就可以了:
BOOL CMySheet::OnCommand(WPARAM wParam, LPARAM lParam)
{
if (HIWORD (wParam) == BN_CLICKED)
{
switch (LOWORD (wParam))
{
case IDOK:
PressButton (PSBTN_OK);
DestroyWindow ();
return (TRUE);
case ID_APPLY_NOW: // Apply
PressButton (PSBTN_APPLYNOW);
return (TRUE);
case IDCANCEL:
PressButton (PSBTN_CANCEL);
DestroyWindow ();
return (TRUE);
case IDHELP:
PressButton (PSBTN_HELP);
return (TRUE);
}
}
return CPropertySheet::OnCommand(wParam, lParam);
}
現(xiàn)在再編譯試試看,一切OK了。
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -