QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3223|回复: 1
打印 上一主题 下一主题

程序界面多模式显示的实现

[复制链接]
字体大小: 正常 放大
loveyuan        

21

主题

2

听众

104

积分

该用户从未签到

国际赛参赛者

元老勋章

跳转到指定楼层
1#
发表于 2004-4-29 10:43 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>如果你用过RealPlayer播放器的话,那就一定对它的多模式显示方式不会陌生吧!RealPlayer拥有正常和精简两种显示模式。我们有时也想在自己的程序界面上实现类似的功能,该怎样实现呢?下面拿我用VC6.0做的一个多模式显示程序示例来向大家展示,它是怎样实现类似功能的</P>4 Q0 ~. {) g7 i: C8 @1 S" ?: N0 h
<><B>基本构成思想:</B>0 c5 ], V9 R/ U/ d+ e$ r1 p( n# u: H  T
实现原理很简单,只要分别获取窗体大小、客户区大小、工具条大小、状态条大小、边框大小以及标题栏大小,既可根据不同显示模式,计算出不同的新窗体的高度(关键在于要重新计算高度,宽度)。如:简洁显示模式(无视图方式下),为宽度不变、高度=窗体高度-客户区高度-状态条高度-边框高度既可。精简显示模式(仅工具条方式下),为宽度不变,先隐藏菜单、高度=标题栏高度+工具条高度+边框高度既可。正常显示模式,我想就不用说了吧!其实就是这么简单,RealPlayer是宽度,高度一起改变并计算,本示例只简单的改变高度,宽度不变,但基本原理是相同的。下面让我们来看看它的代码实现情况吧! </P>! e: N5 q4 ]- u* h  x3 @) J
<><B>关键代码实现:</B>) Y" W* g+ Y$ J$ u, F  W6 `
我做了一个涵数,本示例程序只需调用此涵数便可实现。其中当nViewType传值为0时,为正常显示模式、传值为1时,为简洁显示模式、传值为2时,为精简显示模式。 </P>% i& p  M. I* `. b
<>void CMainFrame::ViewMode(int nViewType)
# W4 V% {* p% d1 ]{
1 j8 x9 n, @( r; ~6 d" _# N        CRect ClientRect;
3 v+ n% |) t% \9 M0 J        CRect WindowRect;
" n- [+ ^! k  H, F( f0 h        CRect ToolbarRect;
  p0 D- Q1 G' ]        CRect StatusbarRect;4 C$ c' f& s- B- w8 N0 P. x
<FONT color=#009900>
! B. @* t3 d/ r; ~7 S; j        //获取窗体、客户区及工具条大小8 G) I1 ?% F! Y0 ~0 {7 A" ]
</FONT>        WindowRect = m_WindowRect;, o' O4 j# F- U5 M9 L
        ClientRect = m_ClientRect;
% f& E! c9 A9 i3 a& O5 |) [        m_wndToolBar.GetWindowRect(&amp;ToolbarRect);
7 f' j) X. y8 |% k* b3 U# B- N& A- I) ~
<FONT color=#009900>        //获取边框及标题栏大小; E/ O! j  k) u
</FONT>        int borderHeight = GetSystemMetrics(SM_CYBORDER);
% }9 H5 W1 t* I# k        int captionHeight = GetSystemMetrics(SM_CYCAPTION);# _# t: e" n' i8 e+ t& r- \
/ g2 F# q1 L; t& o7 D, @, w
<FONT color=#009900>        //获取状态条大小</FONT>
2 |+ ]  Z* k8 m; Z: u  B$ s        CStatusBar* pStatus = (CStatusBar*) AfxGetApp()-&gt;m_pMainWnd-&gt;GetDescendantWindow(AFX_IDW_STATUS_BAR);
7 y- _4 m" _7 E# \3 V$ r9 [! q# |        pStatus-&gt;GetWindowRect(&amp;StatusbarRect);# E/ `' h( {1 W  B; |- d" F7 |" u

9 |" e4 z+ L5 T5 m) Q  r3 Z<FONT color=#009900>        //停靠工具条</FONT>
, n) y5 `5 O! m7 y7 f0 u9 B( E9 ^& a        DockControlBar(&amp;m_wndToolBar);       
3 a1 s- h/ L( r1 f( W  b! w2 _  C! ^( _- Q
        int CompactCx;                        <FONT color=#009900>        //新窗体宽</FONT>
$ k7 r+ C! s) U: Q0 P1 m  r4 D        int CompactCy;                        <FONT color=#009900>        //新窗体高</FONT>
' G9 M  g, v2 e& @( {# d! Y% n, }2 k: l5 D
<FONT color=#009900>        //以多种模式显示</FONT>
  V0 h! c0 A, g3 d: S  Z' T7 g        switch(nViewType), q2 x! b' d+ q5 ~5 s. O/ H3 ?; ~
        {# o. Q* S7 M" @
        case 0:                               <FONT color=#009900>         //正常显示模式</FONT>" p7 B; u: \! k5 H) s
                {- K* a0 S8 d4 ~$ t2 }0 Q1 U
                <FONT color=#009900>        //显示菜单</FONT>/ t( C( j. g7 K" N* X  x% B
                        if ( hMenu != NULL )       
' |# N; P7 W* a' O( `                                ::SetMenu( m_hWnd, hMenu );9 [3 g/ E$ D& L. ~
                       
& U! _) G5 O* f) t                <FONT color=#009900>        //显示状态条</FONT>
- C( H$ T+ b6 G$ Q+ H, {                        pStatus-&gt;ShowWindow(SW_SHOW);6 P. a0 A) z- V. o, r
( e  u3 K, j. U- P) b
                <FONT color=#009900>        //新窗体宽、高</FONT>
6 Z' X4 {) `1 {2 `" e                        CompactCx=WindowRect.Width();3 e; {) q/ Q# O6 p& f2 s
                        CompactCy=WindowRect.Height();4 z7 y: z8 x5 X; Q5 d
                }3 G, s$ y6 V  i+ N5 y$ e
                break;
