CMFCPropertyGridProperty用法
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用法的更多相关文章
- CMFCPropertyGridProperty SetValue 出错处理
对CMFCPropertyGridProperty SetValue时容易报错,这种情况一般是Property和value的类型不匹配造成的. 在创建property的时候,指定了数据类型,如果set ...
- EditText 基本用法
title: EditText 基本用法 tags: EditText,编辑框,输入框 --- EditText介绍: EditText 在开发中也是经常用到的控件,也是一个比较必要的组件,可以说它是 ...
- jquery插件的用法之cookie 插件
一.使用cookie 插件 插件官方网站下载地址:http://plugins.jquery.com/cookie/ cookie 插件的用法比较简单,直接粘贴下面代码示例: //生成一个cookie ...
- Java中的Socket的用法
Java中的Socket的用法 Java中的Socket分为普通的Socket和NioSocket. 普通Socket的用法 Java中的 ...
- [转载]C#中MessageBox.Show用法以及VB.NET中MsgBox用法
一.C#中MessageBox.Show用法 MessageBox.Show (String) 显示具有指定文本的消息框. 由 .NET Compact Framework 支持. MessageBo ...
- python enumerate 用法
A new built-in function, enumerate() , will make certain loops a bit clearer. enumerate(thing) , whe ...
- [转载]Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结
本文对Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法进行了详细的总结,需要的朋友可以参考下,希望对大家有所帮助. 详细解读Jquery各Ajax函数: ...
- 【JavaScript】innerHTML、innerText和outerHTML的用法区别
用法: <div id="test"> <span style="color:red">test1</span> tes ...
- chattr用法
[root@localhost tmp]# umask 0022 一.chattr用法 1.创建空文件attrtest,然后删除,提示无法删除,因为有隐藏文件 [root@localhost tmp] ...
随机推荐
- jQuery对象
$(document).ready(function(){ //第二种获取方法,通过标签的名<h2>Dom来获取 var h1 = document.getElementsByTagNam ...
- SSH框架的基本整合
SSH框架的基本整合 AOP注解方式 编写切面类(包括通知和切入点) 开启自己主动代理 JDBC模板技术 Spring提供模板技术,数据库的操作 以后编写DAO层,都能够继承JdbcDaoSuppor ...
- Mac 流程图
https://www.lucidchart.com/pages/signup?utm_expid=39895073-174.qKyHpBEbQS26y86OArD-rQ.1 https://www. ...
- JavaScript Array 对象扩展方法
/** 删除数组中指定索引的数据 **/ Array.prototype.deleteAt = function (index) { if (index < 0) { return this; ...
- LintCode: Combination Sum II
C++ DFS class Solution { public: void help(vector<int> &a, int now, int sum, int target, v ...
- Selenium2(WebDriver)总结(五)---元素操作进阶(常用类)
1.Alert类 Alert是指windows弹窗的一些操作,需要new一个Alert类 driver.switchTo().alert():切换到alert窗口 alert.getText():取得 ...
- Java中创建访问HTTPS的自签名证书的方法
一.问题: 常常在用java访问https的请求时,总是出现SSL禁止的异常.这里给大家教下怎么创建与添加证书. 二.工具 : 1.创建一个目录 2.去Github上搜索InstallCert,然后随 ...
- JAVA调用SHELL事例
以往一直都是crontab+shell调用java程序,最近需要反过来,使用java调用shell程序,实现定时管理,今天总结一下. 基础内容: java的java.lang.Runtime类提供了e ...
- [转]mysql组合索引与字段顺序
下列转自:http://www.tech-q.cn/archiver/tid-11673.html 很多时候,我们在mysql中创建了索引,但是某些查询还是很慢,根本就没有使用到索引!一般来说,可能是 ...
- debian下配置网络 安装无线网卡驱动 Broadcom BCMXX系列
解决方案来自于debian官网 https://wiki.debian.org/wl 1.加入源 deb http://http.debian.net/debian/ wheezy main c ...