- 在线时间
- 0 小时
- 最后登录
- 2004-7-1
- 注册时间
- 2004-4-27
- 听众数
- 2
- 收听数
- 0
- 能力
- 0 分
- 体力
- 487 点
- 威望
- 0 点
- 阅读权限
- 150
- 积分
- 104
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 24
- 主题
- 21
- 精华
- 0
- 分享
- 0
- 好友
- 0
该用户从未签到
国际赛参赛者
 |
全屏显示是一些应用软件程序必不可少的功能。比如在用VC++编辑工程源文件或7 J) a: H! n* ?; G. [0 h! }3 W
编辑对话框等资源时,选择菜单“View\Full Screen”,即可进入全屏显示状态,按“, w5 [) C9 z4 N: r" ~6 t4 V0 F& h. G# O
Esc”键后会退出全屏显示状态。- [) d: ` F. I* X' \) C$ ~! i5 B v
在VC++6.0中我们用AppWizard按默认方式生成单文档界面的应用程序框架。下面) a& H3 r. j0 g; B- s
将先讨论点击菜单项“View\Full Screen”实现全屏显示的方法,再讲述按“Esc”键后8 Q, c% v" p5 \1 d$ ~% a
如何退出全屏显示状态。 V9 u0 S/ h4 R
1) 在CMainFrame类中,增加如下三个成员变量。" g. s" _1 |# V/ ]/ D! M- [' @' p
class CMainFrame : public CFrameWnd) @" f' a/ ~+ h4 o/ W, }" V9 X
{ private: //自己添加的三个成员变量
$ M8 U& e9 u, i) d4 ?% b) d' A; x WINDOWPLACEMENT m_OldWndPlacement; //用来保存原窗口位置
: f% i$ z; U& L/* typedef struct tagWINDOWPLACEMENT { /* wndpl *// {; z2 Z. V$ Q
UINT length;
: b) K( H0 t/ m UINT flags;
4 d2 B6 W6 t; T UINT showCmd;8 x0 F M# q0 ]# C: k, l
POINT ptMinPosition;! z/ }' X6 F2 N) W' Y" Q; @
POINT ptMaxPosition;6 O. _( b' Q$ |0 ?. w
RECT rcNormalPosition;
2 _2 I" z* M; ^" w3 { } WINDOWPLACEMENT;& o* R1 G8 ^' L l1 B" w
*/) N8 \1 u5 r- I& k
BOOL m_bFullScreen; //全屏显示标志
; k: D( V4 J/ V$ v CRect m_FullScreenRect; //表示全屏显示时的窗口位置5 ]. ~# U5 s$ S7 L: b! W) ]) o
protected: CMainFrame();
; v ]( Y+ v0 J. z* R3 x DECLARE_DYNCREATE(CMainFrame)}+ G+ A7 B# q8 x) ~
2)在资源编辑器中编辑菜单IDR_MAINFRAME。在“View”菜单栏下添加菜单项“Fu
4 ^) p8 M! _$ L. q7 O* h, g5 i; Hll Screen”。在其属性框中,ID设置为ID_FULL_SCREEN,Caption为“Full Screen”。/ X# A7 m- d$ w8 f* W
还可以在工具栏中添加新的工具图标,并使之与菜单项“Full Screen”相关联,即将其
" @, Y U7 j M* N% I3 H1 uID值也设置为ID_FULL_SCREEN。6 [( |8 W6 g+ p# Y f
3)设计全屏显示处理函数,在CMainFrame类增加上述菜单项ID_FULL_SCREEN消息的
' }- X# h; X p- N3 L9 w* [8 K响应函数。响应函数如下:
8 V7 _* R! o/ I8 v" k9 \ O void CMainFrame::OnFullScreen()
, e3 G% @ b o+ b: [* M$ P& b {GetWindowPlacement(&m_OldWndPlacement);1 X# {* ~# t" U) ^9 g
CRect WindowRect;' B \" B- T0 w. U4 L! B
GetWindowRect(&WindowRect);
7 } I' O7 I, `, x. z8 t CRect ClientRect;
0 x. I5 d4 D/ ]$ _. j RepositionBars(0, 0xffff, AFX_IDW_PANE_FIRST, reposQuery, &ClientRect);
3 l0 n9 L# I# a
! F$ v+ e. Y, a1 d6 ]4 F Y ClientToScreen(&ClientRect);
' I; O, [( z( M // 获取屏幕的分辨率
. u, U1 n+ G* t; d9 J% Y4 l int nFullWidth=GetSystemMetrics(SM_CXSCREEN);
& ?( v6 ^# n0 ~& p/ W1 I int nFullHeight=GetSystemMetrics(SM_CYSCREEN);5 f$ h8 P9 t8 u0 S: L8 G: u
// 将除控制条外的客户区全屏显示到从(0,0)到(nFullWidth, nFullHeight)区域
8 j+ n* c3 k! p/ |6 j/ S1 Y, 将(0,0)和(nFullWidth, nFullHeight)两个点外扩充原窗口和除控制条之外的 客户区
0 c, B& V3 }* o H位置间的差值, 就得到全屏显示的窗口位置
$ | x- n F% H: |8 K m_FullScreenRect.left=WindowRect.left-ClientRect.left;
" \' c! S* t2 \$ G: L# _% Z R m_FullScreenRect.top=WindowRect.top-ClientRect.top;
1 z& o) p+ B" v6 u8 `" I% ] m_FullScreenRect.right=WindowRect.right-ClientRect.right+nFullWidth;8 |3 { L4 |4 ]
m_FullScreenRect.bottom=WindowRect.bottom-ClientRect.bottom+nFullHeigh
3 n4 g$ b" G' ?# G) mt;# a' D3 S- `5 L4 ^8 L5 k" l
m_bFullScreen=TRUE; // 设置全屏显示标志为 TRUE
8 [7 I' B; F8 u: P; v/ u2 D // 进入全屏显示状态
6 S9 l ?0 x. S& Q WINDOWPLACEMENT wndpl;- R# T( J; [" u7 K( [0 ]
wndpl.length=sizeof(WINDOWPLACEMENT);3 R$ l9 C0 w+ F- L* w; v% Q) e
wndpl.flags=0;
) B. e. ?; O4 i% _, @- d* I2 r wndpl.showCmd=SW_SHOWNORMAL;
& L/ `3 W9 F# j2 e wndpl.rcNormalPosition=m_FullScreenRect;( _" r" ^8 n' w4 q
SetWindowPlacement(&wndpl);}
" @, _* K1 C9 V* ]0 [8 l6 \# K, T 4)重载CMainFrame类的OnGetMinMaxInfo函数,在全屏显示时提供全屏显示的位置
/ {- M/ G3 G6 V/ z+ i信息。' k z0 ^& O# F1 ]& b, {( m
void CMainFrame::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)
7 G: x6 V9 f9 I, w8 `& j {if(m_bFullScreen)
( `7 c$ N0 R2 C2 k {lpMMI->ptMaxSize.x=m_FullScreenRect.Width();( _8 j1 Z' T( L, u
lpMMI->ptMaxSize.y=m_FullScreenRect.Height();. _/ q. e; ?2 l( e
lpMMI->ptMaxPosition.x=m_FullScreenRect.Width();
% r$ V, z2 T2 M% b! X lpMMI->ptMaxPosition.y=m_FullScreenRect.Height();( D4 D5 [7 ]) u8 H
// 最大的Track尺寸也要改变1 l& ~ ?) W, |' M) g( o
lpMMI->ptMaxTrackSize.x=m_FullScreenRect.Width();3 m9 F$ U" m. U8 Q" Q
lpMMI->ptMaxTrackSize.y=m_FullScreenRect.Height(); i. [; w& C& B3 s* O' u9 |
}CFrameWnd::OnGetMinMaxInfo(lpMMI) ;9 ^1 _, b5 t9 P" s3 v$ H5 n) D
}完成上面的编程后,可以联编执行FullScreen.exe,选择菜单“View\Full Scree2 U# K# n, D \7 t
n”或点击与之关联的工具栏按钮即可进入全屏显示状态。但现在还需要增加用户退出全7 Q% s& M$ A6 e: ]
屏显示状态的操作接口,下面讲述如何编程实现按“Esc”键退出全屏显示状态。
) x6 \3 m" g' x9 a" `2 q L4 R' Q! j 1)在ClassView中选中CMainFrame并单击鼠标右键,选择“Add Member Function.
; R, n5 Q" {4 j+ i2 R2 Y..”,添加public类型的成员函数EndFullScreen,该函数将完成退出全屏显示的操作。
! |8 g( Q& D9 v4 d3 T2 Y/ O5 ^+ y1 R* A7 a$ ~; X
void CMainFrame::EndFullScreen()
) b& C2 j, U* M {if(m_bFullScreen)6 i6 t# C( \+ D2 q
{// 退出全屏显示, 恢复原窗口显示3 h0 v7 H @# c
ShowWindow(SW_HIDE);! v9 A h. n8 a5 `
SetWindowPlacement(&m_OldWndPlace?. x/ _3 a" g9 [3 X$ J% P" R
ment);}}
- i, f" @/ ^& m5 ` 2)函数EndFullScreen可以退出全屏显示状态,问题是如何在“Esc”键被按下之后' i; p/ c* @5 n/ @$ W) Z
调用执行此函数。由于视图类可以处理键盘输入的有关消息(如WM_KEYDOWN表示用户按$ G1 H# ]- T* R
下了某一个键),我们将在视图类CFullScreenView中添加处理按键消息WM_KEYDOWN的响
! ] u; S& q! B1 ?- L应函数OnKeyDown。判断如果按的键为“Esc”键,则调用CMainFrame类的函数EndFullS
5 ~; L: X. t2 x K4 Q1 ?2 icreen,便可退出全屏显示状态。" q+ g' J2 T9 Y2 o. g! ^
void CFullScreenView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
- U9 E7 f+ ^2 ?$ M7 e {if(nChar==VK_ESCAPE) // 如果按的键为Esc键" ?) ] i; \, V
{// 获取主框架窗口的指针
( Z) R8 P6 J5 l/ R( M CMainFrame *pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd;$ |9 z% R1 y) f( O" m! ]
// 调用主窗口类的自定义函数 EndFullScreen ,便可退出全屏显示状态
6 V, c6 o9 j @) ? pFrame->EndFullScreen();}+ s2 A. ?8 o. ]0 \: r5 h u8 {
CView::OnKeyDown(nChar, nRepCnt, nFlags);}6 U2 y0 p$ F1 L
这样我们就实现了比较专业的全屏显示的功能,相信肯定会令你设计的软件程序增! l" f Z* h& _/ ^
色不少。 |
zan
|