网易博客旧文--CMFCPropertyGridProperty,CMFCPropertyGridCtrl组件使用小结

CMFCPropertyGridProperty,CMFCPropertyGridCtrl组件使用小结
2013-06-03 12:09:03| 分类: MFC | 标签: |举报 |字号大中小 订阅

CMFCPropertyGridProperty是微软MFC的一个属性格子类,从VS2008SP1开始支持。主要实现成对的属性及值的显示和修改。类似如下图:
CMFCPropertyGridProperty,CMFCPropertyGridCtrl组件使用小结 - xzhoumin - MMZHOU的博客

1、创建方式
对于对话框,有动态创建和静态创建两种,动态创建就是调用wnd的create方法,例如:
先在对话框上放一个占位控件Picture ControlCMFCPropertyGridProperty,CMFCPropertyGridCtrl组件使用小结 - xzhoumin - MMZHOU的博客
然后在这个位置上创建CMFCPropertyGridCtrl
CRect rectPropList;
m_wndPropListLocation.GetClientRect(&rectPropList);
m_wndPropListLocation.MapWindowPoints(this, &rectPropList);
m_wndPropList.Create(WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER, rectPropList, this, (UINT)-1);
另外一个方式就是静态创建,直接从工具中选取CMFCPropertyGridProperty,CMFCPropertyGridCtrl组件使用小结 - xzhoumin - MMZHOU的博客
放入到对话框中,然后用绑定到一个变量上即可,例如
CMFCPropertyGridCtrl m_grid;
当然,后面一个方式只有VS2010才支持,在VS2008中没有这个控件,只能用动态创建的方式。

对于单文档或多文档类型的应用程序
一般是将CMFCPropertyGridCtrl作为继承自CDockablePane的类的成员变量来进行创建
可以参考向导生成的程序。

{
// 构造
public:
	CPropertiesWnd();

	void AdjustLayout();

// 特性
public:
	void SetVSDotNetLook(BOOL bSet)
	{
		m_wndPropList.SetVSDotNetLook(bSet);
		m_wndPropList.SetGroupNameFullWidth(bSet);
	}

protected:
	CFont m_fntPropList;
	CComboBox m_wndObjectCombo;
	CPropertiesToolBar m_wndToolBar;
	CMFCPropertyGridCtrl m_wndPropList;

创建CDockablePane继承类时自然就将CMFCPropertyGridCtrl创建好了

2、如何使用
在CMFCPropertyGridCtrl中每一行是一个CMFCPropertyGridProperty类的实例来进行管理
每行既可以是单独的,也可以是一个组,组中的成员也是CMFCPropertyGridProperty类的实例,只不过属于组的一个子项
创建每一行直接用new的方式,CMFCPropertyGridCtrl会对这些指针进行管理,不需要考虑释放的问题。
创建一个组
std::auto_ptr apGroup1(new CMFCPropertyGridProperty(_T(“Appearance”)));

COleVariant var3DLook((short)VARIANT_FALSE, VT_BOOL);
apGroup1->AddSubItem(new CMFCPropertyGridProperty(_T("3D Look"), var3DLook, _T("Specifies the dialog's font will be nonbold and controls will have a 3D border")));

CMFCPropertyGridProperty* pProp = new CMFCPropertyGridProperty(_T("Border"), _T("Dialog Frame"), _T("One of: None, Thin, Resizable, or Dialog Frame"));
pProp->AddOption(_T("None"));
pProp->AddOption(_T("Thin"));
pProp->AddOption(_T("Resizable"));
pProp->AddOption(_T("Dialog Frame"));
pProp->AllowEdit(FALSE);

apGroup1->AddSubItem(pProp);
apGroup1->AddSubItem(new CMFCPropertyGridProperty(_T("Caption"), (COleVariant) _T("About NewControlsDemo"), _T("Specifies the text that will be displayed in the dialog's title bar")));

m_wndPropList.AddProperty(apGroup1.release());

更多的方式可以参考
C:\Program Files\Microsoft Visual Studio 10.0\Samples\2052\C++\MFC\Visual C++ 2008 Feature Pack\NewControls\Page5.cpp
这个工程中的这个文件

3、注意
3.1 如何修改头的文字和宽度
// 修改头名称
m_grid.EnableHeaderCtrl(TRUE,_T(“名称”),_T(“值”));

	m_grid.MarkModifiedProperties();
	
	// 修改头宽度
	HDITEM item; 
	item.cxy=120; 
	item.mask=HDI_WIDTH; 
	m_grid.GetHeaderCtrl().SetItem(0, new HDITEM(item));

3.2如何校验输入值的有效性

由于
CMFCPropertyGridProperty(const CString& strName, const COleVariant& varValue, LPCTSTR lpszDescr = NULL, DWORD_PTR dwData = 0,LPCTSTR lpszEditMask = NULL, LPCTSTR lpszEditTemplate = NULL, LPCTSTR lpszValidChars = NULL);

其构造函数中第二个值参数是变体,因此只要让其识别出具体的类型,就可以自动判定输入的有效性,比如bool,就只允许输入False和True,short就只允许输入-32768~32767并且在输入超范围时会有提示。
一种是在强制转换时指明参数的类型,一种是将参数类型就赋值给 COleVariant 类型的即可。
充分利用这个优势,很多情况就不需要自己写校验代码和提示了。
对于一些特殊的输入,可以利用lpszEditMask ,lpszEditTemplate ,lpszValidChars 来进行控制
lpszEditMask 表示输入的掩码,lpszEditTemplate 表示输入的模板,lpszValidChars 表示允许输入的有效字符
以下是例子:
// Mask 1: phone number

		_T("(___) ___-____"), // Literal, "_" char = character entry
		_T(' ')); // Default char
	m_wndMaskEdit1.SetValidChars(NULL); // Valid string characters
	m_wndMaskEdit1.SetWindowText(_T("(123) 123-1212"));
