CMFCPropertyGridCtrl响应消息
2013-5-5 flyfish www.boboding.com
一 类的继承关系
class CMFCPropertyGridCtrl : publicCWnd
class CMFCPropertyGridProperty : public CObject
查看CMFCPropertyGridCtrl的源码
//Overrides
virtualvoidOnPropertyChanged(CMFCPropertyGridProperty* pProp) const;
voidCMFCPropertyGridCtrl::OnPropertyChanged(CMFCPropertyGridProperty* pProp) const
{
ASSERT_VALID(this);
ASSERT_VALID(pProp);
pProp->SetModifiedFlag();
GetOwner()->SendMessage(AFX_WM_PROPERTY_CHANGED,GetDlgCtrlID(), LPARAM(pProp));
}
这里我们可以重写OnPropertyChanged
二新建一个基于对话框的项目,对话框类是CDlgXXX
头文件增加
afx_msg LRESULTOnPropertyChanged(__in WPARAM wparam, __in LPARAM lparam );
消息映射的地方增加
ON_REGISTERED_MESSAGE(AFX_WM_PROPERTY_CHANGED, &CDlgXXX:OnPropertyChanged )
实现文件增加
LRESULT CDlgXXX::OnPropertyChanged(__in WPARAM wparam, __in LPARAM lparam )
{
return0;
}
三区分操作PropertyGrid某个Item的方法
一个ProtertyGrid可以多个Property,一个Property可以有多个Item,一个Item可以是Edit,可以是ComboBox,因为没有ID,要人为的区分。
方法如下
在对话框的头文件中定义
CMFCPropertyGridCtrl m_PropertyGrid_ctlMain;
CMFCPropertyGridProperty* m_pProperty;
CMFCPropertyGridProperty的构造函数
CMFCPropertyGridProperty(const CString& strName, constCOleVariant& varValue, LPCTSTR lpszDescr = NULL, DWORD_PTR dwData = 0,
LPCTSTR lpszEditMask = NULL,LPCTSTR lpszEditTemplate = NULL, LPCTSTR lpszValidChars = NULL);
第四个参数DWORD_PTRdwData,使用这个参数作为区分操作了哪个控件
m_pProperty1=new CMFCPropertyGridProperty(_T("标题"));
m_pProperty1->AddSubItem(new CMFCPropertyGridProperty(_T("属性"), (COleVariant) _T("值"), _T(""),1));
最后一个参数值为1,这个1就相当于一个控件的ID。
LRESULT CDlgXXX::OnPropertyChanged(__in WPARAM wparam, __in LPARAM lparam )
{
CMFCPropertyGridProperty* pProp = reinterpret_cast<CMFCPropertyGridProperty*>(lparam);
intnID=pProp->GetData();
if (1==nID)
{
//自定义的操作
}
return 0;
}
注意
如果使用的字符集非Unicode,MFC的使用不是在静态库中使用MFC库,如果要使用AfxMessageBox提示内容,之前要加SetFocus(),如果不加,当CMFCPropertyGridProperty中的某个Item是一个ComboBox类型的时就会出错。