VC 单文档程序全屏显示及恢复--孤身我路!(My Blog)

来源:百度文库 编辑:神马文学网 时间:2024/05/02 01:41:51
引言
在编辑类软件或程序代码编辑程序中经常要遇到一些长度特别大的文本或代码,尤其是对于程序源码的编辑,如果编辑界面太小,则需要频繁拉动滚动条,对于程序员而言是很不情愿的,因为这样会打断程序的设计思路、影响编程的效果。因此不少软件都具备了全屏放大的功能,将编辑界面放大到全屏幕,尽最大限度地减少对滚动条的依赖程度。相信不少程序员一定非常喜欢在VC的全屏编辑状态下编程,本文就以Visual C++ 6.0为开发环境将普通的单文档编辑视图程序扩展为全屏编辑功能。
程序的设计思路
普通常规程序之所以在最大化的情况下没能实现全屏,是由于状态条、工具条、系统菜单、标题栏等几个窗口分别占据了一部分屏幕空间,所以实现视图的全屏显示首先要把以上几个窗体隐藏起来,然后才可以考虑将视图最大化的问题。
隐藏状态栏、工具条,可以将其当作一个浮动的窗体,只需通过各自的句柄将ShowWindow()函数的参数设成SW_HIDE即可将这几个窗体隐藏,同视图非常类似,在需要显示的时候可以用SW_SHOW标志将其显示出来。在此需要说明的是在进行全屏操作之前需要将当前的视图设置保存好,这在从全屏恢复为原始状态时需要用到。该操作也比较简单,只需简单调用API函数GetWindowRect()即可。至于标题栏的隐藏就不是简单的隐藏窗口了,这涉及到窗体风格的修改,要把WS_CAPTION风格从现有的窗体风格中剥离出来。这可以先用GetWindowLong()获取到当前的窗体风格,然后通过逻辑运算将WS_CAPTION风格从中剥离开来,最后再用SetWindowLong()函数将修改后的窗体风格设置为当前的窗体风格。至于系统菜单的隐藏也可以很方便的加以实现:先保存当前菜单,然后将菜单设置为"空"就实现了菜单的隐藏。各个窗体都隐藏好后剩下的工作就是将编辑视图放大到满屏,可以用this来获取当前的视图指针,并把ShowWindow ()函数的参数设为SW_SHOWMAXIMIZED就最终完成了整个全屏放大的全过程。
至于从全屏恢复到初始状态则完全是上述过程的逆操作:通过逻辑运算把WS_CAPTION风格加入到窗体风格中,恢复标题栏的显示;通过将状态条和工具条的ShowWindow()函数的标志参数设成WM_SHOW将其分别予以恢复;系统菜单也可以通过从保存好的原始菜单中读取并重新设置来恢复其原始面貌。现在仅把隐藏的各个窗体显示了出来,窗体还是处于满屏状态,所以还要通过MoveWindow()函数把窗体的位置恢复到全屏前的状态,这也是我们为何在全屏时要保存窗体的一些原始参数的原因。
三、 程序的具体实现
前面部分在大体思路上对程序的设计实现进行了粗略的分析,但在实际编程中有不少的细节还未考虑进去,下面就根据前面的程序设计思路对其进行编码,并结合其部分关键代码进行讲解说明,以便于更好的理解本程序的实现方法:
全屏显示部分:
//通过设置SW_HIDE参数隐藏当前的工具条、任务栏
m_bToolBarWasVisible=(m_wndToolBar.IsWindowVisible()!=0);
m_wndToolBar.ShowWindow(SW_HIDE);
m_bStatusBarWasVisible=(m_wndStatusBar.IsWindowVisible()!=0);
m_wndStatusBar.ShowWindow(SW_HIDE);
……
//由于在全屏状态下没有系统菜单和工具条,所以需要显示一个浮动的工具条按钮用于//从全屏状态下返回到正常状态。
//首先创建一个工具条对象,并把一个工具条资源装载进来,同时对工具条的风格进行//设置:
m_pwndFullScreenBar=new CToolBar;
m_pwndFullScreenBar->Create(this);
m_pwndFullScreenBar->LoadToolBar(IDR_FULLSCREEN);
m_pwndFullScreenBar->SetBarStyle(m_pwndFullScreenBar->GetBarStyle() |
CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);
//浮动按钮的效果
m_pwndFullScreenBar->ModifyStyle(0, TBSTYLE_FLAT);
m_pwndFullScreenBar->EnableDocking(0);
//设置返回到正常状态下的按钮的位置
CPoint pt(300,200);
FloatControlBar(m_pwndFullScreenBar,pt);
//在放大到满屏前预先保存当前的窗口位置
GetWindowRect(&m_mainRect);
//通过改变窗口风格来隐藏标题栏
LONG style=::GetWindowLong(m_hWnd,GWL_STYLE);
style&=~WS_CAPTION;
::SetWindowLong(m_hWnd,GWL_STYLE,style);
int screenx=GetSystemMetrics(SM_CXSCREEN);
int screeny=GetSystemMetrics(SM_CYSCREEN);
//重新改变大小:
SetWindowPos(NULL,0,0,screenx,screeny,SWP_NOZORDER);
style=::GetWindowLong(m_hWnd,GWL_STYLE);
m_bChildMax=(style & WS_MAXIMIZE)?true:false;
//保存原有的系统菜单,并将当前菜单设置为空
CMenu* pOldMenu=GetMenu();
m_OrgMenu.Attach(pOldMenu->Detach());
SetMenu((CMenu*)NULL);
//在其他窗体隐藏好后,将编辑视图放大到满屏
this->ShowWindow (SW_SHOWMAXIMIZED);
……
至于从全屏恢复到初始状态的这部分代码则相对比较简单,只需依次将隐藏的各个窗体和菜单恢复出来并将视图移动到原来大小即可,该段代码许多地方同放大到全屏时的代码相似,只是参数有所差异而已。下面就是恢复部分的主要代码:
……
//将保存的系统菜单恢复出来
SetMenu(&m_OrgMenu);
m_OrgMenu.Detach();
//释放掉在全屏时创建的工具条指针对象,由于是用new创建的,在系统堆中为指针分//配地址空间,在程序退出时不能自动释放,所以必须要用delete显式地进行释放
delete m_pwndFullScreenBar;
//把前面剥离出去的WS_CAPTION风格在加入到窗体风格中。
LONG style=::GetWindowLong(m_hWnd,GWL_STYLE);
style|=WS_CAPTION;
::SetWindowLong(m_hWnd,GWL_STYLE,style);
//显示工具条、任务栏
if(m_bToolBarWasVisible)
m_wndToolBar.ShowWindow(SW_SHOW);
if(m_bStatusBarWasVisible)
m_wndStatusBar.ShowWindow(SW_SHOW);
MoveWindow(&m_mainRect);
RecalcLayout();
……
小结:
本文主要是针对单文档框架的程序进行设计的,由于不涉及到子窗体,因此比较简单。对于多文档的全屏放大,实现方法在总体思路上是与之相一致的。只是在处理全屏显示与恢复时需要将程序子框架也响应的进行放大与缩小,标题栏也要通过改变窗口风格的方式来隐藏与恢复显示。本程序对于其他基于非编辑视图的程序也是适用的。本文所述程序在Windows 2000 Professional下由Microsoft Visual C++ 6.0编译通过。