程序界面多模式显示的实现

原创 2002年08月12日 11:30:00
 

程序界面多模式显示的实现<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

作者:徐景周

下载相关示例源码( http://www.vchelp.net/itbookreview/view_paper.asp?paper_id=311 )

 

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><?xml:namespace prefix = w ns = "urn:schemas-microsoft-com:office:word" />
         如果你用过RealPlayer播放器的话,那就一定对它的多模式显示方式不会陌生吧!RealPlayer拥有正常和精简两种显示模式。我们有时也想在自己的程序界面上实现类似的功能,该怎样实现呢?下面拿我用VC6.0做的一个多模式显示程序示例来向大家展示,它是怎样实现类似功能的。如下图所示:(图一) 正常显示模式;(图二)简洁显示模式,无视图;(图三),精简显示模式,仅工具条。

 


图一 


 

 



图二 

 


图三

 

 

基本构成思想:

实现原理很简单,只要分别获取窗体大小、客户区大小、工具条大小、状态条大小、边框大小以及标题栏大小,既可根据不同显示模式,计算出不同的新窗体的高度(关键在于要重新计算高度,宽度)。如:简洁显示模式(无视图方式下),为宽度不变、高度=窗体高度-客户区高度-状态条高度-边框高度既可。精简显示模式(仅工具条方式下),为宽度不变,先隐藏菜单、高度=标题栏高度+工具条高度+边框高度既可。正常显示模式,我想就不用说了吧!其实就是这么简单,RealPlayer是宽度,高度一起改变并计算,本示例只简单的改变高度,宽度不变,但基本原理是相同的。下面让我们来看看它的代码实现情况吧!

 

关键代码实现:

 我做了一个涵数,本示例程序只需调用此涵数便可实现。其中当nViewType传值为0时,为正常显示模式、传值为1时,为简洁显示模式、传值为2时,为精简显示模式。

 

void CMainFrame::ViewMode(int nViewType)

{

         CRect ClientRect;

         CRect WindowRect;

         CRect ToolbarRect;

         CRect StatusbarRect;

 

         //获取窗体、客户区及工具条大小

         WindowRect = m_WindowRect;

         ClientRect = m_ClientRect;

         m_wndToolBar.GetWindowRect(&ToolbarRect);

 

         //获取边框及标题栏大小

         int borderHeight = GetSystemMetrics(SM_CYBORDER);

         int captionHeight = GetSystemMetrics(SM_CYCAPTION);

 

         //获取状态条大小

         CStatusBar* pStatus = (CStatusBar*) AfxGetApp()->m_pMainWnd->GetDescendantWindow(AFX_IDW_STATUS_BAR);   

         pStatus->GetWindowRect(&StatusbarRect);

 

         //停靠工具条

         DockControlBar(&m_wndToolBar); 

 

         int CompactCx;                                                         //新窗体宽

         int CompactCy;                                                                  //新窗体高

 

         //以多种模式显示

         switch(nViewType)

         {

         case 0:                                                                                   //正常显示模式

                   {

                            //显示菜单

                            if ( hMenu != NULL )        

                                     ::SetMenu( m_hWnd, hMenu );

                           

                            //显示状态条

                            pStatus->ShowWindow(SW_SHOW);

 

                            //新窗体宽、高

                            CompactCx=WindowRect.Width();

                            CompactCy=WindowRect.Height();

                   }

                   break;

         case 1:                                                                                 //简洁显示模式

                   {

                            //显示菜单

                            if ( hMenu != NULL )        

                                     ::SetMenu( m_hWnd, hMenu );

                           

                            //隐藏状态条

                            pStatus->ShowWindow(SW_HIDE);

                           

                            //新窗体宽、高

                            CompactCx=WindowRect.Width();

                            CompactCy=WindowRect.Height() - ClientRect.Height() + ToolbarRect.Height() - borderHeight;

                   }

                   break;

         case 2:                                                                                 //精简显示模式

                   {

                            //隐藏菜单

                            hMenu = ::GetMenu(m_hWnd);        

                                     ::SetMenu( m_hWnd, NULL );

                           

                            //隐藏状态条

                            pStatus->ShowWindow(SW_HIDE);

                           

                            //新窗体宽、高

                            CompactCx=WindowRect.Width();

                            CompactCy=captionHeight + ToolbarRect.Height() + borderHeight*2;

                   }

                   break;

         }

 

         //设置新窗体显示

         SetWindowPos( &wndTop, WindowRect.left, WindowRect.top, CompactCx, CompactCy, SWP_SHOWWINDOW); 

 

}

 

 

以上部分代码具体实现的细节问题,可在下载实例代码后,仔细查看源码既可(内有详细注释)。

 

 

联系方式:

地址:陕西省西安市劳动路2号院六单元

邮编:710082

作者EMAIL:jingzhou_xu@163.net

未来工作室(Future Studio)

 

基于Android 4.4 开发的多窗口系统 开放源码 Android 多窗口 开源

基于Android 4.4 开发的多窗口系统 开放源码
  • ritterliu
  • ritterliu
  • 2014年06月20日 19:22
  • 14972

vc多屏显示介绍

转自:http://wenku.baidu.com/link?url=32eBGaJmpFy-7qufsAKvXjo6u9mdChtEiAR3RwzsL579BUT1Kry2IHiz8zdrRkTYe...
  • rankun1
  • rankun1
  • 2016年07月26日 16:25
  • 1499

Qt多文档界面应用设计

使用Qt编写多文档界面(MDI)应用相当方便,主要会使用到QMdiArea和QMdiSubWindow两个类。可以查看Qt Asistant中这两个类的说明文档,里面介绍的相当详细。另外,可以搜索例程...
  • u013189731
  • u013189731
  • 2014年12月08日 17:14
  • 1814

一个支持多屏显示的程序

原文地址:http://blog.sina.com.cn/s/blog_4868f98601019odo.html 。感谢作者,如果造成任何不便,请联系我删除。 最近要用到多屏显示。 多屏显示的原...
  • WLFF_CSDN
  • WLFF_CSDN
  • 2016年08月16日 16:13
  • 1002

大文件 and 多下载任务的封装(二)--观察者模式--实现下载进度的实时更新

Observer原文地址 上篇博客的内容讲述了ThreadPool的封装,这篇博客虽然是紧跟着上一篇的,但是本文的知识点是一个单独存在的,也就是观察者设计模式的使用。首先我们一起来分析一下,对于一...
  • MyLoveyaqiong
  • MyLoveyaqiong
  • 2016年11月13日 07:16
  • 653

基于Qt的多窗口编程--界面的设计

对于应用程序中的多窗体切换,我们已经习以为常。通常一个应用程序中,不同的窗口代表不同功能的工作区。本文将详细描述基于Qt的多窗体程序的设计方法。在阅读本文之前,你最好了解面向对象的基本思想以及Qt的基...
  • u010779194
  • u010779194
  • 2013年06月10日 15:36
  • 2661

Qt中单个窗口中实现多个页面显示

简述在很多时候我们希望在一个QDialog中或者一个自定义的QWidget中实现多个窗口的实现,以此来实现当功能太多时不局限于每次单独创建其窗口去显示功能模块。下图展示了其效果。为了实现上图所能够实现...
  • wjh_init
  • wjh_init
  • 2017年12月23日 17:18
  • 86

结构型模式之装饰模式(界面显示构件库)

题目:某软件公司基于面向对象技术开发了一套图形界面显示构件库VisualComponent。在使用该库构建某图形界面时,用户要求为界面定制一些特效显示效果,如带滚动条的窗体或透明窗体等。现使用装饰模式...
  • zenglinshan
  • zenglinshan
  • 2015年11月24日 14:13
  • 632

Tab标签切换页面的多种实现方式

Tab标签切换页面在APP界面中十分常见,可分为底部标签和顶部标签,进一步又分为可滑动和不可滑动(主要在于是否使用了support v4包下的ViewPager)。不可滑动的界面通过点击Tab标签所在...
  • huangluqian
  • huangluqian
  • 2016年10月23日 18:40
  • 2029

编写Qt多窗口程序

转自:http://www.qter.org/portal.php?mod=view&aid=27 一、添加主窗口 1.首先打开Qt Creator,新建Qt Widgets Appli...
  • daaikuaichuan
  • daaikuaichuan
  • 2017年04月08日 20:24
  • 1921
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:程序界面多模式显示的实现
举报原因:
原因补充:

(最多只允许输入30个字)