CMFCPropertyGridCtrl相关;属性改变事件代码

本文详细介绍了MFC中CMFCPropertyGridCtrl控件的使用方法,包括控件的基本配置、添加不同类型的项目及其选项、设置项目分组等内容,并附带示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原创作品,允许转载,转载时请务必以超链接形式标明文章  原始出处 、作者信息和本声明。否则将追究法律责任。 http://serious.blog.51cto.com/242085/956984

我写博客从一开始还是日经一文,到后来是周经一文,现在都直接变成月经一文了。。

闲话少说,最近的一个需求是把一些文字跟下拉框集合、对应在一起,如果就那样堆几个static、comboBox平铺在对话框上,不免显得有些单调,而且文字对齐啥的也麻烦,还要排版。找来找去发现了CMFCPropertyGridCtrl这个控件。找了点教程,发现这个控件使用起来还是蛮简单的,关键一点就是要搞清楚层次关系,才不至于混乱,谁是谁的子项,谁是谁的组员等等。

老惯例,上例子。

用vs2010建立一个基于对话框的MFC工程,拖一个CMFCPropertyGridCtrl进去,大小调整好。(注:首先采用的是静态创建的办法,大部分需要的属性在对话框编辑界面就可以编辑。)然后为该控件更改ID为IDC_MFCPROPERTYGRID_TEST,并且使用ClassWizard为控件添加一个变量m_propertyGrid。

接下来更改控件的一些属性。

其实这不就是个CMFCPropertyGridCtrl控件么。Border神马的基础东西就不说了。

"Description Rows Count"指的是下面的描述部分有几行。

"Enable Description Area"表示是否启动下面的描述功能

"Enable Header"表示是否启动表头

"Mark Modified Properties"表示是否着重显示更改项

可以按照需求来进行设置。这里先使用默认的设置。先编译运行一下,比较简陋。

好,接下来该添加东西进去了。

在OnInitDialog中添加如下代码,我会一行一行解释。

  
  
  1. CMFCPropertyGridProperty * pProp1 = new CMFCPropertyGridProperty( 
  2.         _T("天朝适合生存吗?"),  
  3.         _T("51CTO不谈政治"),  
  4.         _T("这是描述部分"));   
  5.  
  6. m_propertyGrid.AddProperty(pProp1); 

第一行是建立一个新的项目,也是最普通的项目,CMFCPropertyGridProperty。与这种项目同级的还有CMFCPropertyGridColorProperty、CMFCPropertyGridFontProperty以及CMFCPropertyGridFileProperty,等会都可以试一下。调用构造函数时传入的三个参数分别是条目名称、默认选项及描述文字。运行一下就知分晓。

饿滴神啊,肿么这个样子。不过该有的全有,只需要设置一下就行。这里得提一笔,微软似乎非常喜欢把第一列的宽度设置为“只能容得下一个普通的5号小宋体的宽度”,不光是CMFCPropertyGrid,连CListCtrl也是如此,需要动点特殊的手段才能调整过来。在这段代码的前面加这么几句:

  
  
  1. HDITEM item; 
  2. item.cxy=120; 
  3. item.mask=HDI_WIDTH; 
  4. m_propertyGrid.GetHeaderCtrl().SetItem(0, new HDITEM(item)); 

如此再运行,就会比较好看了。

好,接下来我们看一下右边的value部分还能换成神马东西。

如同vs2010里提供的“属性”栏一样,这CMFCPropertyGridCtrl应该也支持下拉菜单,好,就来添加下拉菜单看看。修改刚才的代码:

  
  
  1. CMFCPropertyGridProperty* pProp2 = new CMFCPropertyGridProperty(
  2. _T("我是不是帅哥?"),  
  3.     _T("看选项"), 
  4. _T("")); 
  5. pProp2->AddOption(_T("是")); 
  6. pProp2->AddOption(_T("肯定是")); 
  7. pProp2->AddOption(_T("绝对是")); 
  8. pProp2->AllowEdit(FALSE);  //不允许对选项进行编辑
  9.  
  10. m_propertyGrid.AddProperty(pProp2); 

然后运行,就会如愿以偿地出现下拉框了。

