程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 程序界面多模式顯示的實現

程序界面多模式顯示的實現

編輯:關於VC++

如果你用過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:[email protected]

未來工作室(Future Studio)

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved