数学建模社区-数学中国

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

作者: loveyuan    时间: 2004-4-29 10:43
标题: 程序界面多模式显示的实现
<>如果你用过RealPlayer播放器的话,那就一定对它的多模式显示方式不会陌生吧!RealPlayer拥有正常和精简两种显示模式。我们有时也想在自己的程序界面上实现类似的功能,该怎样实现呢?下面拿我用VC6.0做的一个多模式显示程序示例来向大家展示,它是怎样实现类似功能的</P>% S' |5 ?) o3 M1 A& f+ p
<><B>基本构成思想:</B>
5 s, J* N# i- |( O% G$ C- j实现原理很简单,只要分别获取窗体大小、客户区大小、工具条大小、状态条大小、边框大小以及标题栏大小,既可根据不同显示模式,计算出不同的新窗体的高度(关键在于要重新计算高度,宽度)。如:简洁显示模式(无视图方式下),为宽度不变、高度=窗体高度-客户区高度-状态条高度-边框高度既可。精简显示模式(仅工具条方式下),为宽度不变,先隐藏菜单、高度=标题栏高度+工具条高度+边框高度既可。正常显示模式,我想就不用说了吧!其实就是这么简单,RealPlayer是宽度,高度一起改变并计算,本示例只简单的改变高度,宽度不变,但基本原理是相同的。下面让我们来看看它的代码实现情况吧! </P>
. r9 D% j0 ^6 W6 e8 d, B( h% c( M<><B>关键代码实现:</B>/ A0 V( T) H2 f1 ]) e8 C% d- ]  S
我做了一个涵数,本示例程序只需调用此涵数便可实现。其中当nViewType传值为0时,为正常显示模式、传值为1时,为简洁显示模式、传值为2时,为精简显示模式。 </P>- T2 G( ^0 t3 A3 g6 j
<>void CMainFrame::ViewMode(int nViewType)" }: F0 @# G, i' ?1 ?8 h
{  @/ h) J: c; q7 A0 q% A
        CRect ClientRect;- Z# z! t$ _% s, ]$ j1 z
        CRect WindowRect;7 y% _# @! d6 K; m
        CRect ToolbarRect;
9 p" @! e: H5 i) t        CRect StatusbarRect;
: r* o8 p- l9 U: H" W1 g: `6 V5 ^<FONT color=#009900>
' L! j1 F/ R# r. s        //获取窗体、客户区及工具条大小
# g) Z( ]$ M5 L7 I, y* }: o</FONT>        WindowRect = m_WindowRect;
* G9 G0 I5 @, c) O7 N        ClientRect = m_ClientRect;# P5 ]+ n' V* `& j& G, T6 B3 L
        m_wndToolBar.GetWindowRect(&amp;ToolbarRect);; G  j, O: @. f7 s: c+ W
$ l8 k: c9 z" ~) ?& ?( O
<FONT color=#009900>        //获取边框及标题栏大小
" }- O2 F; m" o: `* L7 K</FONT>        int borderHeight = GetSystemMetrics(SM_CYBORDER);
) i) @( ?1 F" o0 b; k" j        int captionHeight = GetSystemMetrics(SM_CYCAPTION);1 b3 d7 c7 t7 X3 g0 k1 c$ X8 |
  N; R( _: b2 Z' N# E2 T4 [) x. X' `
<FONT color=#009900>        //获取状态条大小</FONT>3 J& G; A+ q5 o" @' T
        CStatusBar* pStatus = (CStatusBar*) AfxGetApp()-&gt;m_pMainWnd-&gt;GetDescendantWindow(AFX_IDW_STATUS_BAR);
) F4 Z7 T+ U# R& ^        pStatus-&gt;GetWindowRect(&amp;StatusbarRect);* @. G( [: M# a
9 U' m  Y* r$ {5 i7 i* f5 Z1 q
<FONT color=#009900>        //停靠工具条</FONT>$ {8 |4 ?  u  w# r# G; U
        DockControlBar(&amp;m_wndToolBar);        8 f* ^0 j+ ~) k
/ a6 G0 I! o& P/ @. ?
        int CompactCx;                        <FONT color=#009900>        //新窗体宽</FONT>
+ |$ Z. }* i- y' S5 B' X* a) |        int CompactCy;                        <FONT color=#009900>        //新窗体高</FONT>+ x0 d; P$ n- L0 y0 T+ [

