Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2086646
  • 博文数量: 909
  • 博客积分: 4000
  • 博客等级: 上校
  • 技术积分: 12260
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-06 20:50
文章分类

全部博文(909)

文章存档

2008年(909)

我的朋友

分类:

2008-05-06 22:39:36

一起学习
程序界面多模式显示

作者:赖锋

下载源代码

  看过徐景周写过的一篇“程序界面多模式显示的实现”,在一个应用程序中使程序拥有多种显示模式,但是这个界面是由SDI的MFC文档视图结构实现,但是使用的代码在MDI的多文档/视图中不能实现,通过MSDN我找到了一些实现 MDI 的多模式实现方法,不敢独享,与大家分享 。
  利用SDI和MDI实现这种多模式的显示的应用程序,第一步首先要实现的是可以动态加载和销毁菜单。对于SDI的应用程序,实现是比较简单的,对于MDI的应用程序,实现则是有些麻烦,不过,这些都是可以做到的!呵,呵!
  首先,要将SDI和MDI的AppWizard产生的菜单销毁,一开始就不要产生菜单!看过《深入浅出MFC》了吗!在 PreCreateWindow 函数中将菜单资源销毁 ,另外要注意的地方就是不可以删除资源中ID为 IDR_MAINFRAME 的菜单资源,这个很重要,否则会产生很多 MFC 的断言错误:


// 对于SDI的 PreCreateWindow

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)

{

	cs.style &= ~FWS_ADDTOTITLE;

	cs.style &= ~( WS_SIZEBOX | WS_MINIMIZEBOX | WS_MAXIMIZEBOX );



	if ( cs.hMenu != NULL )

	{

		DestroyMenu( cs.hMenu );

		cs.hMenu = NULL;

	}



	if( ! CFrameWnd::PreCreateWindow( cs ) )

		return FALSE;

	// TODO: Modify the Window class or styles here by modifying

	//  the CREATESTRUCT cs



	return TRUE;

}	
多文档的开始销毁菜单的方法:
  首先保留 ID 为 IDR_MAINFRAME 的菜单资源,原因同上面一样。跟着删除菜单MDI子窗口的菜单资源,其ID为 (IDR_xxxTYPE) 的类型. 这样做的原因是避免资源泄漏, (哪儿泄漏,我还没有去查,MSDN上是这样的描述) ,在MDI的窗口中,打开子窗口的时候,会发生菜单切换,这 些是MFC的代码自动实现的,所以我们现在就是把这些切换菜单的代码去除。

// CMainFrame 中重载 LoadFrame

// 

// virtual BOOL LoadFrame( UINT nIDResource,

//   DWORD dwDefaultStyle = WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE,

//   CWnd* pParentWnd = NULL, CCreateContext* pContext = NULL );	



 BOOL CMainFrame::LoadFrame(UINT nIDResource, DWORD dwDefaultStyle,

             CWnd* pParentWnd, CCreateContext* pContext)

 {

 	return CFrameWnd::LoadFrame(nIDResource,dwDefaultStyle,

			pParentWnd,pContext);

 } 

// CMainFrame 中重载 OnCreateClient, 实现禁止菜单切换

// virtual BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs,	

//       CCreateContext* /*pContext*/);



 BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs,

		CCreateContext* /*pContext*/)

 {

	return CreateClient(lpcs,NULL);

 }



// 添加以下代码:

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)

{

	cs.style &= ~FWS_ADDTOTITLE;

	cs.style &= ~( WS_SIZEBOX | WS_MINIMIZEBOX | WS_MAXIMIZEBOX );



	if ( cs.hMenu != NULL )

	{

		DestroyMenu( cs.hMenu );

		cs.hMenu = NULL;

	}



	if( ! CFrameWnd::PreCreateWindow( cs ) )

		return FALSE;

	// TODO: Modify the Window class or styles here by modifying

	//  the CREATESTRUCT cs



	return TRUE;

}	
  以上的代码分别实现了SDI和MDI一开始的销毁了菜单资源!这样就可以为SDI和MDI的多模式显示作好了准备!利用 SetMenu 这 API 就可以实现动态加载菜单,呵,是不是很简单!剩下的就是参考徐景周的代码就行了。


多文档显示的正常模式


多文档显示的简单模式(单文档与此相同)


多文档显示的简洁模式(单文档与此相同)

下载本文示例代码


程序界面多模式显示程序界面多模式显示程序界面多模式显示程序界面多模式显示程序界面多模式显示程序界面多模式显示程序界面多模式显示程序界面多模式显示程序界面多模式显示程序界面多模式显示程序界面多模式显示程序界面多模式显示
阅读(280) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~