属性窗口开发--CMFCPropertyGridCtrl的使用

开发环境:Win7+vs2010
我们可以通过使用vs2010内置的向导生成类似于是vs2010属性栏样式的窗口,具体步骤如下。

模板生成

  1. 在vs2010的新建项目向导的应用程序类型中选择:Visual Sutdio或Office
    这里写图片描述

  2. 在向导的高级功能中,选择属性停靠窗口,在界面中可看到还有其他类似的窗口,这里不一一说明。
    这里写图片描述

  3. 向导设置完成后,运行程序,我们可以看到界面的右边停靠着属性栏。
    这里写图片描述

  4. 代码简要分析
    在MainFrm.h中

CPropertiesWnd    m_wndProperties

在MainFrm.cpp中的OnCreate函数中

    if (!CreateDockingWindows())
    {
        TRACE0("未能创建停靠窗口\n");
        return -1;
    }

    m_wndProperties.EnableDocking(CBRS_ALIGN_ANY);
    DockPane(&m_wndProperties);

以及用于创建属性窗口的函数CreateDockingWindows()和设置相关图标的函数SetDockingWindowIcons()

另外在项目文件还可以找到PropertiesWnd.h和PropertiesWnd.cpp的文件,其中包含继承与CMFCToolBar的属性工具条类CPropertiesToolBar,继承与CDockablePane的CPropertiesWnd。

简单的自定义属性项目

对于以上通过vs2010新建项目向导生成模块,我们如何来自定义的修改属性窗口中项目呢?
首先,我们来看一下PropertiesWnd.cpp文件的中的函数InitPropList()的代码,

void CPropertiesWnd::InitPropList()
{
    SetPropListFont();

    m_wndPropList.EnableHeaderCtrl(FALSE);
    m_wndPropList.EnableDescriptionArea();
    m_wndPropList.SetVSDotNetLook();
    m_wndPropList.MarkModifiedProperties();
//----------
    CMFCPropertyGridProperty* pGroup1 = new CMFCPropertyGridProperty(_T("外观"));

    pGroup1->AddSubItem(new CMFCPropertyGridProperty(_T("三维外观"), (_variant_t) false, _T("指定窗口的字体不使用粗体,并且控件将使用三维边框")));

    CMFCPropertyGridProperty* pProp = new CMFCPropertyGridProperty(_T("边框"), _T("对话框外框"), _T("其中之一:“无”、“细”、“可调整大小”或“对话框外框”"));
    pProp->AddOption(_T("无"));
    pProp->AddOption(_T("细"));
    pProp->AddOption(_T("可调整大小"));
    pProp->AddOption(_T("对话框外框"));
    pProp->AllowEdit(FALSE);

    pGroup1->AddSubItem(pProp);
    pGroup1->AddSubItem(new CMFCPropertyGridProperty(_T("标题"), (_variant_t) _T("关于"), _T("指定窗口标题栏中显示的文本")));

    m_wndPropList.AddProperty(pGroup1);
//----------
    CMFCPropertyGridProperty* pSize = new CMFCPropertyGridProperty(_T("窗口大小"), 0, TRUE);

    pProp = new CMFCPropertyGridProperty(_T("高度"), (_variant_t) 250l, _T("指定窗口的高度"));
    pProp->EnableSpinControl(TRUE, 50, 300);
    pSize->AddSubItem(pProp);

    pProp = new CMFCPropertyGridProperty( _T("宽度"), (_variant_t) 150l, _T("指定窗口的宽度"));
    pProp->EnableSpinControl(TRUE, 50, 200);
    pSize->AddSubItem(pProp);

    m_wndPropList.AddProperty(pSize);

    CMFCPropertyGridProperty* pGroup2 = new CMFCPropertyGridProperty(_T("字体"));

    LOGFONT lf;
    CFont* font = CFont::FromHandle((HFONT) GetStockObject(DEFAULT_GUI_FONT));
    font->GetLogFont(&lf);

    lstrcpy(lf.lfFaceName, _T("宋体, Arial"));

    pGroup2->AddSubItem(new CMFCPropertyGridFontProperty(_T("字体"), lf, CF_EFFECTS | CF_SCREENFONTS, _T("指定窗口的默认字体")));
    pGroup2->AddSubItem(new CMFCPropertyGridProperty(_T("使用系统字体"), (_variant_t) true, _T("指定窗口使用“MS Shell Dlg”字体")));

    m_wndPropList.AddProperty(pGroup2);
//----------
    CMFCPropertyGridProperty* pGroup3 = new CMFCPropertyGridProperty(_T("杂项"));
    pProp = new CMFCPropertyGridProperty(_T("(名称)"), _T("应用程序"));
    pProp->Enable(FALSE);
    pGroup3->AddSubItem(pProp);

    CMFCPropertyGridColorProperty* pColorProp = new CMFCPropertyGridColorProperty(_T("窗口颜色"), RGB(210, 192, 254), NULL, _T("指定默认的窗口颜色"));
    pColorProp->EnableOtherButton(_T("其他..."));
    pColorProp->EnableAutomaticButton(_T("默认"), ::GetSysColor(COLOR_3DFACE));
    pGroup3->AddSubItem(pColorProp);

    static const TCHAR szFilter[] = _T("图标文件(*.ico)|*.ico|所有文件(*.*)|*.*||");
    pGroup3->AddSubItem(new CMFCPropertyGridFileProperty(_T("图标"), TRUE, _T(""), _T("ico"), 0, szFilter, _T("指定窗口图标")));

    pGroup3->AddSubItem(new CMFCPropertyGridFileProperty(_T("文件夹"), _T("c:\\")));

    m_wndPropList.AddProperty(pGroup3);
//----------
    CMFCPropertyGridProperty* pGroup4 = new CMFCPropertyGridProperty(_T("层次结构"));

    CMFCPropertyGridProperty* pGroup41 = new CMFCPropertyGridProperty(_T("第一个子级"));
    pGroup4->AddSubItem(pGroup41);

    CMFCPropertyGridProperty* pGroup411 = new CMFCPropertyGridProperty(_T("第二个子级"));
    pGroup41->AddSubItem(pGroup411);

    pGroup411->AddSubItem(new CMFCPropertyGridProperty(_T("项 1"), (_variant_t) _T("值 1"), _T("此为说明")));
    pGroup411->AddSubItem(new CMFCPropertyGridProperty(_T("项 2"), (_variant_t) _T("值 2"), _T("此为说明")));
    pGroup411->AddSubItem(new CMFCPropertyGridProperty(_T("项 3"), (_variant_t) _T("值 3"), _T("此为说明")));

    pGroup4->Expand(FALSE);
    m_wndPropList.AddProperty(pGroup4);
}

