作者:uai_128366833952 | 来源:互联网 | 2023-07-12 11:02
开发环境:Win7+vs2010我们可以通过使用vs2010内置的向导生成类似于是vs2010属性栏样式的窗口,具体步骤如下。模板生成在vs2010的新建项目向导的应用程序类型中选
开发环境:Win7+vs2010
我们可以通过使用vs2010内置的向导生成类似于是vs2010属性栏样式的窗口,具体步骤如下。
模板生成
在vs2010的新建项目向导的应用程序类型中选择:Visual Sutdio或Office
在向导的高级功能中,选择属性停靠窗口,在界面中可看到还有其他类似的窗口,这里不一一说明。
向导设置完成后,运行程序,我们可以看到界面的右边停靠着属性栏。
代码简要分析
在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);
重新显示。