MFC属性网格控件,控件样式如下所示:
通常其与Tree Control结合使用,如上图中的左边部分所述,点击左边树结点,对应右边插入相应的MFCPropertyGridCtrl控件,如下我们将介绍MFCPropertyGridCtrl控件
public:
CMFCPropertyGridCtrl m_wndPropList;
一、在窗口创建前,创建属性表格并添加相应的属性设置
int CDialog_Setting_General::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDialogEx::OnCreate(lpCreateStruct) == -1)
return -1;
CRect cRectClient;
GetClientRect (cRectClient);
m_wndPropList.Create(WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER, cRectClient, this, (UINT)-1);
m_wndPropList.EnableHeaderCtrl(FALSE); //是否启用表头
m_wndPropList.EnableDescriptionArea(); //是否启用描述功能
m_wndPropList.SetVSDotNetLook();
m_wndPropList.MarkModifiedProperties(); //是否着重显示修改
//设置属性表格颜色
m_wndPropList.SetCustomColors(
RGB(255,255,255),
RGB(0, 0, 0),
RGB(200,200,200),
RGB(0, 0, 0),
RGB(240, 240, 240),
RGB(0, 0, 0),
RGB(200, 200, 200));
return 0;
}
二、添加属性和分组
这里需要利用到如下两个构造函数,一个是用来构造组属性,一个用来构造值属性
CMFCPropertyGridProperty(
const CString& strGroupName,
DWORD_PTR dwData=0,
BOOL bIsValueList=FALSE
);
CMFCPropertyGridProperty(
const CString& strName,
const _variant_t& varValue,
LPCTSTR lpszDescr=NULL,
DWORD_PTR dwData=0,
LPCTSTR lpszEditMask=NULL,
LPCTSTR lpszEditTemplate=NULL,
LPCTSTR lpszValidChars=NULL
);
然后,利用AddSubItem为每个组添加值属性
BOOL AddSubItem(
CMFCPropertyGridProperty* pProp
);
利用AddProperty添加组属性
int AddProperty(
CMFCPropertyGridProperty* pProp,
BOOL bRedraw=TRUE,
BOOL bAdjustLayout=TRUE
);
实现代码如下所示:
void CDialog_Setting_General::Init_PropList()
{
//更改表头宽度
HDITEM item;
item.cxy = 200;
item.mask = HDI_WIDTH;
m_wndPropList.GetHeaderCtrl().SetItem(0, new HDITEM(item));
vec_property_grid v_item;
vec_property_grid v_prop;
_STL_1MAP_PARAM m_param1;
CString strName,strValue;
TCHAR szUISetting[100]={0};
v_prop.clear();
for (int iProp=0;iProp<NUM_OF_UI_SETTING;iProp++) //创建所有需要构建的组属性
{
v_item.clear();
m_param1 = ui_setting.m_prop[iProp];
MultiByteToWideChar(CP_ACP,0,gszUISetting[iProp],strlen(gszUISetting[iProp]),szUISetting,sizeof(szUISetting));
v_prop.push_back(new CMFCPropertyGridProperty(szUISetting)); //组属性建立
for (int iItem=0;iItem<(int)m_param1.v_param.size();iItem++) //创建各组属性下的所有值属性
{
strName = m_param1.v_param[iItem].c_str();
strValue = m_param1.m_param[m_param1.v_param[iItem]].c_str();
v_item.push_back(new CMFCPropertyGridProperty(strName,strValue)); //值属性建立
v_prop[iProp]->AddSubItem(v_item[iItem]);//为每个组属性添加对应的值属性
if (m_param1.v_param[iItem].compare("Enable")==0)
{
v_item[iItem]->AddOption(_T("0"));
v_item[iItem]->AddOption(_T("1"));
v_item[iItem]->AllowEdit(FALSE);
}
}
m_wndPropList.AddProperty(v_prop[iProp]);//添加组属性
}
}
三、构建之后,我们还需要能够从控件各组属性中的值发生改变后,进行对应读取,并保存数据。这里涉及到数据的读取的相应函数,分别介绍
1、GetPropertyCount获取属性表格的组数
int GetPropertyCount() const;
2、GetProperty获取组属性
CMFCPropertyGridProperty* GetProperty(
int nIndex
) const;
3、GetSubItemsCount获取值属性条数
int GetSubItemsCount() const;
4、GetSubItem获取值属性
CMFCPropertyGridProperty* GetSubItem(
int nIndex
) const;
5、GetName获取属性名
6、GetVaule获取属性值
void CDialog_Setting_General::OnBnClickedButtonSave()
{
vec_property_grid v_item;
vec_property_grid v_prop;
_STL_1MAP_PARAM m_param1;
CString strProp,strName,strValue;
char szProp[100]={0},szName[100]={0},szValue[100]={0};
int iLen=0;
v_prop.clear();
for (int iProp=0;iProp<m_wndPropList.GetPropertyCount();iProp++) //遍历属性表格控件包含的组数
{
v_prop.push_back(m_wndPropList.GetProperty(iProp)); //获取每一组的属性
strProp = v_prop[iProp]->GetName();
ZeroMemory(szProp,sizeof(szProp));
iLen = WideCharToMultiByte(CP_ACP,0,strProp,-1,NULL,0,NULL,NULL);
WideCharToMultiByte(CP_ACP,0,strProp,-1,szProp,iLen,NULL,NULL);
v_item.clear();
for (int iItem=0;iItem<v_prop[iProp]->GetSubItemsCount();iItem++) //遍历每一组属性对应的值属性条目
{
v_item.push_back(v_prop[iProp]->GetSubItem(iItem)); //获取每一个值属性
strName = v_item[iItem]->GetName(); //获取值属性名称
strValue = v_item[iItem]->GetValue(); //获取值属性数据
ZeroMemory(szName,sizeof(szName));
iLen = WideCharToMultiByte(CP_ACP,0,strName,-1,NULL,0,NULL,NULL);
WideCharToMultiByte(CP_ACP,0,strName,-1,szName,iLen,NULL,NULL);
ZeroMemory(szValue,sizeof(szValue));
iLen = WideCharToMultiByte(CP_ACP,0,strValue,-1,NULL,0,NULL,NULL);
WideCharToMultiByte(CP_ACP,0,strValue,-1,szValue,iLen,NULL,NULL);
if (!XToolParam_Write_XML_UISetting(g_hHandle_Param,szProp,szName,szValue)) //保存数据
{
return;
}
}
}
}
本文参考: