CMFCPropertySheet和CMFCPropertyPage增强用法

介绍

测试平台

win10 x64
vs2010
MFC

结果图

这里写图片描述

功能一:让树形列表有连接线

默认的左侧树形列表是没有连接线的。其实CMFCPropertySheet的源码可以看到,内部就是一个CTreeCtrl。所以派生出来改变下树形很好实现。直接上代码

class CMyPropertySheet : public CMFCPropertySheet

重载虚函数

virtual CWnd* InitNavigationControl();
CWnd* CMyPropertySheet::InitNavigationControl()
{
    ASSERT_VALID(this);

    CTabCtrl* pTab = GetTabControl();
    ASSERT_VALID(pTab);

    if (m_look == PropSheetLook_Tree)
    {
        CRect rectDummy(0, 0, 0, 0);
        const DWORD dwTreeStyle = WS_CHILD | WS_VISIBLE|TVS_HASLINES|TVS_SHOWSELALWAYS;
        m_wndTree.Create(dwTreeStyle, rectDummy, this, (UINT) 101);

        m_wndTree.ModifyStyleEx(0, WS_EX_WINDOWEDGE);

        if (m_Icons.GetSafeHandle() != NULL)
        {
            m_wndTree.SetImageList(&m_Icons, TVSIL_NORMAL);
            m_wndTree.SetImageList(&m_Icons, TVSIL_STATE);
        }

        // Add categories:
        for (POSITION pos = m_lstTreeCategories.GetHeadPosition(); pos != NULL;)
        {
            AddCategoryToTree(m_lstTreeCategories.GetNext(pos));
        }

        // Add pages:
        for (int nTab = 0; nTab < pTab->GetItemCount(); nTab++)
        {
            InternalAddPage(nTab);
        }

        return &m_wndTree;
    }

    return NULL;
}

注意

const DWORD dwTreeStyle = WS_CHILD | WS_VISIBLE|TVS_HASLINES|TVS_SHOWSELALWAYS;

功能二:点击树形列表不切换图标或自己设定图标

默认树形列表子项点击鼠标的时候会有图标的改变以示选中,但我需要自己控制图标的改变。方法还是派生类改写虚函数

void CMyPropertySheet::OnGetDispInfo(NMHDR* pNMHDR, LRESULT* pResult)
void CMyPropertySheet::OnGetDispInfo(NMHDR* pNMHDR, LRESULT* pResult)
{
    ENSURE(pNMHDR != NULL);

    LPNMTVDISPINFO lptvdi = (LPNMTVDISPINFO) pNMHDR;

    CMFCPropertyPage* pPage = DYNAMIC_DOWNCAST(CMFCPropertyPage, 
        (CObject*) m_wndTree.GetItemData(lptvdi->item.hItem));
/*  if (pPage != NULL)
    {
        ASSERT_VALID(pPage);

        if (pPage == GetActivePage())
        {
            lptvdi->item.iImage = pPage->m_nSelIconNum;
            lptvdi->item.iSelectedImage = pPage->m_nSelIconNum;
        }
        else
        {
            lptvdi->item.iImage = pPage->m_nIcon;
            lptvdi->item.iSelectedImage = pPage->m_nIcon;
        }
    }*/

    CMFCPropertySheetCategoryInfo* pCategory = DYNAMIC_DOWNCAST(CMFCPropertySheetCategoryInfo,
        (CObject*) m_wndTree.GetItemData(lptvdi->item.hItem));
    if (pCategory != NULL)
    {
        ASSERT_VALID(pCategory);

        if (lptvdi->item.state & TVIS_EXPANDED)
        {
            lptvdi->item.iImage = pCategory->m_nSelectedIcon;
            lptvdi->item.iSelectedImage = pCategory->m_nSelectedIcon;
        }
        else
        {
            lptvdi->item.iImage = pCategory->m_nIcon;
            lptvdi->item.iSelectedImage = pCategory->m_nIcon;
        }
    }

    *pResult = 0;
}

其实就是将一段代码注释掉就可以了。另外再增加一个改变图标的函数,函数里调用Ctreectrl自带的下面这个方法

m_wndTree.SetItemimage(...)

就完成了。

CPropertyPage类是MFC中用于创建属性页的基类。要实现下一页的向导,可以使用CMFCPropertySheet类来管理属性页,并使用AddPage函数将属性页添加到属性中。 下面是一个示例代码,演示了如何使用CPropertyPage和CMFCPropertySheet实现下一页的向导: ```cpp // 定义属性页类 class CMyPropertyPage : public CPropertyPage { // 实现属性页的内容和行为 }; // 定义属性类 class CMyPropertySheet : public CMFCPropertySheet { public: CMyPropertySheet(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage) : CMFCPropertySheet(pszCaption, pParentWnd, iSelectPage) { // 添加属性页到属性中 AddPage(&m_page1); AddPage(&m_page2); // ... } virtual BOOL OnSetActive() { // 在每次切换到下一页时执行的操作 // 可以在这里进行验证或其他处理 return CMFCPropertySheet::OnSetActive(); } virtual BOOL OnWizardFinish() { // 在点击完成按钮时执行的操作 // 可以在这里进行最后的验证或其他处理 return CMFCPropertySheet::OnWizardFinish(); } private: CMyPropertyPage m_page1; CMyPropertyPage m_page2; // ... }; // 创建属性并显示 CMyPropertySheet propSheet(_T("My Wizard"), this, 0); propSheet.DoModal(); ``` 在上述代码中,我们定义了一个CMyPropertyPage类作为属性页的基类,并实现了属性页的内容和行为。然后,我们定义了一个CMyPropertySheet类作为属性的基类,并在构造函数中使用AddPage函数将属性页添加到属性中。在CMyPropertySheet类中,我们还可以重写OnSetActive函数,在每次切换到下一页时执行一些操作,以及重写OnWizardFinish函数,在点击完成按钮时执行一些操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值