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. jQuery对象

    $(document).ready(function(){ //第二种获取方法,通过标签的名<h2>Dom来获取 var h1 = document.getElementsByTagNam ...

  2. SSH框架的基本整合

    SSH框架的基本整合 AOP注解方式 编写切面类(包括通知和切入点) 开启自己主动代理 JDBC模板技术 Spring提供模板技术,数据库的操作 以后编写DAO层,都能够继承JdbcDaoSuppor ...

  3. Mac 流程图

    https://www.lucidchart.com/pages/signup?utm_expid=39895073-174.qKyHpBEbQS26y86OArD-rQ.1 https://www. ...

  4. JavaScript Array 对象扩展方法

    /** 删除数组中指定索引的数据 **/ Array.prototype.deleteAt = function (index) { if (index < 0) { return this; ...

  5. LintCode: Combination Sum II

    C++ DFS class Solution { public: void help(vector<int> &a, int now, int sum, int target, v ...

  6. Selenium2(WebDriver)总结(五)---元素操作进阶(常用类)

    1.Alert类 Alert是指windows弹窗的一些操作,需要new一个Alert类 driver.switchTo().alert():切换到alert窗口 alert.getText():取得 ...

  7. Java中创建访问HTTPS的自签名证书的方法

    一.问题: 常常在用java访问https的请求时,总是出现SSL禁止的异常.这里给大家教下怎么创建与添加证书. 二.工具 : 1.创建一个目录 2.去Github上搜索InstallCert,然后随 ...

  8. JAVA调用SHELL事例

    以往一直都是crontab+shell调用java程序,最近需要反过来,使用java调用shell程序,实现定时管理,今天总结一下. 基础内容: java的java.lang.Runtime类提供了e ...

  9. [转]mysql组合索引与字段顺序

    下列转自:http://www.tech-q.cn/archiver/tid-11673.html 很多时候,我们在mysql中创建了索引,但是某些查询还是很慢,根本就没有使用到索引!一般来说,可能是 ...

  10. debian下配置网络 安装无线网卡驱动 Broadcom BCMXX系列

    解决方案来自于debian官网  https://wiki.debian.org/wl 1.加入源 deb http://http.debian.net/debian/ wheezy main c ...