我们建立基于CFormView视窗程序时,基于CFORMVIEW类类型对话框功能,
可以很方便的对控件进行版本,同时又带有视窗框架功能,所以对于编写工控界面会是一个很好的选择。
默认创建一个基于CFormView单文档程序时,界面仅能显示默认的一个CFormView界面。
当前这个例程实现多个CFormView窗口任意切换显示的功能。
这样在每个CFormView对话框资源上就可以很方便的添加控件与排版控件。
例程界面如下:
左侧树状控件上可以任意点击视窗的名称来选择在显示哪个CFormView视窗。
在右侧就会显示出不同CFormView视窗内容。
当然可以利用例程思路与源代码实现自己想要的其他功能,比如实现类似VC的控件属性窗口,
在指定的一个停靠窗口内显示不同的属性窗口,每个窗口表示不同元件的属性。
例程源代码在后边提供下载。
下面来看下具体的实现过程 。
首先使用VC2010创建一个基于单文档的视窗为CFormView的工程,
外观样式选择如下:
这样创建的工程会自带类名为CFileView的停靠窗口,在此窗口上我们添加CFileView类名供选择切换。
选在此类头文件中,类定义前面添加一结构体及此结构体的数组,用于组织与管理不同视窗。
- struct CDemoFeature
- {
- enum Feature
- {
- BCGP_Unknown = -1,
- BCGP_ChartElements,
- BCGP_ChartLegend,
- BCGP_ChartAdvancedLegend,
- BCGP_ChartDataTable,
- };
- CDemoFeature()
- {
- m_nGroup = -1;
- m_id = 0;
- m_Feature = BCGP_Unknown;
- m_RTI = NULL;
- m_hItem = NULL;
- }
- CDemoFeature(int nGroup, Feature feature, LPCTSTR lpszName, CRuntimeClass* pRTI)
- {
- m_nGroup = nGroup;
- m_id = 0;
- m_Feature = feature;
- m_strName = lpszName;
- m_RTI = pRTI;
- m_hItem = NULL;
- }
- int m_nGroup;
- int m_id;
- Feature m_Feature;
- CString m_strName;
- CRuntimeClass* m_RTI;
- HTREEITEM m_hItem;
- };
- /////////////////////////////////////////////////////////////////////////////
- // CWorkspaceBar message handlers
- static CDemoFeature features[] =
- {
- CDemoFeature(0, CDemoFeature::BCGP_ChartElements, _T("Chart Elements"), RUNTIME_CLASS(CChartElementsView)),
- CDemoFeature(0, CDemoFeature::BCGP_ChartLegend, _T("Chart Legend"), RUNTIME_CLASS(CChartLegendView)),
- CDemoFeature(0, CDemoFeature::BCGP_ChartAdvancedLegend, _T("Chart Advanced Legend"), RUNTIME_CLASS(CChartAdvancedLegendView)),
- CDemoFeature(0, CDemoFeature::BCGP_ChartDataTable, _T("Chart Data Table"), RUNTIME_CLASS(CChartDataTableView)),
- CDemoFeature()
- };
复制代码 我们是想要显示多个CFormView视窗,所以要管理多少个视窗就创建多少个。
例程创建是默认视窗资源为IDD_MY111_FORM,例程复制了四个对话框资源,
IDD_CHART_ADVANCED_LEGEND,IDD_CHART_DATA_TABLE,IDD_CHART_ELEMENTS,IDD_CHART_LEGEND。
并关联了对应的四个CFormView,这四个类的头文件得在CFileView头文件上包含,以便后面使用四个类名。
#include "ChartAdvancedLegendView.h"
#include "ChartDataTableView.h"
#include "ChartElementsView.h"
#include "ChartLegendView.h"
然后是在此类CFileView中添加成员变量与函数。
- class CFileView : public CDockablePane
- {
- public:
- int m_nLastSelectedItem;
- BOOL m_bIsPrevAvailable;
- BOOL m_bIsNextAvailable;
- CMap<int, int, CDemoFeature*, CDemoFeature*> m_mapItems;
- int GetFeatureCount() const{return (int)m_mapItems.GetCount();}
- void AddFeatureGroup(LPCTSTR lpszName, int nGroupID);
- BOOL SelectItem(int id);
- void UpdatePrevNextState(HTREEITEM hTreeItem);
- CRuntimeClass* GetFeatureViewRTI(int id) const;
复制代码
类中默认带一树状控件,创建时,控件ID使用的是常量4,m_wndFileView.Create(dwViewStyle, rectDummy, this, 4)
因为要响应树状控件单项选消息,所以我们自己定义了函数OnSelectTree,
并进行了关联,ON_NOTIFY(TVN_SELCHANGED, 4, OnSelectTree)
在此类CFileView的函数OnCreate中,调用函数添加了一组视窗名:
AddFeatureGroup(_T("Overview"), 0);
SelectItem(1);
这样CFileView类就准备好了,具体的代码可以下载例程编程查看。
最后是在框架类CMainFrame中实现全部视窗类的创建与选择显示。
定义CFileView的变量为CFileView m_wndFileView;
同样对应的例程也添加了几个成员函数与变量。
- class CMainFrame : public CFrameWndEx
- {
- public:
- void SelectView(int nID);
- CView* GetView(int nID);
- CArray<CView*, CView*> m_arViews;
- BOOL CreateViews(CCreateContext* pContext);
- int m_nCurrType;
- }
复制代码 在CMainFrame类的函数OnCreate调用CreateViews((CCreateContext*)lpCreateStruct->lpCreateParams);
实现全部视窗类的创建,函数SelectView实现不同视窗类的切换显示。
源代码下载地址:
|