数学建模社区-数学中国

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

作者: loveyuan    时间: 2004-4-29 10:43
标题: 程序界面多模式显示的实现
<>如果你用过RealPlayer播放器的话,那就一定对它的多模式显示方式不会陌生吧!RealPlayer拥有正常和精简两种显示模式。我们有时也想在自己的程序界面上实现类似的功能,该怎样实现呢?下面拿我用VC6.0做的一个多模式显示程序示例来向大家展示,它是怎样实现类似功能的</P>
- D0 ?: |% }) J+ h; z, ~+ P! M<><B>基本构成思想:</B>
9 e7 y0 [. C$ e3 U; x: S& C实现原理很简单,只要分别获取窗体大小、客户区大小、工具条大小、状态条大小、边框大小以及标题栏大小,既可根据不同显示模式,计算出不同的新窗体的高度(关键在于要重新计算高度,宽度)。如:简洁显示模式(无视图方式下),为宽度不变、高度=窗体高度-客户区高度-状态条高度-边框高度既可。精简显示模式(仅工具条方式下),为宽度不变,先隐藏菜单、高度=标题栏高度+工具条高度+边框高度既可。正常显示模式,我想就不用说了吧!其实就是这么简单,RealPlayer是宽度,高度一起改变并计算,本示例只简单的改变高度,宽度不变,但基本原理是相同的。下面让我们来看看它的代码实现情况吧! </P>& W2 r# D7 l* f9 ]8 h% a+ q
<><B>关键代码实现:</B>
  @1 L$ I! }  m* f: X9 B; r8 V2 Q我做了一个涵数,本示例程序只需调用此涵数便可实现。其中当nViewType传值为0时,为正常显示模式、传值为1时,为简洁显示模式、传值为2时,为精简显示模式。 </P>
