<>如果你用过RealPlayer播放器的话,那就一定对它的多模式显示方式不会陌生吧!RealPlayer拥有正常和精简两种显示模式。我们有时也想在自己的程序界面上实现类似的功能,该怎样实现呢?下面拿我用VC6.0做的一个多模式显示程序示例来向大家展示,它是怎样实现类似功能的</P>; X: D4 s g' |* p0 s# U$ r
<><B>基本构成思想:</B> & K% T7 h+ k2 j3 s$ N实现原理很简单,只要分别获取窗体大小、客户区大小、工具条大小、状态条大小、边框大小以及标题栏大小,既可根据不同显示模式,计算出不同的新窗体的高度(关键在于要重新计算高度,宽度)。如:简洁显示模式(无视图方式下),为宽度不变、高度=窗体高度-客户区高度-状态条高度-边框高度既可。精简显示模式(仅工具条方式下),为宽度不变,先隐藏菜单、高度=标题栏高度+工具条高度+边框高度既可。正常显示模式,我想就不用说了吧!其实就是这么简单,RealPlayer是宽度,高度一起改变并计算,本示例只简单的改变高度,宽度不变,但基本原理是相同的。下面让我们来看看它的代码实现情况吧! </P> $ A S4 }4 j* x<><B>关键代码实现:</B> ~ B. D2 p- X* K) ]$ J# o$ ]
我做了一个涵数,本示例程序只需调用此涵数便可实现。其中当nViewType传值为0时,为正常显示模式、传值为1时,为简洁显示模式、传值为2时,为精简显示模式。 </P> & ~+ x) n) x3 C5 J. S$ p6 [. J<>void CMainFrame::ViewMode(int nViewType) ) w$ H4 C9 M& j0 { l{4 p* q, e( P5 m
CRect ClientRect;8 l1 Q0 u7 e5 E5 q3 I
CRect WindowRect;5 ^& g- x: S# e }
CRect ToolbarRect; # m+ y1 t4 U0 M; I7 T CRect StatusbarRect; / T- {# v& }5 ]7 |2 @4 @& ~4 m<FONT color=#009900>; O& J4 @, f( i- c2 _- h% S
//获取窗体、客户区及工具条大小 I) f' j' |6 ^ L. y% r</FONT> WindowRect = m_WindowRect;: d% \) |/ k! h" u3 x! K; G. U8 d; a
ClientRect = m_ClientRect; 1 Z; M$ T' I# ?3 S m_wndToolBar.GetWindowRect(&ToolbarRect);& m- V9 j. ^0 ^! }, }8 v
* P, l: ^8 C- h) j<FONT color=#009900> //获取边框及标题栏大小: g' ~6 Y [: k8 h0 s4 F( o
</FONT> int borderHeight = GetSystemMetrics(SM_CYBORDER); + g- f0 G& }( T* Q' B- s% { int captionHeight = GetSystemMetrics(SM_CYCAPTION);. f# [: O8 u+ q1 e8 i1 [
" n" J+ Z) q" K: K. e6 m. D
<FONT color=#009900> //获取状态条大小</FONT> 4 o2 J0 m: C6 W: \+ g# s( e CStatusBar* pStatus = (CStatusBar*) AfxGetApp()->m_pMainWnd->GetDescendantWindow(AFX_IDW_STATUS_BAR); 5 U- l& ]' l& i4 I pStatus->GetWindowRect(&StatusbarRect);0 L& U0 T9 { o% g3 z3 Y3 F
5 y/ ]; y0 d' H* a) z o4 u9 x% m
<FONT color=#009900> //停靠工具条</FONT> ' _$ s) ` ?: u& y3 w DockControlBar(&m_wndToolBar); * ~7 b6 K* [' W# c: T! B9 g
; w) R6 F1 H* s int CompactCx; <FONT color=#009900> //新窗体宽</FONT> 7 M" ~& k$ S H9 V! @ int CompactCy; <FONT color=#009900> //新窗体高</FONT>% i% g- P9 y5 v d6 X
+ |/ k' \( Y5 D: h, X* @0 t5 ~# r<FONT color=#009900> //以多种模式显示</FONT>+ W8 b- O Y9 l$ Z3 R
switch(nViewType) % z C, h+ g, S+ |" O& b; L$ [ {+ P0 ~, [; b7 s3 }# X
case 0: <FONT color=#009900> //正常显示模式</FONT>* {! b) O) _3 m) `5 `) a4 f
{$ Y; w) k8 v2 d. ?3 U5 o4 |) F' w" V/ O
<FONT color=#009900> //显示菜单</FONT>: Z" d* y% Y! F% P
if ( hMenu != NULL ) 8 s7 G7 Y+ ^5 |( W" R% i ::SetMenu( m_hWnd, hMenu );. v! _5 ^+ \ ]( Q* t
: i) I0 o; V2 U
<FONT color=#009900> //显示状态条</FONT> 2 h3 ~9 F# L4 H# V pStatus->ShowWindow(SW_SHOW);" |3 l5 ]2 F% t/ ^
2 w+ o t% f6 G. [! a0 t
<FONT color=#009900> //新窗体宽、高</FONT>/ U0 a" \2 y6 R, d4 M( {
CompactCx=WindowRect.Width();# D5 S/ W1 \: V9 y' k5 p
CompactCy=WindowRect.Height(); - r7 i+ [: ]& w( h! g/ N. ` }. X" m1 Q2 v* b; @( A2 v1 G" |% v6 [) g
break; ! E# v" q" v8 C7 w3 v/ Y case 1: <FONT color=#009900> //简洁显示模式</FONT> ; y: d5 A% A r; R: d7 _ {' g: [9 t/ [% |! S6 B
<FONT color=#009900> //显示菜单</FONT>6 r& t& O' `: c+ Y4 M. E8 D! g
if ( hMenu != NULL ) 0 `, `. B/ F5 _; s: F" _ ::SetMenu( m_hWnd, hMenu );6 R& o/ d" I0 s( _8 M