Visual C++2012中CMFCPropertySheet的用法

看到了一个例子(NewControls),该例子中使用了按钮图片等特效(哈哈,个人觉得挺高端),但是仔细看它的工程,没有xxxDlg.cpp就觉得奇诡了,难道不是基于对话框完成的?最终查阅居然是这样的。

1、新建一个MFC的对话框工程;

2、加入两个对话框资源,资源类型是IDD_PROPPAGE,ID为IDD_PROPPAGE1和IDD_PROPPAGE2;

3、增加两个类CPage1和Cpage2,基类是CPropertyPage,和刚才我们的对话框资源关联起来。这里基类为什么不选择CMFCPropertyPage呢,因为IDE对CMFCPropertyPage类的支持不是很好,在添加类的时候基类选CMFCPropertyPage的话无法关联对话框。。。。

4、查找所有CPropertyPage,替换为CMFCPropertyPage,这样,我们自己的两个对话框类就是从CMFCPropertyPage继承来的了。

5、新建一个类CMySheet,基类是CMFCPropertySheet,增加两个成员变量,分别是CPage1和Cpage2的对象

6、增加CMySheet类的带参构造函数为CMySheet (LPCTSTR pszCaption, CWnd* pParentWnd = NULL);为什么呢?因为类向导生成构造函数是无参的,而我们需要第一个参数pszCaption来改变属性表单对话框的标题,因此这里要修改一下。构造函数定义如下:

CMySheet::CMySheet(LPCTSTR pszCaption, CWnd* pParentWnd ):CMFCPropertySheet(pszCaption,pParentWnd )
{
    //m_psh该结构体成员变量中保存了propertysheet的外观样式,一定要在domodal之前调用
    m_psh.dwFlags &=~PSH_HASHELP;
    m_psh.dwFlags|=PSH_NOAPPLYNOW;
    //如果要去掉帮助按钮,一定要每个属性页都去掉该按钮
    m_Page1.m_psp.dwFlags&= ~PSP_HASHELP;
    m_Page2.m_psp.dwFlags&= ~PSP_HASHELP;

    BOOL b32BitIcons = TRUE;

    if (afxGlobalData.m_nBitsPerPixel < 16)
    {
        b32BitIcons = FALSE;
    }

    //在这里设置属性表单的外观为PropSheetLook_OutlookBar
    SetLook(CMFCPropertySheet::PropSheetLook_OutlookBar );

    //如果设置outlook外观,则必须提供图标资源
    SetIconsList(b32BitIcons ? IDB_ICONS32 : IDB_ICONS, 32 );

    //将我们设计好的属性页加进属性表单中
    AddPage(&m_Page1);
    AddPage(&m_Page2);
}

7、如果我们要直接运行该属性表单对话框,则需要修改窗口类的InitInstance函数,去掉MFC向导产生的对话框的调用,然后添加以下代码:

    CMySheet ps1(L"HELLO ");//对话框标题
    m_pMainWnd = &ps1;
    INT_PTR nResponse=ps1.DoModal();

    //如果要让你的对话框显的更漂亮,可以增加以下代码
    CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows));

 8、注意:MFC向导添加的CMySheet::CMySheet中,没有重载OnInitDialog();我们必须手动添加,从类向导中,选择虚函数,找到OnInitDialog,添加,同样,为我们的属性页类也添加OnInitDialog函数

按照这个步骤完成以后,我将里面的xxxDlg对话框和xxxDlg.cpp一并都删除了,重新清理整个工程,然后重新编译,居然生成了应用程序,这就是证明已经成功!

         

 但是,本人一直纳闷,这个“确定”“取消”按钮这一块是如何完成的,在整个工程中查找的时候(本人已将IDD_XXXDlG删除),并未查找到是何处绘制了这2个操作按钮……

原文地址:https://www.cnblogs.com/MrYuan/p/5681138.html