MFC属性页对话框
屬性頁對話框
?分類
? 分頁和引導
? 類
?CPropertyPage-父親CDialog類別,所謂的屬性頁或網頁對話框。
?CPropertySheet-父類是CWnd,稱為屬性表單。
? 一個完整的屬性頁對話框由一個屬性表單+多個屬性頁組成。屬性頁嵌套在屬性表單內。
標簽式屬性頁的創建步驟:
? 1 插入屬性頁對話框資源。選中對話框資源ID改動語言為Chinese(P.R.C), 選中資源視圖的右邊的對話框右鍵選擇屬性設置為宋體,9號字體。雙擊資源,生成對應的類,注意父類選擇CPropertyPage類。
? 2 右擊project。選擇加入新的類,父類是CPropertySheet類。
? 3 在表單類中加入屬性頁對象。在構造函數中。
?????CPropertySheet::AddPage
? 4 創建和顯示屬性頁
?????CPropertySheet::DoModal()
? 5 當控件的值發生改變時,將應用button設置為可用
?????CPropertyPage::SetModified(TRUE);
? 6 消息處理(通過在頁面類中加入虛函數的方式實現)
?????CPropertyPage::OnApply
?????CPropertyPage::OnOK
?????CPropertyPage::OnCancel
新建一個MFC當文檔應用程序,為菜單加入一個菜單項,在該菜單項的點擊處理函數中彈出我們的屬性頁對話框。
?
為了演示效果,在視圖類的OnDraw函數中創建畫筆。然后繪制一個圖形。畫筆的線寬和顏色由其成員變量m_nWidth和m_color決定,這里正是在屬性頁對話框中設置線寬和顏色然后作用到上面繪制的圖形上。
為視圖類加入兩個成員變量:
int m_nWitdh;// 線寬COLORERF m_color; // 顏色并在視圖類的構造函數中初始化
m_nWidth = 1;m_color = RGB (0, 0, 0);視圖的OnDraw加入畫圖代碼例如以下:
void CMFCLabelView::OnDraw(CDC* pDC) {CMFCLabelDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data hereCPen pen;pen.CreatePen (PS_SOLID, m_nWidth, m_color);CPen *pOldPen = pDC->SelectObject (&pen);pDC->Ellipse (100, 100, 400, 400);pDC->SelectObject (pOldPen);pen.DeleteObject (); }加入菜單項
插入對話框資源,注意選擇PROPPAGE類型的對話框資源
選中對話框資源。右鍵更改語言為P.R.C
然后在資源視圖右邊窗體選中對話框資源右鍵屬性改動字體為宋體9號:
復制一個剛才我們新建的而且調整好語言和字體的對話框
注意:當中一個為線寬設置對話框,給它加入一個編輯框控件用以輸入數值
?????另外一個為顏色設置對話框,給它加入一個button,點擊button彈出顏色對話框
雙擊他們通過類向導生成對應的類,注意選擇父類為CpropertyPage
這里分別命名為:CPage1和CPage2
Ctrl+W為線寬設置對話框的編輯框控件綁定一個int類型的值變量:m_nLineWidth并設置其范圍為: 1 –20,并在其構造函數中初始化為1。
在project上右鍵選擇New Class 注意選擇父類為CpropertySheet, 這里類名我設置為:ClabelSheet,然后為該類加入兩個成員變量:
CPage1 m_page1;CPage2 m_page2;然后在ClabelSheet的兩個構造函數中都加入屬性頁(這樣不管調用哪個都能夠正確加入):
AddPage (&m_page1);AddPage (&m_page2);注意包括:Page1.h 和Page2.h頭文件
Ctrl+W為視圖類加入菜單的命令消息響應函數,加入例如以下創建標簽式屬性頁的代碼:
注意包括:LabelSheet.h頭文件
為了使當用戶輸入數據時讓屬性頁對話框上的應用button變為可用狀態,為線寬設置對話庫類CPage1的編輯框控件加入EN_CHANGE消息響應函數,當編輯框內容一旦改變將觸發該消息。
消息響應函數例如以下:
void CPage1::OnChangeEditLinewidth() {// 設置應用button為可用狀態SetModified (TRUE); }為了在用戶點擊應用button時把用戶的設置反應在視圖類的窗體畫圖上。我們須要響應應用button的消息。然而我們無法直接通過雙擊應用button位它加入消息,正確的做法是通過加入虛函數的方式,此外還有確定, 下一步,等一切屬性頁對話框上的button事件都是虛函數。
那么這里我給CPage1加入一個虛函數OnApply來響應”應用”button事件
并加入例如以下代碼來影響視圖窗體圖形的繪制:
BOOL CPage1::OnApply() {// TODO: Add your specialized code here and/or call the base class// 從控件接收數據到變量UpdateData (TRUE);// 獲取視圖類對象指針CMFCLabelView *pView = (CMFCLabelView*)(((CFrameWnd*)AfxGetMainWnd ())->GetActiveView ());// 改變視圖類的線寬pView->m_nWidth = m_nLineWidth;// 使視圖窗體重繪pView->Invalidate ();return CPropertyPage::OnApply(); }這個時候編譯會包一些錯誤發現是一些頭文件包括問題
首先在Page1中包括MFCLabelView.h
然后在MFCLabelView中包括MFCLabelDoc.h
再編譯就Ok了,設置線寬后點應用button在視圖窗體中能夠看到效果。
回到CPage2類的對話框資源對話框,雙擊“設置顏色”button加入響應事件,編寫例如以下代碼:
#include "MFCLabelView.h" void CPage2::OnBtnSetcolor() {// TODO: Add your control notification handler code hereCColorDialog dlg;if (IDCANCEL == dlg.DoModal ())return;CMFCLabelView *pView = (CMFCLabelView*)(((CFrameWnd*)AfxGetMainWnd ())->GetActiveView ());pView->m_color = dlg.GetColor ();pView->Invalidate (); }向導式屬性頁的創建步驟:
??? 1 插入屬性頁對話框資源,選中對話框資源ID改動語言為Chinese(P.R.C), 選中資源視圖的右邊的對話框右鍵選擇屬性設置為宋體,9號字體。雙擊資源,生成對應的類,注意父類選擇CPropertyPage類。
??? 2 右擊project,選擇加入新的類。父類是CPropertySheet類。
??? 3 在表單類中加入屬性頁對象。
在構造函數中,
??????? CPropertySheet::AddPage
??? 4 創建和顯示前,設置為向導模式
????? CPropertySheet::SetWizardMode
??? 5 創建和顯示
????? CPropertySheet::DoModal()
??? 6 設置每一個頁面的向導button,在屬性頁對話框相應的類中加入以下的函數
????? 6.1 在CPropertyPage::OnSetActive()函數中設置
????? 6.2 在頁面中得到表單對象
??????????? GetParent()
????? 6.3 設置向導button
??????????? CPropertySheet::SetWizardButtons()
??? 7 消息處理函數。在屬性頁對話框相應的類中加入以下的虛函數函數
??????? CPropertyPage::OnSetActive()
??????? CPropertyPage::OnCancel()
??????? CPropertyPage::OnWizardNext()
??????? CPropertyPage::OnWizardBack()
??????? CPropertyPage::OnWizardFinish()
這里簡單起見直接改動本project為向導模式:來到標簽式屬性對話框創建的地方。改動代碼:
void CMFCLabelView::OnLabel() {// TODO: Add your command handler code here/*// 構造標簽式(默認)屬性頁CLabelSheet sheet ("標簽式屬性頁");// 顯示sheet.DoModal ();*/// 構造向導式屬性頁CLabelSheet sheet ("向導式屬性頁");// 設置為向導模式sheet.SetWizardMode ();// 顯示sheet.DoModal (); }第一個屬性頁對話框不應出現先一步button,來到CPage1類。加入OnSetAvtive()函數處理: #include "LabelSheet.h" BOOL CPage1::OnSetActive() {// TODO: Add your specialized code here and/or call the base class// 獲取父窗體指針(sheet)CLabelSheet* pSheet = (CLabelSheet*)GetParent ();// 設置僅僅有"下一步"button可用pSheet->SetWizardButtons (PSWIZB_NEXT);return CPropertyPage::OnSetActive(); }同理顏色設置對話框僅僅能有 上一步? 和 完畢button #include "LabelSheet.h" BOOL CPage2::OnSetActive() {// TODO: Add your specialized code here and/or call the base class// 獲取父窗體指針(sheet)CLabelSheet* pSheet = (CLabelSheet*)GetParent ();// 設置:"上一步"和“完畢”button為可用狀態pSheet->SetWizardButtons (PSWIZB_BACK | PSWIZB_FINISH );return CPropertyPage::OnSetActive(); }那么我們想在線寬設置對話框設點擊“下一步”button時把用戶的輸入設置到視圖的顯示。中,須要重寫虛函數CPropertyPage::OnWizardNext() LRESULT CPage1::OnWizardNext() {// TODO: Add your specialized code here and/or call the base class// 從控件接收數據到變量UpdateData (TRUE);// 獲取視圖類對象指針CMFCLabelView *pView = (CMFCLabelView*)(((CFrameWnd*)AfxGetMainWnd ())->GetActiveView ());// 改變視圖類的線寬pView->m_nWidth = m_nLineWidth;// 使視圖窗體重繪pView->Invalidate ();return CPropertyPage::OnWizardNext(); }
效果例如以下:
版權聲明:本文博客原創文章,博客,未經同意,不得轉載。
轉載于:https://www.cnblogs.com/mfrbuaa/p/4623477.html
總結
- 上一篇: cordova 学习笔记
- 下一篇: 接口继承