接下来是另外三个同级的项目:

  
  
  1. CMFCPropertyGridColorProperty * pProp3 = new CMFCPropertyGridColorProperty( 
  2.     _T("颜色"), RGB(0, 111, 200)); 
  3. m_propertyGrid.AddProperty(pProp3); 
  4.  
  5. CMFCPropertyGridFileProperty * pProp4 = new CMFCPropertyGridFileProperty(
  6. _T("打开文件"), TRUE, _T("D:\\test.txt")); 
  7. m_propertyGrid.AddProperty(pProp4); 
  8.  
  9. LOGFONT font = {NULL}; 
  10. CMFCPropertyGridFontProperty * pProp5 = new CMFCPropertyGridFontProperty(
  11. _T("选择字体"), font); 
  12. m_propertyGrid.AddProperty(pProp5); 

注:每一种类型的项目都有2个或3个重载函数,可以自己根据需求慢慢挖掘,在这里就不赘述了。

运行效果如下:

这么些不同种类的东西乱七八糟堆在一起,是不是有点不科学?那么就引入下一个概念:分组。回到第一张图,vs2010的“属性”栏分了三个组,分别是Apperance、Behavior和Misc,看起来就清晰多了,我们也可以。

好,来重新构建一下我们的代码:

  
  
  1. CMFCPropertyGridProperty * group1 = new CMFCPropertyGridProperty(_T("分组1")); 
  2. CMFCPropertyGridProperty * group2 = new CMFCPropertyGridProperty(_T("分组2")); 
  3.  
  4. group1->AddSubItem(pProp1); 
  5. group1->AddSubItem(pProp2); 
  6. group2->AddSubItem(pProp3); 
  7. group2->AddSubItem(pProp4); 
  8. group2->AddSubItem(pProp5); 
  9.  
  10. m_propertyGrid.AddProperty(group1); 
  11. m_propertyGrid.AddProperty(group2); 

编译运行效果如下:

至此,静态创建CMFCPropertyGridCtrl的方法就结束了。

还有一种方法是动态创建,与CStatic、CEdit等控件无二,在创建之后也可以利用自带的函数修改控件的属性,如:

  
  
  1. CMFCPropertyGridCtrl * propertyGrid = new CMFCPropertyGridCtrl; 
  2. propertyGrid->Create(WS_CHILD | WS_BORDER | WS_VISIBLE, CRect(400, 100, 600, 200), this, WM_USER + 100); 
  3. propertyGrid->EnableHeaderCtrl(TRUE);  //使用表头 
  4. propertyGrid->SetVSDotNetLook();  //使用样式 
  5. propertyGrid->MarkModifiedProperties(); //着重显示更改过的部分 

更多属性留待各位发掘一下啦。



CMFCPropertyGridCtrl的属性改变事件代码

  (2012-02-14 09:34:27)
标签: 

杂谈

 
//用于区分Prop, 使用SetData, GetData方法
CMFCPropertyGridProperty* pProp1 = new CMFCPropertyGridProperty(strTitle, (_variant_t)bVal, strDesc);
pProp1->SetData(100);
int nPropId = pProp1->GetData();


//声明消息处理函数

afx_msg LRESULT OnPropertyChanged( WPARAM wParam,LPARAM lParam );

 

//注册消息, AFX_WM_PROPERTY_CHANGED:发送ctrl消息到父窗口

BEGIN_MESSAGE_MAP(CMyWnd, CWnd)
 ON_WM_PAINT()
 ON_WM_CREATE()
 ON_REGISTERED_MESSAGE(AFX_WM_PROPERTY_CHANGED, OnPropertyChanged)
END_MESSAGE_MAP()

 

//消息处理, lParam是Property属性项, wParam是ctrl的id

LRESULT CMyWnd::OnPropertyChanged( WPARAM wParam,LPARAM lParam )
{
 CMFCPropertyGridProperty* pProp = (CMFCPropertyGridProperty*) lParam;

 //is the property ctrl
 if ( (long)wParam == 2 )
 {
  
 }

 pProp->SetValue((_variant_t)false);
 pProp->Redraw();
 int pID = pProp->GetData();
 CString str = pProp->GetName();
 if ( str == _T("abc") )
 {
  COleVariant var = pProp->GetValue();
  if ( var.boolVal == VARIANT_TRUE )
  {
  // AfxMessageBox(L"failed!");
   
   //pProp->SetValue(VARIANT_FALSE);
  }
 }

 if  (pID == 1)
 {
  
 }

 if  (pID > 1)
 {
  
 }
 return 0;
}



