visual studiomfc框架结构设计_第1页
visual studiomfc框架结构设计_第2页
visual studiomfc框架结构设计_第3页
visual studiomfc框架结构设计_第4页
visual studiomfc框架结构设计_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Visual Studio 2021 MFC框架结构设计图解建立一个类似于fisualStudio2021的界面,总体步骤如下:第一步是建立一个标准的MFC工程这对我们学习有利第二步是添加必要的资源,当然也可以边做边参加。第三步是从CDockablePane派生一个视图类用于停靠在框架窗口的左边。为这个类要创立一个CViewTree类,它主要是在派生出来的类中参加树控件。第四步就是设计这个派生的类,为其添加工具栏,弹出菜单等第五步就是将这个派生类加到框架中去。下面我们开始制作:一、 新建标准的MFC工程点新建工程选择Visual C+的MFC选择MFC应用程序输入MyTest工程名位置就自己定

2、吧。这里解决方案名称会与名称同步,你可以修改“解决方案名称M,它其实就是工程的总目录名点击确定。下一步这里我们使用的是“多信文档à选项卡式档,工程类型选择MFC校准点击完成。二、 设计左侧停靠窗口CDockablePane在类视图中点击右键,在弹出菜单中选择“类向导点击“添加类类名中添加“CPersonView基类选择“CDockablePane点击完成,回到类向导中,我们看到类名已经是我们刚刚建立的类。点击确定。这样我们就建立了一个由CDockablePane派生的子类“CPersonView。接下类我们再从CTreeCtrl类派生一个CViewTree子类,它是有要CPerson

3、View中生成树形结构。作为系统功能菜单使用。步骤与建立CPersonView上面相同。接下来是为CPersonView停靠窗口上方添一个独特的工具栏,为此我们要生成一类,这个类不必用向导生成,只需要在CPersonView类头文件中添加如下代码就可以了,因这个类不作为其公用类比拟小。CPersonView.h文件#pragma once#include "viewtree.h"class CPersonViewToolBar : public CMFCToolBarvirtual void OnUpdateCmdUI(CFrameWnd* /*pTarget*/, BOO

4、L bDisableIfNoHndler)/此成员函数由框架类调用,以便更新状态工具栏或状态栏,pTarget指向应用程序的主窗口,这个指针用于路由更新消息,bDisablefNoHndler是个标志,指示控件没有更新处理程序应该自动显示为禁用。CMFCToolBar:OnUpdateCmdUI(CFrameWnd*) GetOwner(), bDisableIfNoHndler);virtual BOOL AllowShowOnList() const return FALSE; ;CMFCToolBar是选件类类似于 CToolBar Class,但是,提供用户界面功能附加支持。

5、 其中包括简单的工具栏、工具栏有快捷图像的,大图标、寻呼机按钮、锁定的工具栏、rebar控件、文本在图像下,背景图像和选项卡式工具栏。 CMFCToolBar 选件类还包含内置为工具栏的用户可自定义的支持,并菜单、拖放到工具栏和菜单之间,组合框按钮,编辑框按钮、颜色选取器和汇总按钮。下面是将CViewTree附加到CPersonView中。方法是:在类视图中右键选择CPersonView类访问选择“protected变量类型选择输入“CViewTree变量名输入“m_wndViewTree点击完成。这样就在CPersonView类的头文件中定议一个名为m_wndV

6、iewTree的变量。代码如下:protected:DECLARE_MESSAGE_MAP()CViewTree m_wndViewTree;同样方法为CPersonView添加如下两个变量:CImageList m_PersonViewImages;CPersonViewToolBar m_wndToolBar;接下来我们要为CPersonView添加一个弹出式菜单方法是:选择资源视图或者在解决方案视图中找到资源文件MyTest.rc双击进入资源视图右击“Menu 选择添加资源点击新建方法不再赘述,其ID改为IDR_POPUP_EXPLORER,保存。添加位图资源与菜单相同其ID改为IDB_

