QQ登录

只需一步,快速开始

上位机MFC实现单文档多CFormView视窗选择源代码

[ 复制链接 ]
我们建立基于CFormView视窗程序时,基于CFORMVIEW类类型对话框功能,
可以很方便的对控件进行版本,同时又带有视窗框架功能,所以对于编写工控界面会是一个很好的选择。
默认创建一个基于CFormView单文档程序时,界面仅能显示默认的一个CFormView界面。
当前这个例程实现多个CFormView窗口任意切换显示的功能。
这样在每个CFormView对话框资源上就可以很方便的添加控件与排版控件。
例程界面如下:
2019-12-27_200515.jpg
左侧树状控件上可以任意点击视窗的名称来选择在显示哪个CFormView视窗。
在右侧就会显示出不同CFormView视窗内容。
当然可以利用例程思路与源代码实现自己想要的其他功能,比如实现类似VC的控件属性窗口,
在指定的一个停靠窗口内显示不同的属性窗口,每个窗口表示不同元件的属性。
例程源代码在后边提供下载。
下面来看下具体的实现过程 。
首先使用VC2010创建一个基于单文档的视窗为CFormView的工程,
外观样式选择如下:
2019-12-27_202552.jpg
这样创建的工程会自带类名为CFileView的停靠窗口,在此窗口上我们添加CFileView类名供选择切换。
选在此类头文件中,类定义前面添加一结构体及此结构体的数组,用于组织与管理不同视窗。
  1. struct CDemoFeature
  2. {
  3.         enum Feature
  4.         {
  5.                 BCGP_Unknown = -1,
  6.                 BCGP_ChartElements,
  7.                 BCGP_ChartLegend,
  8.                 BCGP_ChartAdvancedLegend,
  9.                 BCGP_ChartDataTable,

  10.         };
  11.         CDemoFeature()
  12.         {
  13.                 m_nGroup = -1;
  14.                 m_id = 0;
  15.                 m_Feature = BCGP_Unknown;
  16.                 m_RTI = NULL;
  17.                 m_hItem = NULL;
  18.         }

  19.         CDemoFeature(int nGroup, Feature feature, LPCTSTR lpszName, CRuntimeClass* pRTI)
  20.         {
  21.                 m_nGroup = nGroup;
  22.                 m_id = 0;
  23.                 m_Feature = feature;
  24.                 m_strName = lpszName;
  25.                 m_RTI = pRTI;
  26.                 m_hItem = NULL;
  27.         }

  28.         int                                m_nGroup;
  29.         int                                m_id;
  30.         Feature                        m_Feature;
  31.         CString                        m_strName;
  32.         CRuntimeClass*        m_RTI;
  33.         HTREEITEM                m_hItem;
  34. };
  35. /////////////////////////////////////////////////////////////////////////////
  36. // CWorkspaceBar message handlers

  37. static CDemoFeature features[] =
  38. {
  39.         CDemoFeature(0, CDemoFeature::BCGP_ChartElements, _T("Chart Elements"), RUNTIME_CLASS(CChartElementsView)),
  40.         CDemoFeature(0, CDemoFeature::BCGP_ChartLegend, _T("Chart Legend"), RUNTIME_CLASS(CChartLegendView)),
  41.         CDemoFeature(0, CDemoFeature::BCGP_ChartAdvancedLegend, _T("Chart Advanced Legend"), RUNTIME_CLASS(CChartAdvancedLegendView)),
  42.         CDemoFeature(0, CDemoFeature::BCGP_ChartDataTable, _T("Chart Data Table"), RUNTIME_CLASS(CChartDataTableView)),
  43.         CDemoFeature()
  44. };
复制代码
我们是想要显示多个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中添加成员变量与函数。
  1. class CFileView : public CDockablePane
  2. {
  3. public:
  4.         int                                        m_nLastSelectedItem;
  5.         BOOL                                m_bIsPrevAvailable;
  6.         BOOL                                m_bIsNextAvailable;
  7.         CMap<int, int, CDemoFeature*, CDemoFeature*>        m_mapItems;
  8.         int        GetFeatureCount() const{return (int)m_mapItems.GetCount();}
  9.         void AddFeatureGroup(LPCTSTR lpszName, int nGroupID);
  10.         BOOL SelectItem(int id);
  11.         void UpdatePrevNextState(HTREEITEM hTreeItem);
  12.         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;
同样对应的例程也添加了几个成员函数与变量。
  1. class CMainFrame : public CFrameWndEx
  2. {
  3. public:
  4.         void SelectView(int nID);
  5.         CView* GetView(int nID);
  6.         CArray<CView*, CView*>        m_arViews;
  7.         BOOL CreateViews(CCreateContext* pContext);
  8.         int                                                m_nCurrType;
  9. }
复制代码
在CMainFrame类的函数OnCreate调用CreateViews((CCreateContext*)lpCreateStruct->lpCreateParams);
实现全部视窗类的创建,函数SelectView实现不同视窗类的切换显示。

源代码下载地址:
游客,为过滤非法行为,全站隐藏资源仅对充值会员开放进入升级



回复

使用道具 举报

快速回复 返回列表 客服中心 搜索