简单创建一个CMFCPropertyGridCtrl
创建一个简单的工程,添加CMFCPropertyGridCtrl这个控件,然后关联一个变量。
BOOL CPropertySysDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// TODO: 在此添加额外的初始化代码
m_propertyGridCtrl.EnableHeaderCtrl(FALSE);
m_propertyGridCtrl.SetVSDotNetLook(FALSE);//描述是否按照.NET的样式绘制控件
m_propertyGridCtrl.MarkModifiedProperties(TRUE);//指定如何显示修改后的属性
m_propertyGridCtrl.SetAlphabeticMode(FALSE);//设置或重置字母模式
m_propertyGridCtrl.EnableDescriptionArea(TRUE);//启用或禁用在属性列表下方显示的说明区域
m_propertyGridCtrl.SetDescriptionRows(3);//设置描述区域的行数
m_propertyGridCtrl.SetShowDragContext();//指定当用户调整列的大小时,框架是否重绘当前属性网格控件的名称和值列
//设置表头宽度
HDITEM item;
item.cxy = 120;
item.mask = HDI_WIDTH;
m_propertyGridCtrl.GetHeaderCtrl().SetItem(0, new HDITEM(item));
//new出来的pGroup和subitem项,不需要手动释放,由m_propertyGridCtrl释放即可
CMFCPropertyGridProperty* pGroup = new CMFCPropertyGridProperty(_T("灯具属性"));
CMFCPropertyGridProperty* pNameItem = new CMFCPropertyGridProperty(_T("名称"), _T("白炽灯"), _T("灯具名称"));
pNameItem->AllowEdit(FALSE);//不允许编辑
pGroup->AddSubItem(pNameItem);
CMFCPropertyGridProperty* pPowerItem = new CMFCPropertyGridProperty(_T("功率(W)"), _T("100"), _T("灯具功率"));
pPowerItem->AllowEdit(TRUE);
pGroup->AddSubItem(pPowerItem);
CMFCPropertyGridProperty* pPriceItem = new CMFCPropertyGridProperty(_T("价格(人民币)"), _T("8.2"), _T("灯具价格"));
pPriceItem->AddOption(_T("8.2"));
pPriceItem->AddOption(_T("10.25"));
pPriceItem->AddOption(_T("12.00"));
pPriceItem->AllowEdit(TRUE);
pGroup->AddSubItem(pPriceItem);
//添加一个属性
m_propertyGridCtrl.AddProperty(pGroup);
m_propertyGridCtrl.ExpandAll(TRUE);
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
初步得到的界面
控件头部设置
m_propertyGridCtrl.EnableHeaderCtrl(TRUE, _T("常用灯具"), _T(""));
这一行描述的是:
下拉框
CMFCPropertyGridProperty* pPriceItem = new CMFCPropertyGridProperty(_T("价格(人民币)"), _T("8.2"), _T("灯具价格"));
pPriceItem->AddOption(_T("8.2"));
pPriceItem->AddOption(_T("10.25"));
pPriceItem->AddOption(_T("12.00"));
pPriceItem->AllowEdit(TRUE);
pGroup->AddSubItem(pPriceItem);
修改后值变黑色
m_propertyGridCtrl.MarkModifiedProperties(TRUE);//指定如何显示修改后的属性
是否允许编辑值
CMFCPropertyGridProperty* pPowerItem = new CMFCPropertyGridProperty(_T("功率(W)"), _T("100"), _T("灯具功率"));
pPowerItem->AllowEdit(TRUE);//是否允许编辑值
pGroup->AddSubItem(pPowerItem);
禁用某一项(变灰色)
CMFCPropertyGridProperty* pPriceItem = new CMFCPropertyGridProperty(_T("价格(人民币)"), _T("8.2"), _T("灯具价格"));
pPriceItem->AddOption(_T("8.2"));
pPriceItem->AddOption(_T("10.25"));
pPriceItem->AddOption(_T("12.00"));
pPriceItem->AllowEdit(TRUE);
pPriceItem->Enable(FALSE);//禁用
pGroup->AddSubItem(pPriceItem);
添加自定义颜色
if (drawCustomColor)
{
m_propertyGridCtrl.SetCustomColors(RGB(228, 243, 254), RGB(46, 70, 165), RGB(200, 236, 209), RGB(33, 102, 49), RGB(255, 229, 216), RGB(128, 0, 0), RGB(159, 159, 255));
}
else
{
COLORREF c = (COLORREF)-1;
m_propertyGridCtrl.SetCustomColors(c, c, c, c, c, c, c);
}
按照属性名进行排序
m_propertyGridCtrl.EnableMarkSortedColumn(m_bMarkSortedColumn);
添加颜色属性
//添加颜色
COLORREF defaultColorRef = RGB(228, 243, 254);
CMFCPropertyGridColorProperty* pColorProperty = new CMFCPropertyGridColorProperty(_T("构件颜色"), defaultColorRef);
pGroup->AddSubItem(pColorProperty);
添加文件路径属性框
static TCHAR BASED_CODE szFilter[] = _T("Icon Files(*.ico)|*.ico|All Files(*.*)|*.*||");
pGroup->AddSubItem(new CMFCPropertyGridFileProperty(_T("Icon"), TRUE, _T(""), _T("ico"), 0, szFilter, _T("Specifies the dialog icon")));
添加多个属性
BOOL CPropertySysDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// TODO: 在此添加额外的初始化代码
m_propertyGridCtrl.EnableHeaderCtrl(TRUE, _T("常用灯具"), _T(""));
m_propertyGridCtrl.SetVSDotNetLook(FALSE);//描述是否按照.NET的样式绘制控件
m_propertyGridCtrl.MarkModifiedProperties(TRUE);//指定如何显示修改后的属性
m_propertyGridCtrl.SetAlphabeticMode(FALSE);//设置或重置字母模式
m_propertyGridCtrl.EnableDescriptionArea(TRUE);//启用或禁用在属性列表下方显示的说明区域
m_propertyGridCtrl.SetDescriptionRows(3);
m_propertyGridCtrl.SetShowDragContext();//指定当用户调整列的大小时,框架是否重绘当前属性网格控件的名称和值列
//设置表头宽度
HDITEM item;
item.cxy = 120;
item.mask = HDI_WIDTH;
m_propertyGridCtrl.GetHeaderCtrl().SetItem(0, new HDITEM(item));
//!++ 添加灯具属性
{
//new出来的pGroup和subitem项,不需要手动释放,由m_propertyGridCtrl释放即可
CMFCPropertyGridProperty* pGroup = new CMFCPropertyGridProperty(_T("灯具属性"));
CMFCPropertyGridProperty* pNameItem = new CMFCPropertyGridProperty(_T("名称"), _T("白炽灯"), _T("灯具名称"));
pNameItem->AllowEdit(FALSE);//不允许编辑
pGroup->AddSubItem(pNameItem);
CMFCPropertyGridProperty* pPowerItem = new CMFCPropertyGridProperty(_T("功率(W)"), _T("100"), _T("灯具功率"));
pPowerItem->AllowEdit(TRUE);
pGroup->AddSubItem(pPowerItem);
CMFCPropertyGridProperty* pPriceItem = new CMFCPropertyGridProperty(_T("价格(人民币)"), _T("8.2"), _T("灯具价格"));
pPriceItem->AddOption(_T("8.2"));
pPriceItem->AddOption(_T("10.25"));
pPriceItem->AddOption(_T("12.00"));
pPriceItem->AllowEdit(TRUE);
pPriceItem->Enable(FALSE);
pGroup->AddSubItem(pPriceItem);
//添加颜色属性
COLORREF defaultColorRef = RGB(228, 243, 254);
CMFCPropertyGridColorProperty* pColorProperty = new CMFCPropertyGridColorProperty(_T("构件颜色"), defaultColorRef);
pGroup->AddSubItem(pColorProperty);
//添加文件查找属性
static TCHAR BASED_CODE szFilter[] = _T("Icon Files(*.ico)|*.ico|All Files(*.*)|*.*||");
pGroup->AddSubItem(new CMFCPropertyGridFileProperty(_T("Icon"), TRUE, _T(""), _T("ico"), 0, szFilter, _T("Specifies the dialog icon")));
//添加一个属性
m_propertyGridCtrl.AddProperty(pGroup);
}
//!++ 添加其他属性
{
CMFCPropertyGridProperty* pGroup = new CMFCPropertyGridProperty(_T("其他属性"));
CMFCPropertyGridProperty* pNameItem = new CMFCPropertyGridProperty(_T("使用寿命"), _T("100天"), _T("灯具使用保质期"));
pNameItem->AllowEdit(FALSE);//不允许编辑
pGroup->AddSubItem(pNameItem);
CMFCPropertyGridProperty* pItem = new CMFCPropertyGridProperty(_T("维修店地址"), _T("北京三里屯"), _T("灯具维修地址"));
pItem->AllowEdit(FALSE);//不允许编辑
pGroup->AddSubItem(pItem);
//添加一个属性
m_propertyGridCtrl.AddProperty(pGroup);
}
m_propertyGridCtrl.ExpandAll(TRUE);
if (1)
{
m_propertyGridCtrl.SetCustomColors(RGB(228, 243, 254), RGB(46, 70, 165), RGB(200, 236, 209), RGB(33, 102, 49), RGB(255, 229, 216), RGB(128, 0, 0), RGB(159, 159, 255));
}
else
{
COLORREF c = (COLORREF)-1;
m_propertyGridCtrl.SetCustomColors(c, c, c, c, c, c, c);
}
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
获取当前控件有的属性项
int count = m_propertyGridCtrl.GetPropertyCount();
获取每一个属性的属性值列表并打印
int count = m_propertyGridCtrl.GetPropertyCount();
for (int i = 0; i < count; i++)
{
CMFCPropertyGridProperty* pProperty = m_propertyGridCtrl.GetProperty(i);
if (pProperty == nullptr)
continue;
int subItemCount = pProperty->GetSubItemsCount();
for (int j = 0; j < subItemCount; j++)
{
CMFCPropertyGridProperty *pSubProperty = pProperty->GetSubItem(j);
if (pSubProperty == nullptr)
continue;
CString name = pSubProperty->GetName();
COleVariant value = pSubProperty->GetValue();
}
}