在DLG中的基本应用 。
首先在Cxxdlg.h文件中加入
- public:
- CMFCPropertyGridCtrl m_MFCPGCtrl;
- CMFCPropertyGridProperty* pGroup1;
- CMFCPropertyGridProperty* pGroup2;
然后Cxxdlg.cpp中的OnInitDialog()中
- CRect rc;
- GetClientRect(rc);
- rc.bottom -= 50;
- rc.left += 50;
- rc.right -= 50;
- m_MFCPGCtrl.Create(WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER,rc,this,IDC_CMFCPGCTRL);
- m_MFCPGCtrl.EnableHeaderCtrl(true,_T("参数"),_T("值"));
- m_MFCPGCtrl.EnableDescriptionArea();
- m_MFCPGCtrl.SetVSDotNetLook();
- m_MFCPGCtrl.MarkModifiedProperties();
- m_MFCPGCtrl.SetAlphabeticMode(false);
- m_MFCPGCtrl.SetShowDragContext();
- pGroup1 = new CMFCPropertyGridProperty(_T("参数组1"));
- pGroup2 = new CMFCPropertyGridProperty(_T("参数组2"));
- pGroup3 = new CMFCPropertyGridProperty(_T("参数组3"));
- pGroup1->AddSubItem(new CMFCPropertyGridProperty(_T("参数1"),_T("2.5"),_T("这是参数1的说明")));
- pGroup1->AddSubItem(new CMFCPropertyGridProperty(_T("参数2"),_T("3.5"),_T("这是参数2的说明")));
- pGroup2->AddSubItem(new CMFCPropertyGridProperty(_T("参数3"),_T("4.5"),_T("这是参数3的说明")));
- pGroup2->AddSubItem(new CMFCPropertyGridProperty(_T("参数4"),_T("5.5"),_T("这是参数4的说明")));
- pGroup3->AddSubItem(new CMFCPropertyGridFileProperty(_T("选择文件"), TRUE, _T("D://defaule.csv"), _T("csv"), NULL, _T("csv Files(*.csv)|*.csv|All Files(*.*)|*.*||"), _T("选择csv文件")));//选择文件按钮
- m_MFCPGCtrl.AddProperty(pGroup1);
- m_MFCPGCtrl.AddProperty(pGroup2);
- m_MFCPGCtrl.AddProperty(pGroup3);
- m_MFCPGCtrl.ExpandAll();
就ok了
下面说下 通过消息活动输入值和输入的位置
.h中加入
- afx_msg LRESULT OnPropertyChanged(WPARAM,LPARAM);
.cpp中加入红色
- BEGIN_MESSAGE_MAP(CCMFCPGCtrlDlg, CDialog)
- ON_WM_SYSCOMMAND()
- ON_WM_PAINT()
- ON_WM_QUERYDRAGICON()
- //}}AFX_MSG_MAP
- ON_REGISTERED_MESSAGE(AFX_WM_PROPERTY_CHANGED, OnPropertyChanged)
- END_MESSAGE_MAP()
然后添加函数
- LRESULT CCMFCPGCtrlDlg::OnPropertyChanged (WPARAM,LPARAM lParam)
- {
- CMFCPropertyGridProperty* pProp = (CMFCPropertyGridProperty*) lParam;
- int i = (int) pProp->GetData ();
- CString s = pProp->GetName(); //被改变的参数名
- COleVariant t = pProp->GetValue(); //改变之后的值
- t = pProp->GetOriginalValue(); //改变之前的值
- CString d;
- d = t.bstrVal; //从COleVariant到CString
- return 0;
- }
==============================================================================
2010.07.01更新
今天发现vs2008sp1里 用向导生成的SDI vs主题框架里 就有很多CMFCPropertyGridProperty的应用 可以参考
===============================================================================
2010.08.02
选项里添加ComboBox 也很方便
- CMFCPropertyGridProperty* pProp = new CMFCPropertyGridProperty(_T("边框"), _T("Dialog Frame"), _T("其中之一: 无(None)、细(Thin)、可调整大小(Resizable)、对话框外框(Dialog Frame)"));
- pProp->AddOption(_T("None"));
- pProp->AddOption(_T("Thin"));
- pProp->AddOption(_T("Resizable"));
- pProp->AddOption(_T("Dialog Frame"));
- pProp->AllowEdit(FALSE);
- pGroup1->AddSubItem(pProp);
就可以有combox出来了
=================================================================================
2012-01-20
程序里想获得prop的指针可以这样
- CMFCPropertyGridProperty* pProp = m_PGCtrl.GetProperty(i)->GetSubItem(j)//i,j分别是大类和小类的序号
比如
0
-0
--0
--1
-1
1
-0
--0
-1
2
=================================================================================
2013-08-20
想要在它的按钮里弹出自己的对话框可以这样派生一个类
- class CBTinValueProperty :public CMFCPropertyGridProperty
- {
- public:
- CBTinValueProperty(const CString& strName,const COleVariant& varValue,LPCTSTR lpszDescr = NULL):
- CMFCPropertyGridProperty(strName,varValue,lpszDescr)
- {}
- virtual ~CBTinValueProperty()
- {}
- virtual BOOL HasButton() const;
- virtual void OnClickButton(CPoint point);
- protected:
- private:
- };
- BOOL CBTinValueProperty::HasButton() const
- {
- return TRUE;
- }
- void CBTinValueProperty::OnClickButton(CPoint point)
- {
- AfxMessageBox(_T("ok"));
- }
=================================================================================
2013-08-29
注意如果有很多个层次 比如
1
-2
--3
---4
其中的2 3 都要设置成Group的形式 ,也就是构造的时候只有一个参数
- CMFCPropertyGridProperty* pProp1 = new CMFCPropertyGridProperty(_T("啊"));
=============================================================================
2013-09-15
关于所有new出来的内存 都不用人工的delete释放,控件类会自动释放
===========================================================================
new对象的时候第2个参数最好不要用这样
- _variant_t((UINT)0)
因为这样就相当于设置了_variant_t参数的格式是UINT 后面再SetValue时可能会触发断言,提示不匹配