CHeaderCtrl 程序员百科

CHeaderCtrl

CObject
 └CCmdTarget
    └CWnd
       └CHeaderCtrl

“标头控件”是一个窗口,通常在文本或数据顶部。它包含列名字,可以被拆分。用户可以拖动分隔线来分开各个部分,以设置各列的宽度。
CHeaderCtrl提供了Windows基本标头控件功能。此控件(以及CHeaderCtrl类)仅对运行于Windows 95,Windows NT 3.51版及以上的程序有效。
对IE 4.0的附加控件添加的功能包括:
·标头项目的定制排序。
·标头项目的拖放,直接重新设置标头项目。创建CHeaderCtrl对象时采用HDS_DRAGDROP风格。
·在列大小改变时一直保持标头项目文本可视。创建CHeaderCtrl对象时采用HDS_DRAGDROP风格。
·标头热追踪。当指针停留在标头项目之上时,标头项目高亮度显示。创建CHeaderCtrl对象时采用HDS_DRAGDROP风格。
·支持图象列表。标头项目可以包含存放在CImageList对象中的图象。
要了解有关使用CHeaderCtrl的更多信息,可参阅联机文档的“VisualC++程序员指南”中的“控件主题”和“使用CHeaderCtrl”。
#include <afxcmn.h>


CHeaderCtrl类的成员

构造函数
CHeaderCtrl构造一个CHeaderCtrl对象
Create创建一个标头控件并把它附加给CHeaderCtrl对象

属性
GetItemCount获取一个标头控件下的项目总数
GetItem获取一个标头控件中项目的更多信息
SetItem设置一个标头控件中指定项目的属性
GetImageList获取在标头控件中画标头项目的图象列表的句柄
SetImageList将一个图象列表在标头控件中排列
GetItemRect获取一个标头控件中给定控件的有界矩形
GetOrderArray获取一个标头控件中自左至右的顺序排列的项目
SetOrderArray在一个标头控件中设置自左至右的项目顺序
OrderToIndex获得一个标头控件中依项目顺序排列的项目的索引值

操作
InsertItem在一个标头控件中添加一个项目
DeleteItem从一个标头控件中删除一个项目
Layout在一个给定矩形中获取一个标头控件的大小和位置
CreateDragImage创建一个项目的图象的透明形式
SetHotDivider改变在标头项目之间的分隔线来显示一个标头项目的人工拖放

可覆盖的函数
DrawItem绘制一个标头控件中的指定项目

CHeaderCtrl::CHeaderCtrl

CHeaderCtrl( );

说明:构造一个CHeaderCtrl对象。

CHeaderCtrl::Create

BOOL Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID);

返回值:
如果初始化成功,则返回非零值,否则为0。

参数:
dwStyle指定标头控件的风格,使用控件需要的任意标头控件风格的结合。
rec指定标头控件的大小与位置,或者是一个CRect对象或者是一个RECT结构。
pParentWnd指定标头控件的父窗口,通常是一个CDialog,不能为NULL。
nID指定标头控件的ID。

