MFCPropertyGridCtrl 是VC 2008 pack中的控件类。

CMFCPropertyGridProperty这个控件类中的属性值类类。

针对修改属性后,对属性值改变的消息处理:

方法一:

当用到CMFCPropertyGridProperty这个类控件的时候出现了一个很白痴的问题,CMFCPropertyGridProperty更改属性值触发的是哪个事件,如何获得他被更改时的通知?

难道要设置回调?我看了这个类的所有的方法,都没有找到设置回调的函数.因为CMFCPropertyGridProperty这个类控件是在属性页CMFCPropertyGridCtrl中活动,所以我就又看了CMFCPropertyGridCtrl这个的方法,唯一找到一个名字稍微靠谱的就是OnPropertyChanged(字面意思就是属性更改),接着我找到MFC的源文件afxpropertygridctrl.cpp,定位到OnPropertyChanged这个函数,发现源代码中有一行GetOwner()->SendMessage(AFX_WM_PROPERTY_CHANGED, GetDlgCtrlID(), LPARAM(pProp));

难道是发送消息来通知的,赶紧回到项目里面在CPropertiesWnd里面加了个自定义消息AFX_WM_PROPERTY_CHANGED(注意要把下面的(Registered message)勾选上)试了试,当更改值的时候果然收到了通知.于是乎赶紧GOOGLE->AFX_WM_PROPERTY_CHANGED终于在MS的网站找找到了AFX_WM_PROPERTY_CHANGED的用法,消息处理函数的第二个参数lParam就是被更改值的那个控件的指针(CMFCPropertyGridProperty*)(CMFCPropertyGridColorProperty*)..等。 问题终于解决...

方法二:

利用回调函数,继承于CMFCPropertyGridProperty。

头文件:

class PropertyGridCallback;
class PropertyGridProperty : public CMFCPropertyGridProperty
{
DECLARE_DYNAMIC(PropertyGridProperty)
friend class CMFCPropertyGridCtrl; public:
PropertyGridProperty(PropertyGridCallback* pCallback, int itemID, const CString& strGroupName, DWORD_PTR dwData = , BOOL bIsValueList = FALSE); PropertyGridProperty(PropertyGridCallback* pCallback, int itemID, const CString& strName, const COleVariant& varValue, int textLimit = , LPCTSTR lpszDescr = NULL, DWORD_PTR dwData = ,
LPCTSTR lpszEditMask = NULL, LPCTSTR lpszEditTemplate = NULL, LPCTSTR lpszValidChars = NULL); virtual ~PropertyGridProperty();
virtual BOOL OnUpdateValue();
virtual BOOL CheckValue(const COleVariant& newValue, std::string& errorString); protected:
PropertyGridCallback* _pCallback;
bool _updatingValue;
COleVariant _lastValue;
int _textLimit;
int _itemID;
};

实现文件:

IMPLEMENT_DYNAMIC(PropertyGridProperty, CMFCPropertyGridProperty)

PropertyGridProperty::PropertyGridProperty(PropertyGridCallback* pCallback, int itemID, const CString& strGroupName, DWORD_PTR dwData /*= 0*/,
BOOL bIsValueList /*= FALSE*/ )
: CMFCPropertyGridProperty(strGroupName, dwData, bIsValueList)
,_itemID(itemID)
,_updatingValue(false)
,_pCallback(pCallback)
{ } PropertyGridProperty::PropertyGridProperty(PropertyGridCallback* pCallback, int itemID, const CString& strName, const COleVariant& varValue, int textLimit,
LPCTSTR lpszDescr /*= NULL*/, DWORD_PTR dwData /*= 0*/, LPCTSTR lpszEditMask /*= NULL*/,
LPCTSTR lpszEditTemplate /*= NULL*/, LPCTSTR lpszValidChars /*= NULL*/ )
: CMFCPropertyGridProperty(strName, varValue, lpszDescr, dwData, lpszEditMask, lpszEditTemplate, lpszValidChars)
,_textLimit(textLimit)
,_itemID(itemID)
,_updatingValue(false)
,_pCallback(pCallback)
{
_lastValue = varValue;
} PropertyGridProperty::~PropertyGridProperty()
{ } BOOL PropertyGridProperty::OnUpdateValue()
{
if (_updatingValue)
{
return TRUE;
} _updatingValue = true;
CString text;
m_pWndInPlace->GetWindowText(text);
text.Trim();
COleVariant newValue(text);
if (newValue == _lastValue)
{
_updatingValue = false;
return TRUE;
} std::string errorString;
if (!CheckValue(text, errorString))
{
AfxMessageBox(errorString.c_str());
}
else
{
_pCallback->SetValue(_itemID, newValue);
_lastValue = newValue;
}
SetValue(_lastValue); _updatingValue = false;
return TRUE;
} BOOL PropertyGridProperty::CheckValue( const COleVariant& newValue, std::string& errorString )
{
DWORD errorID = _pCallback->CheckValue(_itemID, newValue);
if (errorID != )
{
CString errorInfo;
errorInfo.LoadString(errorID);
errorString = errorInfo.GetBuffer();
return FALSE;
}
return TRUE;
}

