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. express next function

    nodejs 里面的next()这个函数调用的作用是什么呢? var express = require('express'); var app = express(); var myLogger = ...

  2. 转: gcc 指定运行时动态库路径

    gcc 指定运行时动态库路径 Leave a reply 由于种种原因,Linux 下写 c 代码时要用到一些外部库(不属于标准C的库),可是由于没有权限,无法将这写库安装到系统目录,只好安装用户目录 ...

  3. VS2017专业版使用最新版Qt5.9.2教程

    VS2017专业版使用最新版Qt5.9.2教程(最新教材) 最近三天一直在安装Qt5.9.2,为了能够在自己专业版的VS2017上面使用?可以算是花费了不少的功夫.但是一路上并不是很顺利,就在刚才,终 ...

  4. MySQL8.0手动安装心得。

    https://dev.mysql.com/downloads/mysql/ mysql从5.7一下子跳跃到了8.0,其中的改变还是很大,有点这里就不说了,小伙伴们自己去百度了解一下,这里重点说一下, ...

  5. C++ 对象的定义

    1.考虑下面的方法void Print(const Student& s){ printf("Student[%s:%d]\n", s._Name.c_str(), s._ ...

  6. Android开发 - Fragment与Activity生命周期比较

    1. Fragment的生命周期 见下图 2. 与Activity生命周期的对比 见下图 3. 代码场景演示实例 切换到该Fragment: AppListFragment(7649): onAtta ...

  7. Windows 服务安装教程

    一.安装服务1.已管理员的身份启动CMD2.输入 cd C:\Windows\Microsoft.NET\Framework\v4.0.30319 回车3.输入 InstallUtil.exe Win ...

  8. 微信小程序 - 时间轴(组件)

    更新日期: 2019/3/6:首次发布 2019/3/7:增加content和date自定义(具体使用看示例) 时间轴 参数: 1. data(新闻列表数据)- 2019/3/6 2. content ...

  9. JavaScript的valueOf和toString

    深度好文 http://www.cnblogs.com/coco1s/p/6509141.html 知识要点 不同对象调用valueOf和toString的顺序不一样 高阶函数的使用,替代for循环 ...

  10. python 大小端数据转换

    "6fe28c0ab6f1b372c1a6a246ae63f74f931e8365e15a089c68d6190000000000".decode('hex')[::-1].enc ...