$ _" s% Z1 {# R5 G6 \9 u# V<>void CMainFrame::ViewMode(int nViewType)
, Q: j& d7 \5 s8 _9 Y& M; N{
1 X/ ?& Q- F# `. P        CRect ClientRect;6 u5 J1 M. u" F8 I
        CRect WindowRect;! D/ y5 `" m& V5 x, y
        CRect ToolbarRect;
) d$ @* u$ T4 V( m  Q        CRect StatusbarRect;
7 W* p; o- O& V  E' W2 M<FONT color=#009900>( e6 a0 D. U: L
        //获取窗体、客户区及工具条大小. A4 P6 {) j$ l( a
</FONT>        WindowRect = m_WindowRect;
; j0 R' d, V& ~        ClientRect = m_ClientRect;& |- O! S5 Z/ N% u# L# `* D, G' K' W# }
        m_wndToolBar.GetWindowRect(&amp;ToolbarRect);1 {% u: f% k, B/ }( S: n7 u/ K
; m8 O6 y, f2 c7 {: Y1 p' j
<FONT color=#009900>        //获取边框及标题栏大小& c7 @$ F' K1 M. ]
</FONT>        int borderHeight = GetSystemMetrics(SM_CYBORDER);+ |$ e: }+ H+ V
        int captionHeight = GetSystemMetrics(SM_CYCAPTION);
3 K4 m  |+ G& T' o" P
# d  c0 D: x! t# X& ?<FONT color=#009900>        //获取状态条大小</FONT>
. P. f6 M$ Q1 F9 r6 d+ u3 j3 Q6 G        CStatusBar* pStatus = (CStatusBar*) AfxGetApp()-&gt;m_pMainWnd-&gt;GetDescendantWindow(AFX_IDW_STATUS_BAR);
) W* k" }/ e: T* \& v2 t        pStatus-&gt;GetWindowRect(&amp;StatusbarRect);
& Z( M5 [* D& m+ O  _$ Q5 |5 C, Y& P
<FONT color=#009900>        //停靠工具条</FONT>
$ Q( P# e; x4 b# @: l# h        DockControlBar(&amp;m_wndToolBar);        # J! ~0 N+ R" M3 W8 h! U2 q

1 N* C# @( I4 Q4 }8 C        int CompactCx;                        <FONT color=#009900>        //新窗体宽</FONT>
7 A. w& c% N7 B- r, S6 W) e) w6 l        int CompactCy;                        <FONT color=#009900>        //新窗体高</FONT>2 Z% @. [% w" S- H1 n2 U: L! [

! I2 D6 n  a: U! R<FONT color=#009900>        //以多种模式显示</FONT>
+ G: `3 A$ d1 D+ B- P# ^        switch(nViewType)
8 b5 b! m, c# F5 u        {. U7 V% R* ^* s4 E/ A6 M) ?9 @" P
        case 0:                               <FONT color=#009900>         //正常显示模式</FONT>
$ S. b# u, g( ]                {
! \1 s9 V, a9 e' O+ a6 d  R                <FONT color=#009900>        //显示菜单</FONT>6 n4 D1 e8 m" ^9 X
                        if ( hMenu != NULL )        - D: P% t6 E4 `; V4 T
                                ::SetMenu( m_hWnd, hMenu );7 L/ y. w/ o# c
                       
2 c5 Y7 N3 E) b/ s  e0 D                <FONT color=#009900>        //显示状态条</FONT>
/ ]) u$ {' u5 Y                        pStatus-&gt;ShowWindow(SW_SHOW);
9 ^: z8 P  p4 y% G, C% C) k
( _# Y9 Z, }' U                <FONT color=#009900>        //新窗体宽、高</FONT>% ^# i! C  Q4 J+ C- Q  o3 `
                        CompactCx=WindowRect.Width();- ~; g0 x" R, R; B
                        CompactCy=WindowRect.Height();
% T- M( v2 g8 ^. }" M7 ?                }$ @- a; S# V1 a' x4 m; b8 H9 \% E
                break;) A1 D1 V: O- C: z
        case 1:                                <FONT color=#009900>        //简洁显示模式</FONT>+ c' U6 R. J0 L
                {
# |* B. c- @' q8 c                <FONT color=#009900>        //显示菜单</FONT>
! H/ d: r, r! P! y2 Z0 ~                        if ( hMenu != NULL )       
: g* Z$ v5 Y/ b' f3 H: ~; Y, F                                ::SetMenu( m_hWnd, hMenu );9 T% b- Z8 C& @1 k
                        * a2 o8 B3 S/ n- f
                <FONT color=#009900>        //隐藏状态条</FONT>
6 Y& `7 g0 Y) f9 ~                        pStatus-&gt;ShowWindow(SW_HIDE);
; K8 V8 g' Y) X9 F  [3 P/ `0 p                       
5 i2 c" G+ \. _' z                <FONT color=#009900>        //新窗体宽、高</FONT>
: [. _9 M5 f  J4 \7 [4 c3 r7 e& |                        CompactCx=WindowRect.Width();6 G# s7 u+ B% t3 }5 ~. z1 ?; p$ B
                        CompactCy=WindowRect.Height() - ClientRect.Height() + ToolbarRect.Height() - borderHeight;
- [+ O0 Y. Q. {7 ]- E6 B                }
1 p  ~, I4 u& N                break;
$ R9 o; n, b' ~9 m' y9 s        case 2:                                <FONT color=#009900>        //精简显示模式</FONT>
& V7 ^) `9 P4 w                {0 A1 W/ D6 Y0 d, |6 _" p
                <FONT color=#009900>        //隐藏菜单</FONT>
7 U( h( Z" ?. F- k7 h+ F1 N+ t                        hMenu = ::GetMenu(m_hWnd);       
) H2 z! c1 _9 E1 s                                ::SetMenu( m_hWnd, NULL );
1 n* d% {- B+ y! y- Q                        8 v* S" _* N6 ]1 W! ~- H( k5 V% {
                <FONT color=#009900>        //隐藏状态条</FONT>
) e! K2 L8 T* y% Z: m                        pStatus-&gt;ShowWindow(SW_HIDE);
; L# S7 P- E8 D2 i! ~! m/ a                       
9 ?' s+ E' x; u7 n                <FONT color=#009900>        //新窗体宽、高</FONT>
5 A0 A' s0 l: f9 N* {; _                        CompactCx=WindowRect.Width();
% N, b& h2 |3 S  b                        CompactCy=captionHeight + ToolbarRect.Height() + borderHeight*2;
0 \2 b" x( D# c, Q) W) A+ ^. z                }' M2 A( ~+ t6 |3 y9 Y1 j* |% z
                break;
+ d9 a; S; h* }! G& v        }
  @8 G% I: Q' K& i
: {8 |' z2 G/ w7 k- K<FONT color=#009900>        //设置新窗体显示</FONT>
) q" G9 F* J6 o# j: Y        SetWindowPos( &amp;wndTop, WindowRect.left, WindowRect.top, CompactCx, CompactCy, SWP_SHOWWINDOW);  4 z' ?5 l0 w4 `% Z/ q
2 B, I8 J- z: ~: Q0 s1 Q  E
}  ~/ e% i6 L1 O$ c0 E& t8 }
</P>
作者: ilikenba    时间: 2004-4-29 10:59
经典,强烈推荐阅读!




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