7、PERSON_VIEW添加工具栏其ID改为IDR_EXPLORER同法添加IDB_EXPLORER_24及IDB_FILE_VIEW为CPerosnView添加自定义方法OnChangeVisualStyle()和AdjustLayout,方法是,进入类向导选择“方法点击添加方法返回类型为void,参数类型不添加,访问选择public 点确定。再添加一个用于对树添加节点的私有方法:FillFileView方法。下面是三个方法的代码void CPersonView:OnChangeVisualStyle(void)m_wndToolBar.CleanUpLockedImages();m_wndT

8、oolBar.LoadBitmap(theApp.m_bHiColorIcons ? IDB_EXPLORER_24 : IDR_EXPLORER, 0, 0, TRUE /* 锁?定¡§*/);m_PersonViewImages.DeleteImageList();UINT uiBmpId = theApp.m_bHiColorIcons ? IDB_PERSON_VIEW_24 : IDB_PERSON_VIEW;CBitmap bmp;if (!bmp.LoadBitmap(uiBmpId)TRACE(_T("无T法¤¡§加&

9、#168;®载?位?图ª?: %xn"), uiBmpId);ASSERT(FALSE);return;BITMAP bmpObj;bmp.GetBitmap(&bmpObj);UINT nFlags = ILC_MASK;nFlags |= (theApp.m_bHiColorIcons) ? ILC_COLOR24 : ILC_COLOR4;m_PersonViewImages.Create(16, bmpObj.bmHeight, nFlags, 0, 0);m_PersonViewImages.Add(&bmp, RGB(255, 0, 2

10、55);m_wndViewTree.SetImageList(&m_PersonViewImages, TVSIL_NORMAL);void CPersonView:AdjustLayout(void)if (GetSafeHwnd() = NULL)return;CRect rectClient;GetClientRect(rectClient);int cyTlb = m_wndToolBar.CalcFixedLayout(FALSE, TRUE).cy;m_wndToolBar.SetWindowPos(NULL, rectClient.left, rectClient.top

11、, rectClient.Width(), cyTlb, SWP_NOACTIVATE | SWP_NOZORDER);m_wndViewTree.SetWindowPos(NULL, rectClient.left + 1, rectClient.top + cyTlb + 1, rectClient.Width() - 2, rectClient.Height() - cyTlb - 2, SWP_NOACTIVATE | SWP_NOZORDER);void CPersonView:FillFileView(void)HTREEITEM hRoot = m_wndViewTree.Ins

12、ertItem(_T("FakeApp 文?件t"), 0, 0);m_wndViewTree.SetItemState(hRoot, TVIS_BOLD, TVIS_BOLD);HTREEITEM hSrc = m_wndViewTree.InsertItem(_T("FakeApp 源¡ä文?件t"), 0, 0, hRoot);m_wndViewTree.InsertItem(_T("FakeApp.cpp"), 1, 1, hSrc);m_wndViewTree.InsertItem(_T("Fa

13、keApp.rc"), 1, 1, hSrc);m_wndViewTree.InsertItem(_T("FakeAppDoc.cpp"), 1, 1, hSrc);m_wndViewTree.InsertItem(_T("FakeAppView.cpp"), 1, 1, hSrc);m_wndViewTree.InsertItem(_T("MainFrm.cpp"), 1, 1, hSrc);m_wndViewTree.InsertItem(_T("StdAfx.cpp"), 1, 1, hSrc);H

14、TREEITEM hInc = m_wndViewTree.InsertItem(_T("FakeApp 头ª¡¤文?件t"), 0, 0, hRoot);m_wndViewTree.InsertItem(_T("FakeApp.h"), 2, 2, hInc);m_wndViewTree.InsertItem(_T("FakeAppDoc.h"), 2, 2, hInc);m_wndViewTree.InsertItem(_T("FakeAppView.h"), 2, 2, hInc

15、);m_wndViewTree.InsertItem(_T("Resource.h"), 2, 2, hInc);m_wndViewTree.InsertItem(_T("MainFrm.h"), 2, 2, hInc);m_wndViewTree.InsertItem(_T("StdAfx.h"), 2, 2, hInc);HTREEITEM hRes = m_wndViewTree.InsertItem(_T("FakeApp 资Á¨º源¡ä文?件t"), 0,

16、 0, hRoot);m_wndViewTree.InsertItem(_T("FakeApp.ico"), 2, 2, hRes);m_wndViewTree.InsertItem(_T("FakeApp.rc2"), 2, 2, hRes);m_wndViewTree.InsertItem(_T("FakeAppDoc.ico"), 2, 2, hRes);m_wndViewTree.InsertItem(_T("FakeToolbar.bmp"), 2, 2, hRes);m_wndViewTree.Expa

17、nd(hRoot, TVE_EXPAND);m_wndViewTree.Expand(hSrc, TVE_EXPAND);m_wndViewTree.Expand(hInc, TVE_EXPAND);下面为CPersonView类添加消息响应函数右击CPersonView选择“类向导选择“消息分别添加双击WM_CONTEXTMENU鼠标右键消息WM_CREATE窗口创立消息WM_PAINT窗口刷新消息WM_SETFOCUS窗口得到焦点消息WM_SIZE窗口尺寸变化消息五个消息,代码如下void CPersonView:OnContextMenu(CWnd* pWnd, CPoint point

18、)/ TODO: 在¨²此ä?处ä|添¬¨ª加¨®消?息¡é处ä|理¤¨ª程¨¬序¨°代䨲码?CTreeCtrl* pWndTree = (CTreeCtrl*) &m_wndViewTree;ASSERT_VALID(pWndTree);if (pWnd != pWndTree)CDockablePane:OnContextMenu(pWnd, point);re

19、turn;if (point != CPoint(-1, -1)/ 选?择?已°?单Ì£¤击¡Â的Ì?项?:CPoint ptTree = point;pWndTree->ScreenToClient(&ptTree);UINT flags = 0;HTREEITEM hTreeItem = pWndTree->HitTest(ptTree, &flags);if (hTreeItem != NULL)pWndTree->SelectItem(hTreeItem);pWndTree->

20、SetFocus();theApp.GetContextMenuManager()->ShowPopupMenu(IDR_POPUP_EXPLORER, point.x, point.y, this, TRUE);int CPersonView:OnCreate(LPCREATESTRUCT lpCreateStruct)if (CDockablePane:OnCreate(lpCreateStruct) = -1)return -1;/ TODO: 在¨²此ä?添¬¨ª加¨®您¨²专&#

21、193;¡§用®?的Ì?创ä¡ä建¡§代䨲码?CRect rectDummy;rectDummy.SetRectEmpty();/ 创ä¡ä建¡§视º¨®图ª?:const DWORD dwViewStyle = WS_CHILD | WS_VISIBLE | TVS_HASLINES | TVS_LINESATROOT | TVS_HASBUTTONS;if (!m_wndView

22、Tree.Create(dwViewStyle, rectDummy, this, 4)TRACE0("未¡ä能¨¹创ä¡ä建¡§文?件t视º¨®图ª?n");return -1; / 未¡ä能¨¹创ä¡ä建¡§/ 加¨®载?视º¨®图ª?图ª?像?:m_PersonViewImages.

23、Create(IDB_PERSON_VIEW, 16, 0, RGB(255, 0, 255);m_wndViewTree.SetImageList(&m_PersonViewImages, TVSIL_NORMAL);m_wndToolBar.Create(this, AFX_DEFAULT_TOOLBAR_STYLE, IDR_EXPLORER);m_wndToolBar.LoadToolBar(IDR_EXPLORER, 0, 0, TRUE /* 已°?锁?定¡§*/);OnChangeVisualStyle();m_wndToolBar.SetP

24、aneStyle(m_wndToolBar.GetPaneStyle() | CBRS_TOOLTIPS | CBRS_FLYBY);m_wndToolBar.SetPaneStyle(m_wndToolBar.GetPaneStyle() & (CBRS_GRIPPER | CBRS_SIZE_DYNAMIC | CBRS_BORDER_TOP | CBRS_BORDER_BOTTOM | CBRS_BORDER_LEFT | CBRS_BORDER_RIGHT);m_wndToolBar.SetOwner(this);/ 所¨´有®D命¨&#

25、185;令¢?将?通ª¡§过y此ä?控?件t路¡¤由®¨¦,ê?而?不?是º?通ª¡§过y主¡Â框¨°架¨¹路¡¤由®¨¦:m_wndToolBar.SetRouteCommandsViaFrame(FALSE);/ 填入一些静态树视图数据此处只需填入虚拟代码,而不是复杂的数据)FillFileView();AdjustLayout();

26、return 0;void CPersonView:OnPaint()CPaintDC dc(this); / device context for painting/ TODO: 在¨²此ä?处ä|添¬¨ª加¨®消?息¡é处ä|理¤¨ª程¨¬序¨°代䨲码?/ 不?为a绘?图ª?消?息¡é调Ì¡Â用®?

27、CDockablePane:OnPaint()CRect rectTree;m_wndViewTree.GetWindowRect(rectTree);ScreenToClient(rectTree);rectTree.InflateRect(1, 1);dc.Draw3dRect(rectTree, :GetSysColor(COLOR_3DSHADOW), :GetSysColor(COLOR_3DSHADOW);void CPersonView:OnSetFocus(CWnd* pOldWnd)CDockablePane:OnSetFocus(pOldWnd);/ TODO: 在

28、8;²此ä?处ä|添¬¨ª加¨®消?息¡é处ä|理¤¨ª程¨¬序¨°代䨲码?m_wndViewTree.SetFocus();void CPersonView:OnSize(UINT nType, int cx, int cy)CDockablePane:OnSize(nType, cx, cy);/ TODO: 在¨²此ä?处ä|添¬

29、;¨ª加¨®消?息¡é处ä|理¤¨ª程¨¬序¨°代䨲码?AdjustLayout();我们现在就以完成了CPersonView类的设计,可以编译运行一下,如查没有发生错误就可以接着将CPersonView加到框架中去了。三、 将新视图添加到框架窗口中添加一个字符串资源ID为IDS_PERSON_VIEW 标题为“人力资源。保存再添加一个空ID为ID_VIEW_PERSONVIEW点击新建再添加两个图标资源IDI_PERSO

30、N_VIEW_HC 和 IDI_PERSON_VIEW接下来我们在类视图中找到CMainFrame类,点击右键,为其添加CPersonView变量m_wndPersonView。下面为CMainFrame添加两个自定义方法,代码如下:BOOL CMainFrame:CreateDockingWindow(void)BOOL bNameValid;/ 创立类视图CString strClassView;bNameValid = strClassView.LoadString(IDS_PERSON_VIEW);ASSERT(bNameValid);if (!m_wndPersonView.Crea

31、te(strClassView, this, CRect(0, 0, 200, 200), TRUE, ID_VIEW_PERSONVIEW, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_LEFT | CBRS_FLOAT_MULTI)TRACE0("未能创立“人力资源视图窗口n");return FALSE; / 未能创立SetDockingWindowIcons(theApp.m_bHiColorIcons);return TRUE;void CMainFrame:SetDocking

32、WindowIcons(bool bHiColorIcons)HICON hFileViewIcon = (HICON) :LoadImage(:AfxGetResourceHandle(), MAKEINTRESOURCE(bHiColorIcons ? IDI_PERSON_VIEW_HC : IDI_PERSON_VIEW), IMAGE_ICON, :GetSystemMetrics(SM_CXSMICON), :GetSystemMetrics(SM_CYSMICON), 0);m_wndPersonView.SetIcon(hFileViewIcon, FALSE);双击框架类的成

33、员函数OnCreate添加代码int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct)if (CMDIFrameWndEx:OnCreate(lpCreateStruct) = -1)return -1;BOOL bNameValid;/ 基于持久值设置视觉管理器和样式OnApplicationLook(theApp.m_nAppLook);CMDITabInfo mdiTabParams;mdiTabParams.m_style = CMFCTabCtrl:STYLE_3D_ONENOTE; / 其他可用样式.mdiTabParams.m_

34、bActiveTabCloseButton = TRUE; / 设置为 FALSE 会将关闭按钮放置在选项卡区域的右侧mdiTabParams.m_bTabIcons = FALSE; / 设置为 TRUE 将在 MDI 选项卡上启用文档图标mdiTabParams.m_bAutoColor = TRUE; / 设置为 FALSE 将禁用 MDI 选项卡的自动着色mdiTabParams.m_bDocumentMenu = TRUE; / 在选项卡区域的右边缘启用文档菜单EnableMDITabbedGroups(TRUE, mdiTabParams);if (!m_wndMenuBar.Cr

35、eate(this)TRACE0("未能创立菜单栏n");return -1; / 未能创立m_wndMenuBar.SetPaneStyle(m_wndMenuBar.GetPaneStyle() | CBRS_SIZE_DYNAMIC | CBRS_TOOLTIPS | CBRS_FLYBY);/ 防止菜单栏在激活时获得焦点CMFCPopupMenu:SetForceMenuFocus(FALSE);if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS

36、_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) |!m_wndToolBar.LoadToolBar(theApp.m_bHiColorIcons ? IDR_MAINFRAME_256 : IDR_MAINFRAME)TRACE0("未能创立工具栏n");return -1; / 未能创立CString strToolBarName;bNameValid = strToolBarName.LoadString(IDS_TOOLBAR_STANDARD);ASSERT(bNameValid);m_wndT

37、oolBar.SetWindowText(strToolBarName);CString strCustomize;bNameValid = strCustomize.LoadString(IDS_TOOLBAR_CUSTOMIZE);ASSERT(bNameValid);m_wndToolBar.EnableCustomizeButton(TRUE, ID_VIEW_CUSTOMIZE, strCustomize);/ 允许用户定义的工具栏操作:InitUserToolbars(NULL, uiFirstUserToolBarId, uiLastUserToolBarId);if (!m_w

38、ndStatusBar.Create(this)TRACE0("未能创立状态栏n");return -1; / 未能创立m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT);/ TODO: 如果您不希望工具栏和菜单栏可停靠,请删除这五行m_wndMenuBar.EnableDocking(CBRS_ALIGN_ANY);m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);EnableDocking(CBRS_ALIGN_ANY);DockPane(&

39、amp;m_wndMenuBar);DockPane(&m_wndToolBar);/ 启用 Visual Studio 2005 样式停靠窗口行为CDockingManager:SetDockingMode(DT_SMART);/ 启用 Visual Studio 2005 样式停靠窗口自动隐藏行为EnableAutoHidePanes(CBRS_ALIGN_ANY);/ 启用增强的窗口管理对话框EnableWindowsDialog(ID_WINDOW_MANAGER, ID_WINDOW_MANAGER, TRUE);/ 启用工具栏和停靠窗口菜单替换EnablePaneMenu(TRUE, ID_VIEW_CUSTOMIZE, strCustomize, ID_VIEW_TOOLBAR);/ 启用快速(按住 Alt 拖动)工具栏自定义CMFCToolBar:EnableQuickCustomization();if (CMFCToolBar:GetUserImages() = NULL)/ 加载用户定义的工具栏

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论