程式介面多模式顯示的實現 (轉)

worldblog發表於2007-12-13
程式介面多模式顯示的實現 (轉)[@more@] 

介面多顯示的實現:namespace prefix = o ns = "urn:schemas--com::office" />

作者:徐景周

相關示例原始碼( ?paper_id=311 )

 

word" />dbottom">
  如果你用過Real器的話,那就一定對它的多模式顯示方式不會陌生吧!RealPlayer擁有正常和精簡兩種顯示模式。我們有時也想在自己的程式介面上實現類似的功能,該怎樣實現呢?下面拿我用VC6.0做的一個多模式顯示程式示例來向大家展示,它是怎樣實現類似功能的。如下圖所示:(圖一) 正常顯示模式;(圖二)簡潔顯示模式,無檢視;(圖三),精簡顯示模式,僅工具條。

 


圖一 


 

 



圖二 

 


圖三

 

 

基本構成思想:

實現原理很簡單,只要分別獲取窗體大小、客戶區大小、工具條大小、狀態條大小、邊框大小以及標題欄大小,既可根據不同顯示模式,計算出不同的新窗體的高度(關鍵在於要重新計算高度,寬度)。如:簡潔顯示模式(無檢視方式下),為寬度不變、高度=窗體高度-客戶區高度-狀態條高度-邊框高度既可。精簡顯示模式(僅工具條方式下),為寬度不變,先隱藏選單、高度=標題欄高度+工具條高度+邊框高度既可。正常顯示模式,我想就不用說了吧!其實就是這麼簡單,RealPlayer是寬度,高度一起改變並計算,本示例只簡單的改變高度,寬度不變,但基本原理是相同的。下面讓我們來看看它的程式碼實現情況吧!

 

關鍵程式碼實現:

 我做了一個涵數,本示例程式只需此涵數便可實現。其中當nViewType傳值為0時,為正常顯示模式、傳值為1時,為簡潔顯示模式、傳值為2時,為精簡顯示模式。

 

void CMainFrame::ViewMode(int nViewType)

{

  CRect ClientRect;

  CRect WindowRect;

  CRect ToolbarRect;

  CRect StatarRect;

 

  //獲取窗體、客戶區及工具條大小

  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_H);

 

  //新窗體寬、高

  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

作者E:

未來工作室(Future Studio)

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-992792/,如需轉載,請註明出處,否則將追究法律責任。

相關文章