MFC一一MFCPropertyGridCtrl控件使用

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;
			}
		}
	}
}

本文参考:

http://www.p-chao.com/2017-09-05/mfcpropertygridctrl%E6%8E%A7%E4%BB%B6%E4%BD%BF%E7%94%A8%E8%AF%A6%E8%A7%A3/


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值