[WM]MFC里面的PropertySheet使用

我是一个问题少年,之前买过一本” 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,剩下的自由发挥.

void RefreshPages()
{
	int pageCount= this->GetPageCount();
	int insertCount=5;
	for (int i=0;i<_PropertyPageCache.size();i++)
	{
		delete _PropertyPageCache[i];
	}
	_PropertyPageCache.clear();
	for (int i=0;i<insertCount;i++)
	{
		CMyPropertyPage* page= new CMyPropertyPage;
		page->Construct(IDD_MYDIALOG);
		page->m_psp.pszTitle=L”Demo”;
		page->m_psp.dwFlags|=PSP_USETITLE;
		this->AddPage(page);
		_PropertyPageCache.push_back(page);
	}  
	for (int i = 0;i<pageCount;i++)
	{
		this->RemovePage(0);
	} 
}
 
 

Remove可以(最好)在后面完成,因为如果删完了的话,CMyPropertySheet会直接跳出消息循环……

 

OK,现在你的PropertySheet就能完成动态增删的功能,剩下的就是看你想在什么地方动态增删Page了,哪里需要,就把this指针给谁~~简单吧

 

PS:

曾经试过如果不cache这些Page的话,PropertySheet也创建了,但是Page的Title都不对,而且点击都会崩溃,因为我也没研究过怎么具体使用Win32来完成这个功能(对底层不了解),不过根据这几天写Native Code经验判断,是所谓的野指针,访问的内存地址不对.

因为我之前是一个C#.NET程序员,所以对内存访问(控制)有一点不了解,在这上面磕磕绊绊很多次,所以我直接去用自由存储,结果发现解决这个问题……歪打正着吧……

PS:

测试人员超级有耐心,给里面添加了100+的Page,结果程序直接不能启动.查阅MSDN得知,里面只能添加99个,否则PropertySheet会直接退出.

If you attempt to add more than 99 pages to a property sheet, this function will fail, but with no indication of the cause of the error: PropertySheet returns a value of -1, but GetLastError returns 0.

不过在我的模拟器里面GetLastError是6.....

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值