【发布时间】:2016-04-14 17:45:34
【问题描述】:
几天前,我试图实现一种方法,该方法可以检测我的属性窗口 (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 后擦除整个更新信息),这可能与 @ 中的其他方法和属性有关987654328@ 仍未在此辅助类中实现。
我想知道:在我的辅助类中实现 CMFCPropertyGridProperty 类中包含的所有内容将是一项艰巨的工作(就像我对构造函数所做的那样)。是否应该有一个关于 OOP 的策略来解决问题?另外,我不知道我的方法是否是最好的。我的意思是,有没有更简单的方法来实现BOOL CMFCPropertyGridProperty::OnUpdateValue() 而无需重写另一个类的代码?欢迎任何想法!
【问题讨论】:
-
你能继承
CMFCPropertyGridProperty并破解错误吗?我过去曾使用 Winforms 对象做到这一点。 -
“子类”是什么意思?抱歉,我是 C++/MFC 的新手
-
子类的意思是你要写一个新的类,继承自
CMFCPropertyGridProperty啊,对不起。我从您的代码中看到您已经这样做了。 -
OOP 策略称为继承。您继承基类成员并覆盖您想要专门化的虚拟成员,如果需要,可能会调用基类实现。如果有错误,请修复它们。并查看The Definitive C++ Book Guide and List - 这是基本的 C++。
标签: c++ inheritance mfc