1 Y1 B2 T6 J8 @" W4 n& L# q        case 1:                                <FONT color=#009900>        //简洁显示模式</FONT>) o8 W2 g2 D# i! R& a
                {
7 o2 e: W1 v3 p0 G0 p; A                <FONT color=#009900>        //显示菜单</FONT>
( b6 w$ d% t: e1 L; w+ U) n                        if ( hMenu != NULL )        5 C' ^( d' F+ W% t
                                ::SetMenu( m_hWnd, hMenu );3 ]$ s, Z" g& N, ^
                        " f0 ~, L! t% \" T2 v. Y: C+ x& y
                <FONT color=#009900>        //隐藏状态条</FONT>
9 H$ D5 n" \: }( W4 ^                        pStatus-&gt;ShowWindow(SW_HIDE);9 y" \0 h# \1 t. J- [' `
                       
, u5 T+ N1 y: ?! ]0 @8 u# N                <FONT color=#009900>        //新窗体宽、高</FONT>
) k# w; r3 U8 _; e2 }7 z; v3 C+ ^                        CompactCx=WindowRect.Width();
3 m$ U4 @% C# A2 V1 R                        CompactCy=WindowRect.Height() - ClientRect.Height() + ToolbarRect.Height() - borderHeight;
. f8 U% [$ o- m. E                }
3 w$ {. P8 Y, u: v                break;
2 U/ X2 n# G4 @  N        case 2:                                <FONT color=#009900>        //精简显示模式</FONT>
5 r1 V' _1 V8 n2 n: X                {& L. p9 [1 q: X6 G
                <FONT color=#009900>        //隐藏菜单</FONT>4 d) f" ]/ D* x( E7 G# n
                        hMenu = ::GetMenu(m_hWnd);        1 J* G7 X2 g7 ~8 h7 h2 m$ C5 ?
                                ::SetMenu( m_hWnd, NULL );
' j$ ~3 k( w2 f  \" e; ]3 m                       
" c3 \0 m# g, t' l- k7 z0 t5 X+ w                <FONT color=#009900>        //隐藏状态条</FONT>1 P2 K% d) N8 q. p3 i
                        pStatus-&gt;ShowWindow(SW_HIDE);
5 y6 f: N, o! l. F: J0 f! P2 j                       
4 K1 f# f& E0 R- ^' Y7 l                <FONT color=#009900>        //新窗体宽、高</FONT>
% m, p; a  U# u- o; B8 b                        CompactCx=WindowRect.Width();& J# y+ G( r- ^7 x5 @9 h
                        CompactCy=captionHeight + ToolbarRect.Height() + borderHeight*2;  f" b$ z! e+ u) H  T
                }0 A- T+ n. b% |( P# l, H: L
                break;
, I+ f% d4 h' c0 u) c! s8 z        }% r/ I; H( {1 B

' g8 [  y+ K( g! ]3 S! z<FONT color=#009900>        //设置新窗体显示</FONT>8 m, x* L; R; e! \. i9 |
        SetWindowPos( &amp;wndTop, WindowRect.left, WindowRect.top, CompactCx, CompactCy, SWP_SHOWWINDOW);  
& V, f( W$ y/ _: g, i, R  L2 N2 p* ]0 N9 B/ w
}" e2 X( N* F$ _7 j9 v* _# R
</P>
zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
May God grant me the wisdom to discover the right and strength to make it endure 因为陌生,所以勇敢,因为距离,所以美丽。
ilikenba 实名认证       

1万

主题

49

听众

2万

积分

  • TA的每日心情
    奋斗
    2024-6-23 05:14
  • 签到天数: 1043 天

    [LV.10]以坛为家III

    社区QQ达人 新人进步奖 优秀斑竹奖 发帖功臣

    群组万里江山

    群组sas讨论小组

    群组长盛证券理财有限公司

    群组C 语言讨论组

    群组Matlab讨论组

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-4-20 13:31 , Processed in 0.430695 second(s), 58 queries .

    回顶部