CMFCPropertySheet和CMFCPropertyPage增强用法

介绍

  • CMFCPropertySheet和CMFCPropertyPage都是vs08sp1以后引入的新类,扩充了已有的CPropertySheet和CPropertyPage这两个类。
  • CMFCPropertySheet和CMFCPropertyPage的基础用法可以参考下面几篇文章

    Visual C++2010中CMFCPropertySheet的用法
    CMFCPropertySheet的使用及PROPSHEETHEADER结构体介绍
    CMFCPropertySheet Class

  • 这里记录下几个增强功能,是从CMFCPropertySheet派生类的方法实现

测试平台

win10 x64
vs2010
MFC

结果图

CMFCPropertySheet和CMFCPropertyPage增强用法_第1张图片

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

默认的左侧树形列表是没有连接线的。其实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(...)

就完成了。

你可能感兴趣的:(property,sheet,属性表,CMFC)