技术开发 频道

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

【IT168技术文档】

  如果我们想在程序界面上实现象RealPlayer播放器那样有正常和精简两种显示模式,该怎样实现呢?下面我用VC做一个多模式显示程序示例来向大家展示,它是怎样实现类似功能的。如:正常显示模式;简洁显示模式,无视图;精简显示模式,仅工具条。
 
  基本构成思想:
 
  实现原理很简单,只要分别获取窗体大小、客户区大小、工具条大小、状态条大小、边框大小以及标题栏大小,既可根据不同显示模式,计算出不同的新窗体的高度(关键在于要重新计算高度,宽度)。如:简洁显示模式(无视图方式下),为宽度不变、高度=窗体高度-客户区高度-状态条高度-边框高度既可。精简显示模式(仅工具条方式下),为宽度不变,先隐藏菜单、高度=标题栏高度+工具条高度+边框高度既可。其实就是这么简单,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); }

0
相关文章