数学建模社区-数学中国

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

作者: loveyuan    时间: 2004-4-29 10:43
标题: 程序界面多模式显示的实现
<>如果你用过RealPlayer播放器的话,那就一定对它的多模式显示方式不会陌生吧!RealPlayer拥有正常和精简两种显示模式。我们有时也想在自己的程序界面上实现类似的功能,该怎样实现呢?下面拿我用VC6.0做的一个多模式显示程序示例来向大家展示,它是怎样实现类似功能的</P>
% c# U" l2 u3 V; _5 O<><B>基本构成思想:</B>' N- l5 Q$ d1 @' D- i0 A) r
实现原理很简单,只要分别获取窗体大小、客户区大小、工具条大小、状态条大小、边框大小以及标题栏大小,既可根据不同显示模式,计算出不同的新窗体的高度(关键在于要重新计算高度,宽度)。如:简洁显示模式(无视图方式下),为宽度不变、高度=窗体高度-客户区高度-状态条高度-边框高度既可。精简显示模式(仅工具条方式下),为宽度不变,先隐藏菜单、高度=标题栏高度+工具条高度+边框高度既可。正常显示模式,我想就不用说了吧!其实就是这么简单,RealPlayer是宽度,高度一起改变并计算,本示例只简单的改变高度,宽度不变,但基本原理是相同的。下面让我们来看看它的代码实现情况吧! </P># c$ c. g' v1 E: ^& g5 k
<><B>关键代码实现:</B>
! {  N9 O7 E" a# q8 Q8 Q我做了一个涵数,本示例程序只需调用此涵数便可实现。其中当nViewType传值为0时,为正常显示模式、传值为1时,为简洁显示模式、传值为2时,为精简显示模式。 </P>
5 ^, c8 d6 c- I8 k2 t<>void CMainFrame::ViewMode(int nViewType)+ l. Y+ t6 B% X! }2 o& S$ x& l, h4 l
{
2 H1 `7 g2 S5 }1 Z# i6 S        CRect ClientRect;0 m" p& E- m  e( @4 V: S) d! O
        CRect WindowRect;9 B2 W+ Q- O7 j4 L& s7 y
        CRect ToolbarRect;
- T1 ?: x) P2 x. K        CRect StatusbarRect;
/ S# h1 j  O5 R9 b4 S& T" [<FONT color=#009900>  ], D0 n+ |3 j# @$ K- F# s
        //获取窗体、客户区及工具条大小$ ~' u9 d, o! A9 c4 y9 c6 Y, S
</FONT>        WindowRect = m_WindowRect;* p! L8 G2 B5 }. G, ~2 @
        ClientRect = m_ClientRect;
# D4 v$ N' ~9 f+ u! U4 }9 O4 C        m_wndToolBar.GetWindowRect(&amp;ToolbarRect);
- L( G! d1 n# _: ]/ R. g, j( Y% @. ~& B
<FONT color=#009900>        //获取边框及标题栏大小4 k2 Q2 F0 ?  L9 F9 r2 n
</FONT>        int borderHeight = GetSystemMetrics(SM_CYBORDER);! u5 a7 H3 o( [
        int captionHeight = GetSystemMetrics(SM_CYCAPTION);0 ?% `4 [6 F, u; V! S1 z! k9 d

- q, m& [  C* Z5 d3 Z<FONT color=#009900>        //获取状态条大小</FONT>' o% B- H5 ^: {. s- v( T
        CStatusBar* pStatus = (CStatusBar*) AfxGetApp()-&gt;m_pMainWnd-&gt;GetDescendantWindow(AFX_IDW_STATUS_BAR);6 C* R( X; H$ f/ d5 i
        pStatus-&gt;GetWindowRect(&amp;StatusbarRect);
3 Q, L& o, C* X- W
8 |; g; g+ @% D) j$ p! r<FONT color=#009900>        //停靠工具条</FONT>9 j, B- Y  R* _; M$ q
        DockControlBar(&amp;m_wndToolBar);        ! `5 k/ u2 S7 m' [. y
$ }6 ?0 p& Z# j* x4 N6 d2 R
        int CompactCx;                        <FONT color=#009900>        //新窗体宽</FONT>
% q0 \+ }8 C$ J0 P) {        int CompactCy;                        <FONT color=#009900>        //新窗体高</FONT>
% B* ?, n. Y7 H! r. i3 O4 _1 Z0 Z% w
1 e" W$ I4 d- g1 i' J& t& O3 I<FONT color=#009900>        //以多种模式显示</FONT>3 W& h3 x. ?) q' I2 C' C+ x
        switch(nViewType)
6 U5 O! o2 n+ A9 D# e2 T        {. R/ t% f( V% V% [+ I! h& c8 f" X
        case 0:                               <FONT color=#009900>         //正常显示模式</FONT>5 c4 `3 `! J0 z
                {
4 u5 p; u& e- I3 z) n                <FONT color=#009900>        //显示菜单</FONT>
- R( ]9 b: h2 f( j                        if ( hMenu != NULL )        ) S& G: U/ a. B) _8 C. i; t
                                ::SetMenu( m_hWnd, hMenu );0 X9 m( f3 ~& m- u/ j
                       
9 @; S4 y) V, C) {                <FONT color=#009900>        //显示状态条</FONT>% Q. t5 C& s1 T* q; I# ^( o
                        pStatus-&gt;ShowWindow(SW_SHOW);/ Z$ m$ W$ E5 \  z0 B6 b
/ ^9 v. ~/ `- O
                <FONT color=#009900>        //新窗体宽、高</FONT>* @$ m6 z+ J" q
                        CompactCx=WindowRect.Width();
: o0 G/ P. ~5 ~9 o, ]6 p/ `5 O" |                        CompactCy=WindowRect.Height();/ z: A9 d  c/ @2 X6 [
                }
/ k0 Z1 K" G( s2 Q% D& I' d                break;6 U8 N" C7 Q1 w7 O: z6 o" O4 q
        case 1:                                <FONT color=#009900>        //简洁显示模式</FONT>. j( B8 ]( A0 j
                {( k3 r6 _7 a$ [2 _; P) |' p3 u1 v
                <FONT color=#009900>        //显示菜单</FONT>" d1 Y3 t5 A0 M2 ~
                        if ( hMenu != NULL )          m  Z7 m, T2 r$ }
                                ::SetMenu( m_hWnd, hMenu );
8 {7 x1 V  t) D. _4 a! G                       
3 V3 o2 r; h. d' W/ H! K                <FONT color=#009900>        //隐藏状态条</FONT>+ h" Y8 _% h1 o1 G; J1 i4 R4 x
                        pStatus-&gt;ShowWindow(SW_HIDE);
9 f( J# p; }- S- |( z0 ]( W                        - _. g( G$ L4 F0 |7 G
                <FONT color=#009900>        //新窗体宽、高</FONT>
4 c' Q6 D! m! y: g6 r0 H                        CompactCx=WindowRect.Width();
+ R0 M  n! K1 J6 q& e+ m. @                        CompactCy=WindowRect.Height() - ClientRect.Height() + ToolbarRect.Height() - borderHeight;
/ U- F2 ^$ L3 L8 v6 G9 q" ~, a                }
( g# N% K* b" c! [- }1 o! r/ G, ^* Z                break;  u* E& k, \+ a
        case 2:                                <FONT color=#009900>        //精简显示模式</FONT>
8 \. j/ K! [" k" Q2 C4 q9 }                {6 z- B4 \8 G8 E( s" r
                <FONT color=#009900>        //隐藏菜单</FONT>0 g9 F/ K: ?) {5 X7 j, X
                        hMenu = ::GetMenu(m_hWnd);        5 S: [) I6 T8 U: M2 ?" Z
                                ::SetMenu( m_hWnd, NULL );
2 j0 ]: l$ @1 }/ i3 N/ c                       
- A! X, T% y% V. l                <FONT color=#009900>        //隐藏状态条</FONT>5 k+ j; q2 X1 m
                        pStatus-&gt;ShowWindow(SW_HIDE);
8 i8 a* D7 O6 u: Q3 N                       
* ~9 l  k0 d0 I" G2 e6 `                <FONT color=#009900>        //新窗体宽、高</FONT>" V; ~8 ?9 o$ v+ r" R# B, ~$ k
                        CompactCx=WindowRect.Width();  d# U; ^! X/ X# ?  W
                        CompactCy=captionHeight + ToolbarRect.Height() + borderHeight*2;
4 m# j# j. a7 J. e7 H                }
* k' ?0 m) J( }2 c                break;) q5 C* ^/ y& y7 W% _
        }8 B, P1 C. |3 S: U

5 ~4 Y$ ^  @( g. {<FONT color=#009900>        //设置新窗体显示</FONT>
" z/ Q( Z: a! [2 u3 E        SetWindowPos( &amp;wndTop, WindowRect.left, WindowRect.top, CompactCx, CompactCy, SWP_SHOWWINDOW);  8 ~  b& h: q, L7 c* A! t( x  B
5 W' N2 S+ E; a9 |" t
}
6 z  r, V% ^2 x, f</P>
作者: ilikenba    时间: 2004-4-29 10:59
经典,强烈推荐阅读!




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