我是一個問題少年,之前買過一本” Programming Windows”,上冊看過一些,大約知道Win32程序怎么寫,怎么工作的.來到新公司,我就準(zhǔn)備用Programming Windows里面那種Sample那種形式寫程序.
老天就喜歡和我開玩笑,普通的控件的消息響應(yīng)之類還比較好處理(無非就是那個Switch…case…比較大而已),可以Leader偏偏決定用PropertySheet控件(一復(fù)雜控件).用Win32 API對于剛寫Native代碼的我(到現(xiàn)在寫了一個星期)簡直就是一個不可能完成的任務(wù).讓寫一個小程序,后臺那些東西我兩天就搞定,單單這個PropertySheet我兩天都沒搞定.
后來看到WTL里面直接可以創(chuàng)建PropertySheet,可是被告知,不允許使用WTL……無奈,只能轉(zhuǎn)投MFC,人生第一次使用MFC……
廢話少說,直接說得到的PropertySheet相關(guān)的經(jīng)驗.
CPropertySheet和CPropertyPage是兩個基類,通常你不需要繼承這兩個類,不過需要個性化的需求,就需要繼承這兩個類了.
首先說明,Page類其實就是一個Dialog,里面響應(yīng)了Notify消息,可以拿到SetActive,KillActive兩種比較重要的消息,里面可以做很多個性化的東西;
Sheet類是一個封裝類,用來管理Page,例如可以拿到現(xiàn)在有多少個Page,獲取當(dāng)前Active的Page,設(shè)置第幾個Page為Active等等,更重要的是,他還可以動態(tài)的Add , Remove Page.下面講怎么動態(tài)添加刪除Page.
假設(shè)有CMyPropertySheet和CMyPropertyPage,分別繼承自上面那兩個類.
CMyPropertySheet里面添加一個成員:
std::vector<CMyPropertyPage*> _PropertyPageCache;
成員RefreshPages來實現(xiàn)動態(tài)添加刪除Page,只是提供一個簡單的Demo,剩下的自由發(fā)揮.
view sourceprint?01 void RefreshPages()
02
03 {
04
05 int pageCount= this->GetPageCount();
06
07 int insertCount=5;
08
09 for (int i=0;i<_PropertyPageCache.size();i++)
10
11 {
12
13 delete _PropertyPageCache[i];
14
15 }
16
17 _PropertyPageCache.clear();
18
19 for (int i=0;i<insertCount;i++)
20
21 {
22
23 CMyPropertyPage* page= new CMyPropertyPage;
24
25 page->Construct(IDD_MYDIALOG);
26
27 page->m_psp.pszTitle=L”Demo”;
28
29 page->m_psp.dwFlags|=PSP_USETITLE;
30
31 this->AddPage(page);
32
33 _PropertyPageCache.push_back(page);
34
35 }
36
37 for (int i = 0;i<pageCount;i++)
38
39 {
40
41 this->RemovePage(0);
42
43 }
44
45 }
Remove可以(最好)在后面完成,因為如果刪完了的話,CMyPropertySheet會直接跳出消息循環(huán)……
OK,現(xiàn)在你的PropertySheet就能完成動態(tài)增刪的功能,剩下的就是看你想在什么地方動態(tài)增刪Page了,哪里需要,就把this指針給誰~~簡單吧
PS:
曾經(jīng)試過如果不cache這些Page的話,PropertySheet也創(chuàng)建了,但是Page的Title都不對,而且點擊都會崩潰,因為我也沒研究過怎么具體使用Win32來完成這個功能(對底層不了解),不過根據(jù)這幾天寫Native Code經(jīng)驗判斷,是所謂的野指針,訪問的內(nèi)存地址不對.
因為我之前是一個C#.NET程序員,所以對內(nèi)存訪問(控制)有一點不了解,在這上面磕磕絆絆很多次,所以我直接去用自由存儲,結(jié)果發(fā)現(xiàn)解決這個問題……歪打正著吧……