介绍
- CMFCPropertySheet和CMFCPropertyPage都是vs08sp1以后引入的新类,扩充了已有的CPropertySheet和CPropertyPage这两个类。
CMFCPropertySheet和CMFCPropertyPage的基础用法可以参考下面几篇文章
Visual C++2010中CMFCPropertySheet的用法
CMFCPropertySheet的使用及PROPSHEETHEADER结构体介绍
CMFCPropertySheet Class这里记录下几个增强功能,是从CMFCPropertySheet派生类的方法实现
测试平台
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(...)
就完成了。