c++ - 重新实现 CMFCPropertyGridProperty 类 (MFC) 的最佳方式

标签 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 出现后删除整个更新的信息),这可能与 CMFCPropertyGridProperty 中的其他方法和属性有关在这个辅助类中仍然没有实现。 我想知道:在我的辅助类中实现 CMFCPropertyGridProperty 类中包含的所有内容将是一项艰巨的工作(就像我对构造函数所做的那样)。是否应该有一个关于 OOP 的策略来解决问题?另外,我不知道我的方法是否最好。我的意思是,有没有更简单的方法来实现 BOOL CMFCPropertyGridProperty::OnUpdateValue() 而无需重写另一个类的代码?欢迎任何想法!

最佳答案

MFC 已经实现了这样的“消息”。您不需要自己做这些事情。

有一个已注册的 Windows 消息 AFX_WM_PROPERTY_CHANGED 会在属性发生更改时发送。它被发送给网格的所有者。

请参阅 MSDN 中的文档.

还有一个虚函数 CMFCPropertyGridCtrl::OnPropertyChanged 会在属性更改时调用。

即使您希望调用您的内部 OnUpdateValue 值。这很容易。实现您自己的 CMFCPropertyGridCtrl::OnPropertyChanged。使用 DYNAMIC_DOWNCAST 获取指向您的 Aux 类的指针,然后调用 OnUpdateValue...没什么大不了的。

关于c++ - 重新实现 CMFCPropertyGridProperty 类 (MFC) 的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20504836/

相关文章:

java - 使模板更容易的 JSP 技巧?

C++类继承在派生类中分离方法

mfc - 指定对话框的背景色时,MFC重复SetWindowText()崩溃

C++:使用模板变量进行优化

c++ - 如果在派生的 QWidget 中加载,QUiLoader 小部件不显示

c++ - 如何混淆/反混淆整数属性?

C++ 默认、复制和提升构造函数

c++ - 从 C++ 中的大小计算字体高度?

visual-c++ - 在MFC,VC++,多线程应用程序上挂起/随机崩溃

c++ - vs2010 (c++, win32) 文件写入