// Mask 2: State, Zip Code
		_T("State: __, Zip: _____-____"), // Literal, "_" char = character entry
		_T(' ')); // Backspace replace char
	m_wndMaskEdit2.SetValidChars(NULL); // Valid string characters
	m_wndMaskEdit2.SetWindowText(_T("State: NY, Zip: 12345-6789"));

// Mask 3: serial code

		_T("S/N: ____-____-____-____"), // Literal, "_" char = character entry
		_T('_')); // Backspace replace char
	m_wndMaskEdit3.SetValidChars(NULL); // Valid string characters
	m_wndMaskEdit3.SetWindowText(_T("S/N: FPR5-5678-1234-8765"));
// Mask 4: 0xFFFF
		_T("0x____"), // Literal, "_" char = character entry
		_T('_')); // Backspace replace char
	m_wndMaskEdit4.SetValidChars(_T("1234567890ABCDEFabcdef")); // Valid string characters
	m_wndMaskEdit4.SetWindowText(_T("0x01AF"));
// Mask 5: digits only
	m_wndMaskEdit5.SetValidChars(_T("1234567890")); // Valid string characters
	m_wndMaskEdit5.SetWindowText(_T("1234567890"));

注意,初始值一定要符合自己定义的模板和掩码的格式,否则会碰到无法输入的情况
另外,格子的输入实际就是使用的MFC的CMFCMaskedEdit类,因此在MSDN中查找此类,可以得到更多的有用的信息

对于格子的更多类型控制,可以参考
C:\Program Files\Microsoft Visual Studio 10.0\Samples\2052\C++\MFC\Visual C++ 2008 Feature Pack\NewControls
中的CustomProperties.cpp文件
这个文件中,增加了很多对于输入的控制,可以直接拿来使用,也可以参考写出更多符合自己特殊需要的控制。
例如CPasswordProp就是密码输入控制

以下是我用的一个用于输入固定长度的只允许输入1和0的使用方式,供参考

			for (int j=0;j<bitlen;++j)
			{
				strMask+=_T("d");
				strTempl+=_T("_");
			}
			strMask+=_T(" ");
			strTempl+=_T(")");
			CString strDesc;
			strDesc.Format(_T("只能输入0或者1,长度为%d,请输入完整"),bitlen);
			pProp = new CMFCPropertyGridProperty(CString(strName),
				rowValue,
				strDesc,
				0,
				strMask,
				strTempl,
				_T("01")
				);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值