时间:2014-10-17 09:54:59 来源: 复制分享
我是一个问题少年,之前买过一本” Programming Windows”,上册看过一些,大约知道Win32程序怎么写,怎么工作的.来到新公司,我就准备用Programming Windows里面那种Sample那种形式写程序.
老天就喜欢和我开玩笑,普通的控件的消息响应之类还比较好处理(无非就是那个Switch…case…比较大而已),可以Leader偏偏决定用PropertySheet控件(一复杂控件).用Win32 API对于刚写Native代码的我(到现在写了一个星期)简直就是一个不可能完成的任务.让写一个小程序,后台那些东西我两天就搞定,单单这个PropertySheet我两天都没搞定.
后来看到WTL里面直接可以创建PropertySheet,可是被告知,不允许使用WTL……无奈,只能转投MFC,人生第一次使用MFC……
废话少说,直接说得到的PropertySheet相关的经验.
CPropertySheet和CPropertyPage是两个基类,通常你不需要继承这两个类,不过需要个性化的需求,就需要继承这两个类了.
首先说明,Page类其实就是一个Dialog,里面响应了Notify消息,可以拿到SetActive,KillActive两种比较重要的消息,里面可以做很多个性化的东西;
Sheet类是一个封装类,用来管理Page,例如可以拿到现在有多少个Page,获取当前Active的Page,设置第几个Page为Active等等,更重要的是,他还可以动态的Add , Remove Page.下面讲怎么动态添加删除Page.
假设有CMyPropertySheet和CMyPropertyPage,分别继承自上面那两个类.
CMyPropertySheet里面添加一个成员:
std::vector<CMyPropertyPage*> _PropertyPageCache;
成员RefreshPages来实现动态添加删除Page,只是提供一个简单的Demo,剩下的自由发挥.
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会直接跳出消息循环……
OK,现在你的PropertySheet就能完成动态增删的功能,剩下的就是看你想在什么地方动态增删Page了,哪里需要,就把this指针给谁~~简单吧
PS:
曾经试过如果不cache这些Page的话,PropertySheet也创建了,但是Page的Title都不对,而且点击都会崩溃,因为我也没研究过怎么具体使用Win32来完成这个功能(对底层不了解),不过根据这几天写Native Code经验判断,是所谓的野指针,访问的内存地址不对.
因为我之前是一个C#.NET程序员,所以对内存访问(控制)有一点不了解,在这上面磕磕绊绊很多次,所以我直接去用自由存储,结果发现解决这个问题……歪打正着吧……