模態屬性與非模態屬性頁面
來源:互聯網
上載者:User
在資源編輯器設定了屬性頁面之後,就可以通過ClassWizard建立一個CPropertyPage衍生類別了,其方式與建立CDialog衍生類別非常相似,惟一的區別在於不是選擇CDialog而是選擇 CPropertyPage作為基類。為了建立和顯示一個模態屬性單,通常會在棧上聲明一個CPropertySheet對象,並調用其DoModal函數(就像CDialog對象所做的那樣)。但是,對於屬性頁面則需要在調用屬性單的DoModal函數之前給屬性單添加相應的屬性頁面: protected:
CPropertySheet m_sheet;
CMyPropertyPage1 m_pageMyPage1; //CMyPropertyPage1是自己聲明的基於CPropertyPage的類
然後再在OnInitDialog()函數中調用
sheet.AddPage(&m_pageMyPage1);
sheet.DoModal();
顯示無模態屬性單和顯示模態屬性單的方法基本相同,主要差別在於不是使用DoModal()函數,而是使用CPropertySheet::Create()函數顯示內容單。但是要注意:在負責顯示內容單的函數內,檢查屬性單的HWND成員變數,確定是否已經建立了該屬性單,如果還沒有建立該屬性單,則執行個體化各頁面對象,通過AddPage把他們添加到屬性單中,然後再調用Create顯示該屬性單;如果已經構造了屬性單,則調用BringWindowToTop()函數就能很容易的找的襖屬性單了,代碼如下:
HWND hwnd = g_sheet.GetSafeHwnd();
if (!hwnd)
{
CPropPage1* p1 = new CPropPage1();
CPropPage2* p2 = new CPropPage2();
sheet.AddPage(p1);
sheet.Create();
}
else
{
sheet.BringWindowToTop();
}
當要從記憶體中清除這些頁面是可以重載屬性單類的PostNcDestroy()虛函數:
PostNcDestroy()
{
int nPages = GetPageCount();
for (int i = (nPages - 1); i >= 0; i--)
{
CPropertyPage* pPage = GetPage(i);
ASSERT(pPage);
if (pPage)
{
delete pPage;
RemovePage(i);
TRACE("[CMyPropertySheet::OnDestroy] Removing page %ld/n", i);
}
}
CPropertySheet::PostNcDestroy();
}