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
     *
     **********************************************************************/

  • 相关阅读:
    Codeforces 787D. Legacy 线段树优化建图+最短路
    Codeforces 1051E. Vasya and Big Integers
    BZOJ3261 最大异或和
    BZOJ3531 SDOI2014 旅行
    洛谷P2468 SDOI 2010 粟粟的书架
    2018 ICPC 焦作网络赛 E.Jiu Yuan Wants to Eat
    HDU6280 From Tree to Graph
    HDU5985 Lucky Coins 概率dp
    (HDU)1334 -- Perfect Cubes (完美立方)
    (HDU)1330 -- Deck (覆盖物)
  • 原文地址:https://www.cnblogs.com/egmkang/p/1705045.html
Copyright © 2011-2022 走看看