我是一個(gè)問(wèn)題少年,之前買(mǎi)過(guò)一本” Programming Windows”,上冊(cè)看過(guò)一些,大約知道Win32程序怎么寫(xiě),怎么工作的.來(lái)到新公司,我就準(zhǔn)備用Programming Windows里面那種Sample那種形式寫(xiě)程序.
老天就喜歡和我開(kāi)玩笑,普通的控件的消息響應(yīng)之類(lèi)還比較好處理(無(wú)非就是那個(gè)Switch…case…比較大而已),可以L(fǎng)eader偏偏決定用PropertySheet控件(一復(fù)雜控件).用Win32 API對(duì)于剛寫(xiě)Native代碼的我(到現(xiàn)在寫(xiě)了一個(gè)星期)簡(jiǎn)直就是一個(gè)不可能完成的任務(wù).讓寫(xiě)一個(gè)小程序,后臺(tái)那些東西我兩天就搞定,單單這個(gè)PropertySheet我兩天都沒(méi)搞定.
后來(lái)看到WTL里面直接可以創(chuàng)建PropertySheet,可是被告知,不允許使用WTL……無(wú)奈,只能轉(zhuǎn)投MFC,人生第一次使用MFC……
廢話(huà)少說(shuō),直接說(shuō)得到的PropertySheet相關(guān)的經(jīng)驗(yàn).
CPropertySheet和CPropertyPage是兩個(gè)基類(lèi),通常你不需要繼承這兩個(gè)類(lèi),不過(guò)需要個(gè)性化的需求,就需要繼承這兩個(gè)類(lèi)了.
首先說(shuō)明,Page類(lèi)其實(shí)就是一個(gè)Dialog,里面響應(yīng)了Notify消息,可以拿到SetActive,KillActive兩種比較重要的消息,里面可以做很多個(gè)性化的東西;
Sheet類(lèi)是一個(gè)封裝類(lèi),用來(lái)管理Page,例如可以拿到現(xiàn)在有多少個(gè)Page,獲取當(dāng)前Active的Page,設(shè)置第幾個(gè)Page為Active等等,更重要的是,他還可以動(dòng)態(tài)的Add , Remove Page.下面講怎么動(dòng)態(tài)添加刪除Page.
假設(shè)有CMyPropertySheet和CMyPropertyPage,分別繼承自上面那兩個(gè)類(lèi).
CMyPropertySheet里面添加一個(gè)成員:
std::vector<CMyPropertyPage*> _PropertyPageCache;
成員RefreshPages來(lái)實(shí)現(xiàn)動(dòng)態(tài)添加刪除Page,只是提供一個(gè)簡(jiǎn)單的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可以(最好)在后面完成,因?yàn)槿绻麆h完了的話(huà),CMyPropertySheet會(huì)直接跳出消息循環(huán)……
OK,現(xiàn)在你的PropertySheet就能完成動(dòng)態(tài)增刪的功能,剩下的就是看你想在什么地方動(dòng)態(tài)增刪Page了,哪里需要,就把this指針給誰(shuí)~~簡(jiǎn)單吧
PS:
曾經(jīng)試過(guò)如果不cache這些Page的話(huà),PropertySheet也創(chuàng)建了,但是Page的Title都不對(duì),而且點(diǎn)擊都會(huì)崩潰,因?yàn)槲乙矝](méi)研究過(guò)怎么具體使用Win32來(lái)完成這個(gè)功能(對(duì)底層不了解),不過(guò)根據(jù)這幾天寫(xiě)Native Code經(jīng)驗(yàn)判斷,是所謂的野指針,訪(fǎng)問(wèn)的內(nèi)存地址不對(duì).
因?yàn)槲抑笆且粋(gè)C#.NET程序員,所以對(duì)內(nèi)存訪(fǎng)問(wèn)(控制)有一點(diǎn)不了解,在這上面磕磕絆絆很多次,所以我直接去用自由存儲(chǔ),結(jié)果發(fā)現(xiàn)解決這個(gè)問(wèn)題……歪打正著吧……