说明:
分两步建立一个CHeaderCtrl对象。首先调用构造函数,然后调用Create来创建标头控件并把它附加给CHeaderCtrl对象。
以下风格可被用于标头控件(见联机文档“平台SDK”中的“关于标头控件风格”):
·HDS_HOTTRACK当指针停留在标头项目时,此项目高亮度显示。
·HDS_DRAGDROP标头控件可以被拖放,以实现重排序。
·HDS_FULLDRAG当用户改变列大小时,标头控件显示列内容。
·HDS_BUTTONS标头控件与按钮一样。
·HDS_HORZ标头控件水平。
·HDS_VERT标头控件垂直(此风格当前不采用)。
·HDS_HIDDEN标头控件在详细模式下不可见。
另外,可以使用以下常用控件风格来确定标头控件自己的大小和位置(见“平台SDK”中的“常用控件风格”)。
·CCS_BOTTOM使控件自身排列在父窗口用户区的底部并设置其宽度与父窗口的宽度一样。
·CCS_NODIVIDER禁止在控件顶部画一个二像素高亮度显示。
·CCS_NOHILITE禁止在控件顶部画一个一像素高亮度显示。
·CCS_NOMOVEY使控件自己水平改变大小及移动而不垂直移动,响应WM_SIZE消息。如果使用CCS_NORESET风格,则此风格无效。标头控件缺省时具有此风格。
·CCS_NOPARENTALIGNCCS_TOP CCS_BOTTOM禁止对象在父窗口顶部或底部自动移动。尽管父窗口大小改变了,控件仍在父窗口中保持其位置。如果CCS_TOP或CCS_BOTTOM风格也被使用,则缺省调整高度,但位置与宽度不变。
·CCS_NORESIZE禁止控件在初始化或新大小设置时使用缺省宽度与高度,而是用创建或新设请求时指定的宽度和高度。
·CCS_TOP使控件定位于父窗口用户区的顶部并使其宽度与父窗口一样。
也可以对一个标头控件使用以下窗口风格(见“MFC库参考,第二部分”中的“Windows风格”):
·WS_CHILD构造一个子窗口,不可与WS_POPUP风格同时使用。
·WS_VISIBLE构造一个初始可见的窗口。
·WS_DISABLED构造一个初始不可见的窗口。
·WS_GROUP指定一组控件中的第一个可以用箭头从一个控件移到另一个控件的控件。从第一个开始,所有的用WS_GROUP风格定义均属于同一组。下一个用WS_GROUP风格结束的控件结束了此组并开始一个新组(即:下一个开始时,上一个便结束)。
·WS_TABSTOP指定了控件的任意一个,通过它用户可以用TAB键移动。TAB键使用户访问由WS_TABSTOP风格指定的另一个控件。


CHeaderCtrl::CreateDragImage

CImageList* GreateDragImage(int nIndex);

返回值:
如果成功,则返回一个指向CImageList对象的指针,否则为NULL。返回的列表仅包含一个图象。

参数:
nIndex标头控件内项目的基于0的索引。分配给此项目的图象是透明图象的基础。

说明:
此成员函数执行Win32的消息HDM_CREATEDRAGIMAGE的动作,可参阅联机文档“平台SDK”中的叙述。它提供了对项目拖放的支持。
返回的指向的CImageList对象指针是一个临时对象,当下一个空闲时间运行时即被删除。


CHeaderCtrl::DeleteItem

BOOL DeleteItem(int nPos);

返回值:如果成功,则返回非零值,否则为0。

参数:
nPos要删除的项目的基于0的索引。

说明:从一个标头控件中删去一个项目。

CHeaderCtrl::DrawItem

void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);

参数:
lpDraWItemStruct指向描述着色项目DRAWITEMSTRUCT结构的指针。

说明:
当拥有者绘制的标头控件的可视背景改变时,由框架调用。ItemAction成员的DRAWITEMSTRUCT结构定义了将要进行的绘画动作。
缺省时,此成员函数不做任何事情。覆盖此函数,可绘制拥有者的CHeaderCtrl对象。在此成员函数终止之前,应用应存储所有由lpDrawItemStruct提供的、用于显示上下文的图形设备接口对象。

CHeaderCtrl::GetImageList

CImageList* GetImageList( ) const;

返回值:一个指向CImageList对象的指针。

说明:
此成员函数实现Win32消息HDM_GETIMAGELIST的功能,可参阅联机文档“平台SDK”。
指向CImageList对象的返回指针是一个临时对象指针,当下一个空闲时间运行时被删除。

CHeaderCtrl::GetItem

BOOL GetItem(int nPos, HDITEM* pHeaderItem) const;

返回值:如果成功,则返回非零值;否则为0。

参数:
nPos指定要获取的项目的基于0的索引。
pHeaderItem指向接收新项目的HDITEM结构的指针,此结构与InsertItem和SetItem成员函数一起使用。
mask元素中的标志设置保证对应元素中的值被返回值正确填充。如果mask元素被设置为0,则其它结构元素无意义。

说明:获取关于标头控件项目的信息。


CHeaderCtrl::GetItemCount

