前几天,我正在尝试实现一种方法,该方法可以检测我的属性窗口(CPropertiesWnd
)中何时更新值,并在我的MFC应用程序中执行其他操作。由于我主要使用CMFCPropertyGridProperty
实例来处理我的属性窗口中包含的信息,所以我决定实现方法BOOL CMFCPropertyGridProperty::OnUpdateValue()
(虚拟),框架会自动调用它。在我的属性网格中已经改变。因此,由于我无法修改CMFCPropertyGridProperty
类(以及afxpropertygridctrl.h
等其他文件),因此我创建了一个辅助类来执行此操作:
#pragma once
// CMFCPropertyGridPropertyAux
class CMFCPropertyGridPropertyAux : public CMFCPropertyGridProperty
{
public:
CMFCPropertyGridPropertyAux(const CString& strGroupName, DWORD_PTR dwData=0, BOOL bIsValueList=FALSE);
CMFCPropertyGridPropertyAux(const CString& strName, const COleVariant& varValue, LPCTSTR lpszDescr = NULL, DWORD_PTR dwData = 0,
LPCTSTR lpszEditMask = NULL, LPCTSTR lpszEditTemplate = NULL, LPCTSTR lpszValidChars = NULL);
virtual ~CMFCPropertyGridPropertyAux();
BOOL OnUpdateValue();
};
// MFCPropertyGridPropertyAux.cpp : implementation file
//
#include "stdafx.h"
#include "MFCProject.h"
#include "MFCPropertyGridPropertyAux.h"
// CMFCPropertyGridPropertyAux
CMFCPropertyGridPropertyAux::CMFCPropertyGridPropertyAux(const CString& strGroupName, DWORD_PTR dwData,BOOL bIsValueList):CMFCPropertyGridProperty(strGroupName, dwData, bIsValueList)
{
}
CMFCPropertyGridPropertyAux::CMFCPropertyGridPropertyAux(const CString& strName, const COleVariant& varValue, LPCTSTR lpszDescr, DWORD_PTR dwData,
LPCTSTR lpszEditMask, LPCTSTR lpszEditTemplate, LPCTSTR lpszValidChars):CMFCPropertyGridProperty(strName, varValue, lpszDescr, dwData, lpszEditMask, lpszEditTemplate, lpszValidChars)
{
}
CMFCPropertyGridPropertyAux::~CMFCPropertyGridPropertyAux()
{
}
BOOL CMFCPropertyGridPropertyAux::OnUpdateValue() //virtual method implementation
{
AfxMessageBox(L"Value Changed");
//do other stuff
return true;
}
我能够检测到某个属性实际上发生了变化,但是有一些错误(比如在MessageBox出现后删除了整个更新的信息),这可能与{的其他方法和属性有关。 {1}}仍未在此辅助类中实现。
我想知道:在我的辅助类中实现CMFCPropertyGridProperty
类中包含的所有内容将是一项艰巨的任务(就像我对构造函数所做的那样)。是否应该制定一个关于OOP的策略呢?另外,我不知道我的方法是否是最好的方法。我的意思是,有没有更简单的方法来实现CMFCPropertyGridProperty
而不重写另一个类的代码?欢迎任何想法!
答案 0 :(得分:4)
MFC已经实施了这样的“消息”。你不需要自己做这些事情。
有一个已注册的Windows消息 AFX_WM_PROPERTY_CHANGED ,即使属性发生更改,也会发送该消息。它被发送给网格的所有者。
请参阅MSDN中的文档。
还有一个虚拟函数CMFCPropertyGridCtrl :: OnPropertyChanged,当属性发生变化时会调用它。
即使您希望调用内部OnUpdateValue值。这很容易。实现您自己的CMFCPropertyGridCtrl :: OnPropertyChanged。使用DYNAMIC_DOWNCAST获取指向Aux类的指针,只需调用OnUpdateValue ......没什么大不了的。
答案 1 :(得分:1)
实现价值变更并在我的属性窗口中更新。
在 PropertiesWnd.h 文件中添加以下代码
afx_msg LRESULT OnPropertyChanged( __in WPARAM wparam, __in LPARAM lparam );
在 PropertiesWnd.cpp 文件中添加以下代码
ON_REGISTERED_MESSAGE(AFX_WM_PROPERTY_CHANGED, OnPropertyChanged)
以下代码将在任何属性值更改后调用
// [in] lparam:指向CMFCPropertyGridProperty的指针
LRESULT CPropertiesWnd::OnPropertyChanged(__in WPARAM wparam,__in LPARAM lParam )
{
// pProp will have all the variables and info of the active or change property
CMFCPropertyGridProperty* pProp = (CMFCPropertyGridProperty*) lParam;
int pID = pProp->GetData();
CString str = pProp->GetName() ; // get the change property name.
COleVariant i = pProp->GetValue();// get the change value.
//below is the code to change COleVariant to other variable type
LPVARIANT pVar = (LPVARIANT)i;
int x;
short y;
double d;
float f;
bool status;
CString str1;
switch(pVar->vt)
{
case VT_I2: // short
y = pVar->iVal;
break;
case VT_I4: // int
x = pVar->lVal;
break;
case VT_R4: // float
f = pVar->fltVal;
break;
case VT_R8: // double
d = pVar->dblVal;
break;
case VT_INT:
x = pVar->lVal;
break;
case VT_BOOL:
status = pVar->boolVal;
break;
case VT_BSTR:
str1 = pVar->bstrVal;
break;
// etc.
}
return 0;
}
我是使用visual studio 2010完成的。