zoukankan      html  css  js  c++  java
  • [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.....

    /**********************************************************************
     * 机械教条主义
     *
     * From:          http://www.cnblogs.com/egmkang/
     * Email:          egmkang [at] outlook.com
     * Weibo:        http://weibo.com/egmkang
     * Github:       http://github.com/egmkang
     *
     **********************************************************************/

  • 相关阅读:
    添加右键菜单
    闭包和迭代器
    函数的进阶
    函数入门
    文件操作
    深浅拷贝
    小数据池和再谈编码
    字典
    list tuple
    int bool str
  • 原文地址:https://www.cnblogs.com/egmkang/p/1705045.html
Copyright © 2011-2022 走看看