Visual-Studio-2010-MFC框架结构设计

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

VisualStudio2010MFC框架结构设计(图解)建立一个类似于fisualStudio2010的界面,总体步骤如下:第一步是建立一个标准的MFC工程(这对我们学习有利)第二步是添加必要的资源,当然也可以边做边加入。第三步是从CDockablePane派生一个视图类用于停靠在框架窗口的左边。为这个类要创建一个CViewTree类,它主要是在派生出来的类中加入树控件。第四步就是设计这个派生的类,为其添加工具栏,弹出菜单等第五步就是将这个派生类加到框架中去。下面我们开始制作:一、新建标准的MFC工程点新建项目选择VisualC++的MFC选择MFC应用程序输入MyTest工程名(位置就自己定吧。这里解决方案名称会与名称同步,你可以修改“解决方案名称(M)”,它其实就是工程的总目录名)点击确定。下一步这里我们使用的是“多信文档”选项卡式档,项目类型选择MFC校准点击完成。二、设计左侧停靠窗口CDockablePane在类视图中点击右键,在弹出菜单中选择“类向导”点击“添加类”类名中添加“CPersonView”基类选择“CDockablePane”点击完成,回到类向导中,我们看到类名已经是我们刚刚建立的类。点击确定。这样我们就建立了一个由CDockablePane派生的子类“CPersonView”。接下类我们再从CTreeCtrl类派生一个CViewTree子类,它是有要CPersonView中生成树形结构。作为系统功能菜单使用。步骤与建立CPersonView上面相同。接下来是为CPersonView停靠窗口上方添一个独特的工具栏,为此我们要生成一类,这个类不必用向导生成,只需要在CPersonView类头文件中添加如下代码就可以了,因这个类不作为其公用类(比较小)。(CPersonView.h文件)#pragmaonce#includeviewtree.hclassCPersonViewToolBar:publicCMFCToolBar{virtualvoidOnUpdateCmdUI(CFrameWnd*/*pTarget*/,BOOLbDisableIfNoHndler)//此成员函数由框架类调用,以便更新状态工具栏或状态栏,pTarget指向应用程序的主窗口,这个指针用于路由更新消息,bDisablefNoHndler是个标志,指示控件没有更新处理程序应该自动显示为禁用。{CMFCToolBar::OnUpdateCmdUI((CFrameWnd*)GetOwner(),bDisableIfNoHndler);}virtualBOOLAllowShowOnList()const{returnFALSE;}};CMFCToolBar是选件类类似于CToolBarClass,但是,提供用户界面功能附加支持。其中包括简单的工具栏、工具栏有快捷图像的,大图标、寻呼机按钮、锁定的工具栏、rebar控件、文本在图像下,背景图像和选项卡式工具栏。CMFCToolBar选件类还包含内置为工具栏的用户可自定义的支持,并菜单、拖放到工具栏和菜单之间,组合框按钮,编辑框按钮、颜色选取器和汇总按钮。下面是将CViewTree附加到CPersonView中。方法是:在类视图中右键选择CPersonView类访问选择“protected”变量类型选择输入“CViewTree”变量名输入“m_wndViewTree”点击完成。这样就在CPersonView类的头文件中定议一个名为m_wndViewTree的变量。代码如下:protected:DECLARE_MESSAGE_MAP()CViewTreem_wndViewTree;同样方法为CPersonView添加如下两个变量:CImageListm_PersonViewImages;CPersonViewToolBarm_wndToolBar;接下来我们要为CPersonView添加一个弹出式菜单方法是:选择资源视图(或者在解决方案视图中找到资源文件(MyTest.rc)双击进入资源视图)右击“Menu”选择添加资源点击新建方法不再赘述,其ID改为IDR_POPUP_EXPLORER,保存。添加位图资源(与菜单相同)其ID改为IDB_PERSON_VIEW添加工具栏其ID改为IDR_EXPLORER同法添加IDB_EXPLORER_24及IDB_FILE_VIEW为CPerosnView添加自定义方法OnChangeVisualStyle()和AdjustLayout,方法是,进入类向导选择“方法”点击添加方法返回类型为void,参数类型不添加,访问选择public点确定。再添加一个用于对树添加节点的私有方法:FillFileView方法。下面是三个方法的代码voidCPersonView::OnChangeVisualStyle(void){m_wndToolBar.CleanUpLockedImages();m_wndToolBar.LoadBitmap(theApp.m_bHiColorIcons?IDB_EXPLORER_24:IDR_EXPLORER,0,0,TRUE/*锁?定¡§*/);m_PersonViewImages.DeleteImageList();UINTuiBmpId=theApp.m_bHiColorIcons?IDB_PERSON_VIEW_24:IDB_PERSON_VIEW;CBitmapbmp;if(!bmp.LoadBitmap(uiBmpId)){TRACE(_T(无T法¤¡§加¨®载?位?图ª?:%x\n),uiBmpId);ASSERT(FALSE);return;}BITMAPbmpObj;bmp.GetBitmap(&bmpObj);UINTnFlags=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,255));m_wndViewTree.SetImageList(&m_PersonViewImages,TVSIL_NORMAL);}voidCPersonView::AdjustLayout(void){if(GetSafeHwnd()==NULL){return;}CRectrectClient;GetClientRect(rectClient);intcyTlb=m_wndToolBar.CalcFixedLayout(FALSE,TRUE).cy;m_wndToolBar.SetWindowPos(NULL,rectClient.left,rectClient.top,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);}voidCPersonView::FillFileView(void){HTREEITEMhRoot=m_wndViewTree.InsertItem(_T(FakeApp文?件t),0,0);m_wndViewTree.SetItemState(hRoot,TVIS_BOLD,TVIS_BOLD);HTREEITEMhSrc=m_wndViewTree.InsertItem(_T(FakeApp源¡ä文?件t),0,0,hRoot);m_wndViewTree.InsertItem(_T(FakeApp.cpp),1,1,hSrc);m_wndViewTree.InsertItem(_T(FakeApp.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);HTREEITEMhInc=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);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);HTREEITEMhRes=m_wndViewTree.InsertItem(_T(FakeApp资Á¨º源¡ä文?件t),0,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.Expand(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窗口尺寸变化消息五个消息,代码如下voidCPersonView::OnContextMenu(CWnd*pWnd,CPointpoint){//TODO:在¨²此ä?处ä|添¬¨ª加¨®消?息¡é处ä|理¤¨ª程¨¬序¨°代䨲码?CTreeCtrl*pWndTree=(CTreeCtrl*)&m_wndViewTree;ASSERT_VALID(pWndTree);if(pWnd!=pWndTree){CDockablePane::OnContextMenu(pWnd,point);return;}if(point!=CPoint(-1,-1)){//选?择?已°?单Ì£¤击¡Â的Ì?项?:CPointptTree=point;pWndTree-ScreenToClient(&ptTree);UINTflags=0;HTREEITEMhTreeItem=pWndTree-HitTest(ptTree,&flags);if(hTreeItem!=NULL){pWndTree-SelectItem(hTreeItem);}}pWndTree-SetFocus(

1 / 40
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功