Visual Studio MFC框架结构设计.docx
- 文档编号:7963191
- 上传时间:2023-01-27
- 格式:DOCX
- 页数:38
- 大小:2.52MB
Visual Studio MFC框架结构设计.docx
《Visual Studio MFC框架结构设计.docx》由会员分享,可在线阅读,更多相关《Visual Studio MFC框架结构设计.docx(38页珍藏版)》请在冰豆网上搜索。
VisualStudioMFC框架结构设计
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
#include"viewtree.h"
classCPersonViewToolBar:
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();
theApp.GetContextMenuManager()->ShowPopupMenu(IDR_POPUP_EXPLORER,point.x,point.y,this,TRUE);
}
intCPersonView:
:
OnCreate(LPCREATESTRUCTlpCreateStruct)
{
if(CDockablePane:
:
OnCreate(lpCreateStruct)==-1)
return-1;
//TODO:
在¨²此ä?
添¬¨ª加¨®您¨²专Á¡§用®?
的Ì?
创ä¡ä建¡§代䨲码?
CRectrectDummy;
rectDummy.SetRectEmpty();
//创ä¡ä建¡§视º¨®图ª?
:
constDWORDdwViewStyle=WS_CHILD|WS_VISIBLE|TVS_HASLINES|TVS_LINESATROOT|TVS_HASBUTTONS;
if(!
m_wndViewTree.Create(dwViewStyle,rectDummy,this,4))
{
TRACE0("未¡ä能¨¹创ä¡ä建¡§文?
件t视º¨®图ª?
\n");
return-1;//未¡ä能¨¹创ä¡ä建¡§
}
//加¨®载?
视º¨®图ª?
图ª?
像?
:
m_PersonViewImages.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.SetPaneStyle(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命¨¹令¢?
将?
通ª¡§过y此ä?
控?
件t路¡¤由®¨¦,ê?
而?
不?
是º?
通ª¡§过y主¡Â框¨°架¨¹路¡¤由®¨¦:
m_wndToolBar.SetRouteCommandsViaFrame(FALSE);
//填入一些静态树视图数据此处只需填入虚拟代码,而不是复杂的数据)
FillFileView();
AdjustLayout();
return0;
}
voidCPersonView:
:
OnPaint()
{
CPaintDCdc(this);//devicecontextforpainting
//TODO:
在¨²此ä?
处ä|添¬¨ª加¨®消?
息¡é处ä|理¤¨ª程¨¬序¨°代䨲码?
//不?
为a绘?
图ª?
消?
息¡é调Ì¡Â用®?
CDockablePane:
:
OnPaint()
CRectrectTree;
m_wndViewTree.GetWindowRect(rectTree);
ScreenToClient(rectTree);
rectTree.InflateRect(1,1);
dc.Draw3dRect(rectTree,:
:
GetSysColor(COLOR_3DSHADOW),:
:
GetSysColor(COLOR_3DSHADOW));
}
voidCPersonView:
:
OnSetFocus(CWnd*pOldWnd)
{
CDockablePane:
:
OnSetFocus(pOldWnd);
//TODO:
在¨²此ä?
处ä|添¬¨ª加¨®消?
息¡é处ä|理¤¨ª程¨¬序¨°代䨲码?
m_wndViewTree.SetFocus();
}
voidCPersonView:
:
OnSize(UINTnType,intcx,intcy)
{
CDockablePane:
:
OnSize(nType,cx,cy);
//TODO:
在¨²此ä?
处ä|添¬¨ª加¨®消?
息¡é处ä|理¤¨ª程¨¬序¨°代䨲码?
AdjustLayout();
}
我们现在就以完成了CPersonView类的设计,可以编译运行一下,如查没有发生错误就可以接着将CPersonView加到框架中去了。
三、将新视图添加到框架窗口中
添加一个字符串资源
ID为IDS_PERSON_VIEW标题为“人力资源”。
保存
再添加一个空ID为ID_VIEW_PERSONVIEW
点击新建
再添加两个图标资源IDI_PERSON_VIEW_HC和IDI_PERSON_VIEW
接下来我们在类视图中找到CMainFrame类,点击右键,为其添加CPersonView变量m_wndPersonView。
下面为CMainFrame添加两个自定义方法,
代码如下:
BOOLCMainFrame:
:
CreateDockingWindow(void)
{
BOOLbNameValid;
//创建类视图
CStringstrClassView;
bNameValid=strClassView.LoadString(IDS_PERSON_VIEW);
ASSERT(bNameValid);
if(!
m_wndPersonView.Create(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");
returnFALSE;//未能创建
}
SetDockingWindowIcons(theApp.m_bHiColorIcons);
returnTRUE;
}
voidCMainFrame:
:
SetDockingWindowIcons(boolbHiColorIcons)
{
HICONhFileViewIcon=(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);
}
双击框架类的成员函数OnCreate
添加代码
intCMainFrame:
:
OnCreate(LPCREATESTRUCTlpCreateStruct)
{
if(CMDIFrameWndEx:
:
OnCreate(lpCreateStruct)==-1)
return-1;
BOOLbNameValid;
//基于持久值设置视觉管理器和样式
OnApplicationLook(theApp.m_nAppLook);
CMDITabInfomdiTabParams;
mdiTabParams.m_style=CMFCTabCtrl:
:
STYLE_3D_ONENOTE;//其他可用样式...
mdiTabParams.m_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.Create(this))
{
TRACE0("未能创建菜单栏\n");
return-1;//未能创建
}
m_wndMenuBar.SetPaneStyle(m_wndMenuBar.GetPaneStyle()|CBRS_SIZE_DYNAMIC|CBRS_TOOLTIPS|CBRS_FLYBY);
//防止菜单栏在激活时获得焦点
CMFCPopupMenu:
:
SetForceMenuFocus(FA
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Visual Studio MFC框架结构设计 MFC 框架结构 设计
![提示](https://static.bdocx.com/images/bang_tan.gif)