使用方法:定义个一个对话框,使其继承于回调函数类:

class ControllerPage : public CDialogEx, public PropertyGridCallback
{
DECLARE_DYNAMIC(ControllerPage) public:
ControllerPage(CfgMgr* pCfgMgr, CTreeCtrl* pTreeCtrl, CWnd* pParent = NULL); // standard constructor
virtual ~ControllerPage(); virtual DWORD CheckValue(DWORD itemID, const COleVariant& newValue);
virtual void SetValue(DWORD itemID, COleVariant& newValue); // Dialog Data
enum { IDD = IDD_CONTROLLER_PAGE }; protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
virtual BOOL OnInitDialog(); DECLARE_MESSAGE_MAP() private:
void _InitPropertyCtrl();
PropertyGridCtrl _propertyGrid;
};

CMFCPropertyGridProperty用法的更多相关文章

  1. CMFCPropertyGridProperty SetValue 出错处理

    对CMFCPropertyGridProperty SetValue时容易报错,这种情况一般是Property和value的类型不匹配造成的. 在创建property的时候,指定了数据类型,如果set ...

  2. EditText 基本用法

    title: EditText 基本用法 tags: EditText,编辑框,输入框 --- EditText介绍: EditText 在开发中也是经常用到的控件,也是一个比较必要的组件,可以说它是 ...

  3. jquery插件的用法之cookie 插件

    一.使用cookie 插件 插件官方网站下载地址:http://plugins.jquery.com/cookie/ cookie 插件的用法比较简单,直接粘贴下面代码示例: //生成一个cookie ...

  4. Java中的Socket的用法

                                   Java中的Socket的用法 Java中的Socket分为普通的Socket和NioSocket. 普通Socket的用法 Java中的 ...

  5. [转载]C#中MessageBox.Show用法以及VB.NET中MsgBox用法

    一.C#中MessageBox.Show用法 MessageBox.Show (String) 显示具有指定文本的消息框. 由 .NET Compact Framework 支持. MessageBo ...

  6. python enumerate 用法

    A new built-in function, enumerate() , will make certain loops a bit clearer. enumerate(thing) , whe ...

  7. [转载]Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结

    本文对Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法进行了详细的总结,需要的朋友可以参考下,希望对大家有所帮助. 详细解读Jquery各Ajax函数: ...

  8. 【JavaScript】innerHTML、innerText和outerHTML的用法区别

    用法: <div id="test">   <span style="color:red">test1</span> tes ...

  9. chattr用法

    [root@localhost tmp]# umask 0022 一.chattr用法 1.创建空文件attrtest,然后删除,提示无法删除,因为有隐藏文件 [root@localhost tmp] ...

随机推荐

  1. scikit-learn的GBDT工具进行特征选取。

    http://blog.csdn.net/w5310335/article/details/48972587 使用GBDT选取特征 2015-03-31 本文介绍如何使用scikit-learn的GB ...

  2. Cognos11只需简单几步创建你的Dashboard

    一.环境 操作系统:win10 数据库   :SQLserver 2008 R2 软件版本:IBM Cognos Analytics 11.0.6 浏览器   :IE 11 二.开始创建仪表板 2.1 ...

  3. HTTP认证与https简介

    HTTP请求报头: Authorization HTTP响应报头: WWW-Authenticate  HTTP认证是基于质询/回应(challenge/response)的认证模式. HTTP认证 ...

  4. ERROR: In &lt;declare-styleable&gt; MenuView, unable to find attribute android:preserveIconSpacing

    eclipse  sdk从低版本号切换到高版本号sdk的时候   v7包会包这个错ERROR: In <declare-styleable> MenuView, unable to fin ...

  5. 在SpringTest中将Mockito的mock对象通过spring注入使用

    转载:https://blog.csdn.net/m0_38043362/article/details/80111957 1. 原理介绍 通过BeanFactoryPostProcessor向Bea ...

  6. C++中public、protected、private的差别

    第一: private,public,protected的訪问范围:   private: 仅仅能由该类中的函数.其友元函数訪问,不能被不论什么其它訪问.该类的对象也不能訪问. protected: ...

  7. 微信小程序 - async/await

    下面只是做一些介绍以及使用的原因,详情介绍还请移步博主:https://www.cnblogs.com/SamWeb/p/8417940.html regenerator-runtime下载:http ...

  8. Linux下安装Supervisor的多种方法

    一.安装 1.方法一: pip install  supervisor #!/bin/bash wget http://pypi.python.org/packages/source/s/setupt ...

  9. AngularJS实现三级Table列表

    angular.module('yo03App') .controller('MyrouteCtrl', function ($scope) { $scope.professors = [{ 'nam ...

  10. 数据库中truncate与delete的区别与联系

    昨天被问到truncate与delete的区别,truncate没用过,回去百度了一下,才知道还有这个一种语句. truncate table命令将快速删除数据表中的所有记录(保留数据表结构).这种快 ...