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] ...
随机推荐
- MySql查询时间段的方法(转)
http://www.jb51.net/article/58668.htm 本文实例讲述了MySql查询时间段的方法.分享给大家供大家参考.具体方法如下: MySql查询时间段的方法未必人人都会,下面 ...
- 【转载】springboot:如何优雅的使用mybatis
这两天启动了一个新项目因为项目组成员一直都使用的是mybatis,虽然个人比较喜欢jpa这种极简的模式,但是为了项目保持统一性技术选型还是定了 mybatis.到网上找了一下关于spring boot ...
- Linq-单条数据删除
单条数据删除,用DeleteOnSubmit NorthwindDataContext db = new NorthwindDataContext(); Customer test1 = ctx.Cu ...
- junit与spring-data-redis 版本对应成功的
spring-data-redis 版本:1.7.2.RELEASE junit 版本:4.12
- JavaScript 判断一个对象{}是否为空对象的简单方法
第一种: function isEmptyObject(obj) { for (var key in obj) { //返回false,不为空对象 return false; } return tru ...
- MATLAB 制作GIF图像
前提要求:图像集保存在某个文件夹中,且每个图像以数字形式顺序命名,如001.jpg,002.jpg等. 代码1: 这个代码生成的效果有点问题,建议采用代码2. wm={'overwrite','app ...
- Azure Web应用中设置静态虚拟目录的方法(比如部署Django需要用到)
一.WEB应用中设置虚拟目录 二.在虚拟目录下放一个文件web.config,内容如下: <?xml version="1.0"?> <configuration ...
- 如何解析android访问webservice返回的SoapObject数据(可用)
怎么解析android访问webservice返回的SoapObject数据 本帖最后由 kkDragon123 于 2013-03-26 15:50:07 编辑 我的数据如下:mingdanResp ...
- 远程IPC种植木马
要实现代码例如以下: ///////////////////////////////////////////////////////////////////////////////////// typ ...
- 〖Linux〗使用命令行切换触摸板的状态on/off/toggle
最近发现在Ubuntu13.10中使用Fn+F9对触摸板的控制操作不灵了: 并且在黑夜.外置键盘时,按下这个组合键也很不方便,由此便想到使用命令行来切换触摸板状态: 脚本:~/bin/touchpad ...