程序界面多模式显示,程序界面多模式显示
【 tulaoshi.com - C语言心得技巧 】
程序界面多模式显示
作者:赖锋
下载源代码
看过徐景周写过的一篇“程序界面多模式显示的实现”,在一个应用程序中使程序拥有多种显示模式,但是这个界面是由SDI的MFC文档视图结构实现,但是使用的代码在MDI的多文档/视图中不能实现,通过MSDN我找到了一些实现 MDI 的多模式实现方法,不敢独享,与大家分享。
利用SDI和MDI实现这种多模式的显示的应用程序,第一步首先要实现的是可以动态加载和销毁菜单。对于SDI的应用程序,实现是比较简单的,对于MDI的应用程序,实现则是有些麻烦,不过,这些都是可以做到的!呵,呵!
首先,要将SDI和MDI的AppWizard产生的菜单销毁,一开始就不要产生菜单!看过《深入浅出MFC》了吗!在 PreCreateWindow 函数中将菜单资源销毁,另外要注意的地方就是不可以删除资源中ID为 IDR_MAINFRAME 的菜单资源,这个很重要,否则会产生很多 MFC 的断言错误:
// 对于SDI的 PreCreateWindowBOOL 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 csreturn TRUE;}多文档的开始销毁菜单的方法:
// 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 csreturn TRUE;}以上的代码分别实现了SDI和MDI一开始的销毁了菜单资源!这样就可以为SDI和MDI的多模式显示作好了准备!利用 SetMenu 这 API就可以实现动态加载菜单,呵,是不是很简单!剩下的就是参考徐景周的代码就行了。
多文档显示的正常模式
多文档显示的简单模式(单文档与此相同)
多文档显示的简洁模式(单文档与此相同)
来源:http://www.tulaoshi.com/n/20160129/1484831.html