数学建模社区-数学中国

标题: 程序界面多模式显示的实现 [打印本页]

作者: loveyuan    时间: 2004-4-29 10:43
标题: 程序界面多模式显示的实现
<>如果你用过RealPlayer播放器的话,那就一定对它的多模式显示方式不会陌生吧!RealPlayer拥有正常和精简两种显示模式。我们有时也想在自己的程序界面上实现类似的功能,该怎样实现呢?下面拿我用VC6.0做的一个多模式显示程序示例来向大家展示,它是怎样实现类似功能的</P>
5 s2 {( i: B" _9 G& b<><B>基本构成思想:</B>! z1 D3 ?1 I3 v% ^- b( v0 G5 w
实现原理很简单,只要分别获取窗体大小、客户区大小、工具条大小、状态条大小、边框大小以及标题栏大小,既可根据不同显示模式,计算出不同的新窗体的高度(关键在于要重新计算高度,宽度)。如:简洁显示模式(无视图方式下),为宽度不变、高度=窗体高度-客户区高度-状态条高度-边框高度既可。精简显示模式(仅工具条方式下),为宽度不变,先隐藏菜单、高度=标题栏高度+工具条高度+边框高度既可。正常显示模式,我想就不用说了吧!其实就是这么简单,RealPlayer是宽度,高度一起改变并计算,本示例只简单的改变高度,宽度不变,但基本原理是相同的。下面让我们来看看它的代码实现情况吧! </P>* e. {% E4 Z3 D- a( l$ f
<><B>关键代码实现:</B>
. w' }+ `3 D# i! H1 [我做了一个涵数,本示例程序只需调用此涵数便可实现。其中当nViewType传值为0时,为正常显示模式、传值为1时,为简洁显示模式、传值为2时,为精简显示模式。 </P>
& y  u8 e) t5 U: B, b<>void CMainFrame::ViewMode(int nViewType)& T5 N0 f1 ^' c' e# E0 K
{
1 u! N: e! j. ^( G- A3 J# O        CRect ClientRect;
/ i' Y, I* b" J+ `2 e        CRect WindowRect;
4 t5 E- h( p  D        CRect ToolbarRect;
1 F3 `* w" s2 r& G5 V# y. J  i& G        CRect StatusbarRect;
( M8 ?% N5 _" N4 ?& t* Z<FONT color=#009900>
. W4 ]0 ^. ?6 q9 `        //获取窗体、客户区及工具条大小
+ b2 Z/ _0 i9 x2 l5 n</FONT>        WindowRect = m_WindowRect;
( B5 F$ [$ a+ o, m- Q0 M        ClientRect = m_ClientRect;
/ E8 t) a! {) U$ T3 q4 p        m_wndToolBar.GetWindowRect(&amp;ToolbarRect);7 U+ y. E# c' V$ O% `# M6 E
5 F" S9 r! _( U& x4 _3 f* q
<FONT color=#009900>        //获取边框及标题栏大小
  ~6 z! u# r) y3 u; [</FONT>        int borderHeight = GetSystemMetrics(SM_CYBORDER);: e+ k  {! z9 N0 E* v8 W
        int captionHeight = GetSystemMetrics(SM_CYCAPTION);
( p- X, G! T: A8 y" L) {3 a
2 d8 E3 X4 M/ C$ p; E* {2 l5 R<FONT color=#009900>        //获取状态条大小</FONT>
+ E3 @0 I8 S' J8 K( c" o        CStatusBar* pStatus = (CStatusBar*) AfxGetApp()-&gt;m_pMainWnd-&gt;GetDescendantWindow(AFX_IDW_STATUS_BAR);
: C; n- Z, U' f        pStatus-&gt;GetWindowRect(&amp;StatusbarRect);
% C' O% E$ ?0 i( S' {  y6 O
( M, g2 y. W: a' i  l<FONT color=#009900>        //停靠工具条</FONT>  b4 @/ n' @; U# k2 k/ T
        DockControlBar(&amp;m_wndToolBar);       
! ?" U; Z+ |8 Y# @8 t; b" o) T6 |2 p1 ^/ E
        int CompactCx;                        <FONT color=#009900>        //新窗体宽</FONT>
* v3 q( c- A. d9 _        int CompactCy;                        <FONT color=#009900>        //新窗体高</FONT>: J/ m# {5 J0 j3 q: \
! ~4 \  |& M: }! V7 u
<FONT color=#009900>        //以多种模式显示</FONT>, c% ~- g3 F3 ?
        switch(nViewType)
+ z$ x, _1 Q# n& Z7 D+ H6 B        {7 M/ D0 D$ i5 O: s
        case 0:                               <FONT color=#009900>         //正常显示模式</FONT>
7 \3 Q3 K6 X# u                {( z) D6 N9 K5 R; P' |' ?, ]' a
                <FONT color=#009900>        //显示菜单</FONT>
% z) w% j; i- }) t- i/ z, Z" F                        if ( hMenu != NULL )       
2 B. D" \; s/ H$ _# o; M' D                                ::SetMenu( m_hWnd, hMenu );
) E* N& C9 p0 p+ j9 f: K/ I- ?) J                       
: k0 _) F2 H; L# i1 y1 K- K                <FONT color=#009900>        //显示状态条</FONT>
/ F1 M( c& _- M7 X/ K                        pStatus-&gt;ShowWindow(SW_SHOW);
3 [# N, e, c$ a6 x* z: @/ J; T5 B  G, d! e" L- _
                <FONT color=#009900>        //新窗体宽、高</FONT>
2 s5 K7 i( ^4 [* ~- s2 N6 O                        CompactCx=WindowRect.Width();/ D: S" x7 V8 I2 k3 `( k, @, }
                        CompactCy=WindowRect.Height();  e. K8 R# w: o. N! J
                }6 _2 N  H) \7 z. d  w+ d8 }: }! e# p
                break;
$ G# K& J& I/ \1 u' ~2 [        case 1:                                <FONT color=#009900>        //简洁显示模式</FONT>. C8 u! L  A0 {
                {: M7 G4 L/ d- [1 m. ~7 ]
                <FONT color=#009900>        //显示菜单</FONT>" m) d, b* |9 N  B
                        if ( hMenu != NULL )        2 A# U9 \. J7 b! L- h3 Q9 r
                                ::SetMenu( m_hWnd, hMenu );
$ n0 X+ Q. w! Z9 c1 J                       
& N3 ^/ L0 T3 N5 {2 w; }) s                <FONT color=#009900>        //隐藏状态条</FONT>
4 r& E0 K! m; j# e                        pStatus-&gt;ShowWindow(SW_HIDE);' v$ p* x! f$ H2 l2 i5 ]
                        2 v. e9 ~1 C7 r( D& {% D* o5 j
                <FONT color=#009900>        //新窗体宽、高</FONT>+ Z6 Z; h( x' u1 c0 {
                        CompactCx=WindowRect.Width();4 y. @8 G" Q' K& B
                        CompactCy=WindowRect.Height() - ClientRect.Height() + ToolbarRect.Height() - borderHeight;0 V2 m7 H8 P+ X0 T" C6 m' @
                }2 j. W! K9 @/ d- l5 T% {
                break;' a* o, K! S, n6 }
        case 2:                                <FONT color=#009900>        //精简显示模式</FONT>" J0 E% H4 Q8 d! C' j$ P
                {
& \3 Y8 g4 X& P                <FONT color=#009900>        //隐藏菜单</FONT>
1 {4 w. Y% l. `5 W+ |9 s, J1 E! h2 G3 w                        hMenu = ::GetMenu(m_hWnd);       
3 S/ N7 ^1 V( P* S3 U: D* c                                ::SetMenu( m_hWnd, NULL );) f  V3 Z+ t3 U
                        , {: J& \( f+ r  s) g, F4 r
                <FONT color=#009900>        //隐藏状态条</FONT>
! ~: H+ ^6 G; v- V! ~                        pStatus-&gt;ShowWindow(SW_HIDE);0 I6 ?. N; V" Q; y
                       
5 W7 i" G( L! F$ ~" A/ H                <FONT color=#009900>        //新窗体宽、高</FONT>+ E, Q  Z; K6 w& Q, q8 a
                        CompactCx=WindowRect.Width();
) c4 \- }2 o8 i# j1 F. ?                        CompactCy=captionHeight + ToolbarRect.Height() + borderHeight*2;
/ N. U% T; Y$ ~8 J+ F  U' [                }9 x  b6 b; ]7 ~8 N+ n
                break;+ H7 I' M2 N7 \$ w4 l
        }) B2 m" x/ T( I7 B! @( h% h9 H
& Z/ V4 A! E" \  a7 a! j
<FONT color=#009900>        //设置新窗体显示</FONT>% P; b3 J" Y1 N8 _
        SetWindowPos( &amp;wndTop, WindowRect.left, WindowRect.top, CompactCx, CompactCy, SWP_SHOWWINDOW);  
+ v( t' M+ a" A% H6 A2 S/ O# c7 _& l# M! g5 P4 \/ g
}5 ^1 ~' m& f9 r( @9 M  s
</P>
作者: ilikenba    时间: 2004-4-29 10:59
经典,强烈推荐阅读!




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5