VC程序界面多模式显示

2016-02-19 21:45 12 1 收藏

想不想get新技能酷炫一下,今天图老师小编就跟大家分享个简单的VC程序界面多模式显示教程,一起来看看吧!超容易上手~

【 tulaoshi.com - 编程语言 】

  看过徐景周写过的一篇“程序界面多模式显示的实现”,在一个应用程序中使程序拥有多种显示模式,但是这个界面是由SDI的MFC文档视图结构实现,但是使用的代码在MDI的多文档/视图中不能实现,通过MSDN我找到了一些实现 MDI 的多模式实现方法,不敢独享,与大家分享 。

  利用SDI和MDI实现这种多模式的显示的应用程序,第一步首先要实现的是可以动态加载和销毁菜单。对于SDI的应用程序,实现是比较简单的,对于MDI的应用程序,实现则是有些麻烦,不过,这些都是可以做到的!呵,呵!

  首先,要将SDI和MDI的AppWizard产生的菜单销毁,一开始就不要产生菜单!看过《深入浅出MFC》了吗!在 PreCreateWindow 函数中将菜单资源销毁 ,另外要注意的地方就是不可以删除资源中ID为 IDR_MAINFRAME 的菜单资源,这个很重要,否则会产生很多 MFC 的断言错误:

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

// 对于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 就可以实现动态加载菜单,呵,是不是很简单!剩下的就是参考徐景周的代码就行了。本文发表于http://bianceng.cn(编程入门网)

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)


多文档显示的正常模式

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

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

来源:http://www.tulaoshi.com/n/20160219/1627073.html

延伸阅读
当应用程序中使用多次GDI调用绘制到窗口中时,在窗口清除并被重新绘制时,会出现明显的闪烁。使用双缓冲技术可轻松消除闪烁。 步骤如下: 1、假设当前显示设备上下文为CDC * pDC; 2、使用CDC对象创建可兼容设备上下文,       CDC memdc;       memdc.CreateCompatibleDC(pDC); 3、使...
标签: 电脑入门
1、运行一个 Metro 应用,例如:远程桌面(或者其他应用程序)。如下图所示: 2、鼠标移动到左下角。如下图所示: 3、选择其他应用程序后-鼠标右键-选择贴靠到左侧或者右侧。如下图所示: 4、选择另一程序:贴靠左侧,实现效果图如下:
四、上线时的声音及消息显示时的人物跳动 本人并未实现人物跳动,并不知道是切换图片,还是更改图片的位置,所以此功能有待各位的指点! 五、动感十足的抽屉菜单 我对QQ的这个菜单印象特深,犹其是配的“刷”的声音,充分体验到QQ的生动!下面就详细介绍自己是如何一步步实现的: 说明: 在程序的一开始就获...
大凡用过电脑,上过网的朋友都用过QQ,对QQ的一些交互界面可能垂慕已久,的确,无论是其生动的企鹅形象,还是“滴滴的”消息声音,以及“刷”的菜单等功能,简单单的消息发送,以及快速的回显和众多卡通的QQ头像等铸就了其在网络的良好地位,本人对其研究虽不够透彻,但也做一些探索性的尝试,并简单的实现了比较突出的功能,在s模拟的过程...
有很多人问为什么VC编译出来的程序都要上兆。而且有些人还总结出条结论: VC做出的东西是又大又慢。 其实这实在是冤枉了VC了。其实VC做的工程是个能包含多个子工程的工程文件。一般用AppWizard生成的工程里就包含了两个子工程:Win32 Debug工程和Win32Release工程。而缺省激活的工程是Win32 Debug工程,用这个子工程编译出来的执行...

经验教程

284

收藏

74
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部