重新实现CMFCPropertyGridProperty类(MFC)的最佳方法

时间:2013-12-10 20:45:00

标签: c++ inheritance mfc

前几天,我正在尝试实现一种方法,该方法可以检测我的属性窗口(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而不重写另一个类的代码?欢迎任何想法!

2 个答案:

答案 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完成的。