int GetItemCount( ) const;

返回值:
如果成功,则返回标头控件项目的个数,否则为-1。

说明:获取标头控件中的项目的个数。


CHeaderCtrl::GetItemRect

BOOL GetItemRect(int nIndex, LPRECT lpRect) const;

返回值:如果成功,则返回非零值,否则为0。

参数:
nIndex标头控件项目基于0的索引。
lpRect指向RECT项目地址的指针,以接收有界矩形的更多信息。

说明:

此函数实现Win32消息HDM_GETITEMRECT的功能,可参阅联机文档“平台SDK”。 

CHeaderCtrl::GetOrderArray

BOOL GetOrderArray(LPINT piArray, int iCount = -1);

返回值:如果成功,则返回非零值,否则为0。

参数:
piArray指向缓冲区地址的指针,以接收标头控件项目值的索引,按它们从左到右的显示顺序。
iCount标头控件的项目数。

说明:
此成员函数实现Win32消息HDM_GETORDERARRAY的功能,可参阅联机文档“平台SDK”。它提供对标头项目排序的支持。
如果使用iCount的缺省值,则GetOrderArray使用GetItemCount填充参数。


CHeaderCtrl::InsertItem

int InserItem(int nPos, HDITEM* phdi);

返回值:如果成功,则返回新项目索引,否则为-1。

参数:
nPos插入项目的基于0的索引。如果为0,则此项目插入标头控件的开始处;如果此值大于最大值,则此项目插入标头控件末尾。
phdi指向一个包括被插入项目信息的HDITEM结构的指针。

说明:插入一个指定的索引的项目到标头控件。

CHeaderCtrl::Layout

BOOL Layout(HDLAYOUT* pHeaderLayout);

返回值:如果成功,则返回非零值,否则为0。

参数:
pHeaderLayout指向一个HDLAYOUT结构的指针,包含标头控件的大小和位置信息。

说明:
获取在一个指定矩形内的标头控件的大小和位置。此函数用于指定占用给定矩形的新标头控件的属性情况。 

CHeaderCtrl::OrderToIndex

int OrderToIndex(int nOrder) const;

返回值:
项目索引,基于标头控件中项目的顺序。索引自左到右由0开始。

参数:
nOrder项目在标头控件从左到右显示时的基于0的顺序值。

说明:
此成员函数实现Win32的宏HDM_ORDERTOINDEX的功能,可参阅联机文档“平台SDK”。
它提供对标头排序的支持。

CHeaderCtrl::SetHotDivider

int SetHotDivider(CPoint pt);
int SetHotDivider(int nIndex);

返回值:高亮度分隔符的索引。

参数:
pt指针位置。标头控件按指针位置,高亮度显示分隔符索引。
nIndex高亮度分隔符的索引。

说明:
此成员函数实现Win32消息HDM_SETHOTDIVIDER的功能,可参阅联机文档“平台SDK”。它提供对标头项目的拖放。

CHeaderCtrl::SetImageList

CImageList* SetImageList(CImageList* pImageList);

返回值:
以前分配给标头控件的CImageList对象的指针。

参数:
pImageList指向CImageList对象,此对象包含将被分配给标头控件的图象列表。

说明:
此成员函数实现Win32消息HDM_SETIMAGELIST的功能,可参阅联机文档“平台SDK”。返回指针指向的CImageList对象是一个临时对象,在下一空闲时间运行时被删除。

CHeaderCtrl::SetItem

BOOL SetItem(int nPos,HDITEM* pHeaderItem);

返回值:如果成功,则返回非零,否则为0。

参数:
nPos被操纵的项目的基于0的索引。
pHeaderItem指向HDITEM结构的指针,此结构包含新项目的信息。

说明:设置标头控件中项目的属性。

CHeaderCtrl::SetOrderArray

BOOL SetOrderArray(int iCount,LPINT piArray);

返回值:如果成功,则返回非零值,否则为0。

参数:
iCount标头控件的项目数。
piArray指向缓冲区地址的指针,按其由左到右的显示顺序,接收标头控件中项目的索引值。

说明:
此成员函数实现Win32的宏HDM_SETORDERARRAY的功能,可参阅联机文档“平台SDK”。它提供对标头项目排序的支持。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值