可以看出本段代码就是在设置属性窗口中的项目,根据项目要求修改该段代码就可以自定义生成要求的属性窗口了。

动态修改

窗口项目数据的动态访问及修改,已在CMainFrame类中为例
首先为了方便调用,修改PropertiesWnd.h中m_wndPropList属性设置为Public

public:
    CMFCPropertyGridCtrl m_wndPropList;

在MainFrame.cpp中添加测试代码:

    CMFCPropertyGridProperty * pProp;
    pProp=m_wndProperties.m_wndPropList.GetProperty(0)->GetSubItem(2);
//读取数据
    CString itemname;
    itemname=pProp->GetName(); //获取名称
    COleVariant itemvalue;
    itemvalue=pProp->GetValue();//获取值
//写入数据
    pProp->SetValue((_variant_t)_T("This is a test!"));

运行实例,我们可以发现属性栏中外观标题已经设置成This is a test!
这里写图片描述

同样可以获取和修改其他项目的值。
注意:在调用SetValue函数时,参数的数据类型必须与之前创建时的数据类型一致,否则报错,及如果指定定义为double型,这里传入一个int,则会报错。

消息响应

下面我们来配置属性栏中消息的响应。

首先在PropertiesWnd.h声明消息响应函数

afx_msg LRESULT OnPropertyChanged(WPARAM wParam, LPARAM lParam);

在PropertiesWnd.cpp中定义消息响应函数

LRESULT CPropertiesWnd::OnPropertyChanged( WPARAM wParam, LPARAM lParam )
{
    CMFCPropertyGridProperty* pProp = (CMFCPropertyGridProperty*) lParam;
    CString sname = pProp->GetName();  //被改变的参数名
    COleVariant t = pProp->GetValue(); //改变之后的值
    t = pProp->GetOriginalValue();  //改变之前的值
    return 0;
}

并在message map中添加

BEGIN_MESSAGE_MAP(CPropertiesWnd, CDockablePane)
    ON_REGISTERED_MESSAGE(AFX_WM_PROPERTY_CHANGED, OnPropertyChanged)
END_MESSAGE_MAP()

小结

本文简单的介绍了属性窗口栏的简易开发过程,有兴趣的可以仔细研究vs2010向导自动生成的代码,进行动态创建,以及开发更多的属性设置项。

注:如果把属性窗口栏关闭之后,可通过

m_wndProperties.ShowPane(TRUE, FALSE, TRUE);

重新显示。

  • 5
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值