6 l3 x6 ~$ n/ ^) \. k/ m% p<FONT color=#009900>        //以多种模式显示</FONT>
5 Z8 H! K+ r6 P) q6 W8 J        switch(nViewType)( v' V7 r* c# L6 ?" d- O" j
        {/ }# p6 s, y7 W) D5 p
        case 0:                               <FONT color=#009900>         //正常显示模式</FONT>
5 I- ?5 ~* ]( _  w! T# w  W                {5 c+ I5 z1 r! }4 P$ z9 ]
                <FONT color=#009900>        //显示菜单</FONT>9 Y1 A$ I" m3 G7 p8 o
                        if ( hMenu != NULL )       
8 f' n8 E' ~, `# {/ ~# H                                ::SetMenu( m_hWnd, hMenu );) k' r  ~7 y9 m6 U. B4 [& j
                       
1 ~  V3 v& H, d& P3 K                <FONT color=#009900>        //显示状态条</FONT>8 B) N$ C; V# T  q
                        pStatus-&gt;ShowWindow(SW_SHOW);
& d: r' ]2 c  R. l* k9 d( _
' c7 ]; d* ?7 W& b$ B! K                <FONT color=#009900>        //新窗体宽、高</FONT>7 k3 N2 S. U; m) p4 V6 f7 A+ o+ S
                        CompactCx=WindowRect.Width();; D* d. u+ w. |& q7 b. s9 i( ?8 `$ U
                        CompactCy=WindowRect.Height();
  f" s4 G4 |$ i# v: j  Z, h                }/ j, G+ Z* G2 Y0 g6 f
                break;- G! s- [' q' x; f
        case 1:                                <FONT color=#009900>        //简洁显示模式</FONT>
+ z, L2 ~; V& L$ C/ x7 S                {
  J" J. R/ s' b* h' O                <FONT color=#009900>        //显示菜单</FONT>+ F+ L& ~; Q+ ~" G
                        if ( hMenu != NULL )        . y; A! a5 {: C5 V9 n4 P0 O2 {
                                ::SetMenu( m_hWnd, hMenu );, s9 D7 a+ n" V2 g. `& [: F
                       
6 ~% o$ w: Y8 M& Y3 M1 x8 X                <FONT color=#009900>        //隐藏状态条</FONT>
# l1 E/ k' m" b% E6 P  R( A8 I                        pStatus-&gt;ShowWindow(SW_HIDE);
" Q  k& n  ?8 ]  V' }                        # t/ Y" q' e. e( J3 E$ J: c) W
                <FONT color=#009900>        //新窗体宽、高</FONT>
& n8 y" |9 V$ t% `                        CompactCx=WindowRect.Width();
0 B' w5 b; P+ e2 ?" T& v                        CompactCy=WindowRect.Height() - ClientRect.Height() + ToolbarRect.Height() - borderHeight;- z2 @, z9 z4 X% t& f, C* q& f# _- c
                }5 q% {: {" n, [% a1 B% z
                break;: L0 o* Z( ]- S
        case 2:                                <FONT color=#009900>        //精简显示模式</FONT>
% S/ |8 |. z2 N3 P3 f/ Q/ A# q) M                {
8 y2 T4 `+ O* V6 C/ I1 m: q                <FONT color=#009900>        //隐藏菜单</FONT>& S3 k3 i  O: r" a
                        hMenu = ::GetMenu(m_hWnd);        ) q3 L1 w( Z" l4 ~+ H  ~* \2 J
                                ::SetMenu( m_hWnd, NULL );5 G; |: e! k# D( H: h- g' g
                        + g8 I9 W( I' R; `# S3 V6 ^
                <FONT color=#009900>        //隐藏状态条</FONT>
& Q: `; k& X4 g9 C                        pStatus-&gt;ShowWindow(SW_HIDE);
8 K* G" V: [/ s# w                       
+ e; d" M4 }: v: L. L: D, `                <FONT color=#009900>        //新窗体宽、高</FONT>7 h3 a7 Y4 Q* C& h/ h+ |
                        CompactCx=WindowRect.Width();
9 N7 x2 t8 n' G2 ?+ Z8 y& Y+ b                        CompactCy=captionHeight + ToolbarRect.Height() + borderHeight*2;! m. m7 `+ b; ]5 J
                }
7 C, d% M$ ~8 G, N! ?% q, u                break;1 T1 S1 s4 H" B3 G
        }: b& D* E- [  a* l5 L  Q- ?
; u! d$ M9 i4 G7 T
<FONT color=#009900>        //设置新窗体显示</FONT>
0 y' k8 v1 m2 \; g4 N5 w0 D# b9 n        SetWindowPos( &amp;wndTop, WindowRect.left, WindowRect.top, CompactCx, CompactCy, SWP_SHOWWINDOW);  5 k' e/ [6 F9 |# z

) J! x7 u2 B! z' X: t8 r1 e1 t}
6 m4 z. @+ k/ w# {1 V/ p' G4 a</P>
作者: ilikenba    时间: 2004-4-29 10:59
经典,强烈推荐阅读!




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