- 在线时间
- 0 小时
- 最后登录
- 2004-7-1
- 注册时间
- 2004-4-27
- 听众数
- 2
- 收听数
- 0
- 能力
- 0 分
- 体力
- 487 点
- 威望
- 0 点
- 阅读权限
- 150
- 积分
- 104
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 24
- 主题
- 21
- 精华
- 0
- 分享
- 0
- 好友
- 0
该用户从未签到
国际赛参赛者
 |
全屏显示是一些应用软件程序必不可少的功能。比如在用VC++编辑工程源文件或
3 Y+ p. Q8 w6 L编辑对话框等资源时,选择菜单“View\Full Screen”,即可进入全屏显示状态,按“- `% x. j! q _* ~' R+ E
Esc”键后会退出全屏显示状态。" m8 }4 T! s( i5 O; V0 d, z y
在VC++6.0中我们用AppWizard按默认方式生成单文档界面的应用程序框架。下面
: B8 G: b9 C* L, W8 w/ x将先讨论点击菜单项“View\Full Screen”实现全屏显示的方法,再讲述按“Esc”键后* G2 P. y+ b& Q! j
如何退出全屏显示状态。6 I4 s# ~ E* \8 Q* D# ]3 `
1) 在CMainFrame类中,增加如下三个成员变量。
6 U* {5 [$ k$ \' k- P2 U6 l) h* H class CMainFrame : public CFrameWnd! U/ Z' z+ ^% L
{ private: //自己添加的三个成员变量( p, a- \! R( _* t* `% Z
WINDOWPLACEMENT m_OldWndPlacement; //用来保存原窗口位置) S3 B% L3 X7 ~* H
/* typedef struct tagWINDOWPLACEMENT { /* wndpl */
Z: j J G1 E UINT length;
: b; k6 c C6 _/ N( w/ X UINT flags;
6 S! D' E9 V7 h2 N. I" y# ^2 a/ }1 g7 C UINT showCmd;6 n1 m* f, o# O1 ~
POINT ptMinPosition;
' a4 j, d# i! P+ X$ x" r POINT ptMaxPosition;
3 @, b8 Z2 `+ d3 O' b) K/ u% x! T RECT rcNormalPosition;
+ S* e/ p* Q" {/ G* A8 ?& V. d } WINDOWPLACEMENT;+ O+ L" S$ V4 ~
*/; y& O n g, C+ x; ]; D! Q5 i
BOOL m_bFullScreen; //全屏显示标志) ^& |4 g6 e' R% a5 a$ |; n
CRect m_FullScreenRect; //表示全屏显示时的窗口位置! Z0 i8 n6 R/ [* Y9 o! a
protected: CMainFrame();8 X& [0 o$ V5 U% b3 a' A
DECLARE_DYNCREATE(CMainFrame)}/ J8 m8 M4 ]1 X2 O+ j# P, @
2)在资源编辑器中编辑菜单IDR_MAINFRAME。在“View”菜单栏下添加菜单项“Fu, f8 k* b- X' x4 f
ll Screen”。在其属性框中,ID设置为ID_FULL_SCREEN,Caption为“Full Screen”。
9 E* ^$ V; d( X; ~0 E8 \, f% ~还可以在工具栏中添加新的工具图标,并使之与菜单项“Full Screen”相关联,即将其
: g1 y5 M. X; i/ a" `) xID值也设置为ID_FULL_SCREEN。
" F/ [8 b' y t y8 Q& w 3)设计全屏显示处理函数,在CMainFrame类增加上述菜单项ID_FULL_SCREEN消息的
* H- G3 C9 e9 z2 @! a* `响应函数。响应函数如下:: N w4 M' h4 V# f$ p
void CMainFrame::OnFullScreen(). r( z- W& ?8 w0 [, x2 a
{GetWindowPlacement(&m_OldWndPlacement);
7 C; \# L I, t5 X; [. P3 f CRect WindowRect;/ K9 I8 Y' t. U6 y u
GetWindowRect(&WindowRect);
/ p ^9 ?2 f6 m1 r' s CRect ClientRect;$ |# e5 j- W( d; \: T
RepositionBars(0, 0xffff, AFX_IDW_PANE_FIRST, reposQuery, &ClientRect);
- C6 i- _( z* r* ]' B% a
5 P9 h/ |# m( R( Y: [& H1 p ClientToScreen(&ClientRect);. c8 }& V2 W) W( J
// 获取屏幕的分辨率
- s [9 y: ~. M( L; A% ^! e6 K int nFullWidth=GetSystemMetrics(SM_CXSCREEN);2 I# p) s' j7 I- T" w
int nFullHeight=GetSystemMetrics(SM_CYSCREEN);7 F7 r O6 ?) G+ A1 v# D3 D9 y
// 将除控制条外的客户区全屏显示到从(0,0)到(nFullWidth, nFullHeight)区域
6 h# b: \5 {" y0 {, 将(0,0)和(nFullWidth, nFullHeight)两个点外扩充原窗口和除控制条之外的 客户区9 C A) `# P9 R. m* w( _" n! F: G
位置间的差值, 就得到全屏显示的窗口位置0 a A: N" ~9 v9 ^* E
m_FullScreenRect.left=WindowRect.left-ClientRect.left; b) `: q2 I$ r$ k# ]4 R% n
m_FullScreenRect.top=WindowRect.top-ClientRect.top;
9 f4 W P# l' p# ^/ g m_FullScreenRect.right=WindowRect.right-ClientRect.right+nFullWidth;+ d1 ^' A+ i" T2 ^
m_FullScreenRect.bottom=WindowRect.bottom-ClientRect.bottom+nFullHeigh
5 p6 G7 S# T+ _& W9 d5 I, f8 Zt;% j: X+ q0 k% D3 R2 S2 s. U/ ^
m_bFullScreen=TRUE; // 设置全屏显示标志为 TRUE+ k! l: C+ c# \5 [1 ]. @; X
// 进入全屏显示状态" m# z/ C! Y. A3 y
WINDOWPLACEMENT wndpl;& g$ J. I( b; |: c9 J
wndpl.length=sizeof(WINDOWPLACEMENT);, q# S; A& e) y7 R0 N0 x
wndpl.flags=0;- B/ K/ L$ p7 L* W1 H x
wndpl.showCmd=SW_SHOWNORMAL;; `7 i( w, z( O8 X4 A
wndpl.rcNormalPosition=m_FullScreenRect;4 V. N1 n5 O0 b7 B
SetWindowPlacement(&wndpl);}/ a) i% c2 e& o' a
4)重载CMainFrame类的OnGetMinMaxInfo函数,在全屏显示时提供全屏显示的位置* Z1 K& u, Z1 i, s4 v5 U# j- n3 H
信息。, h D! R, [# P9 |. N8 O! Y
void CMainFrame::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)
6 z( f$ N2 z4 U! ~. ] {if(m_bFullScreen)2 `2 j1 Z+ e! A% O. A
{lpMMI->ptMaxSize.x=m_FullScreenRect.Width();$ e4 ~+ @* |' w @
lpMMI->ptMaxSize.y=m_FullScreenRect.Height();
# e) }0 C# {- a- g1 k0 ? lpMMI->ptMaxPosition.x=m_FullScreenRect.Width();
! c9 y7 ]/ k6 |" m' c lpMMI->ptMaxPosition.y=m_FullScreenRect.Height();$ t# V! T7 z- c: f* @: V. |$ \ R$ V
// 最大的Track尺寸也要改变
" [( o$ ^% V; T# |" X( s9 m lpMMI->ptMaxTrackSize.x=m_FullScreenRect.Width();
, Q% ]- O2 _3 p0 a: F& W/ x lpMMI->ptMaxTrackSize.y=m_FullScreenRect.Height();$ G1 g) R$ H8 c3 f) B, o' Z
}CFrameWnd::OnGetMinMaxInfo(lpMMI) ;
. |* `8 _& j- e9 _: ?/ V }完成上面的编程后,可以联编执行FullScreen.exe,选择菜单“View\Full Scree9 w% U3 B, O8 s4 Y
n”或点击与之关联的工具栏按钮即可进入全屏显示状态。但现在还需要增加用户退出全' l9 t* I8 Y+ j# C/ b( l
屏显示状态的操作接口,下面讲述如何编程实现按“Esc”键退出全屏显示状态。
% E9 A& m0 u- c$ A' f/ F* S 1)在ClassView中选中CMainFrame并单击鼠标右键,选择“Add Member Function.
1 t8 B# }* o/ A4 ?' D, Q..”,添加public类型的成员函数EndFullScreen,该函数将完成退出全屏显示的操作。
! w( R- W3 v/ m" b* T! s9 n. r" n& x7 N* b& O
void CMainFrame::EndFullScreen()
/ x. A3 m4 G; E$ u5 V. |; ]! J$ V {if(m_bFullScreen)
7 c4 t$ V2 K9 u" ` x/ c {// 退出全屏显示, 恢复原窗口显示# B2 n7 K$ x0 \. Z
ShowWindow(SW_HIDE);
" `. i6 j4 U0 Z SetWindowPlacement(&m_OldWndPlace?8 `) t' o6 m4 P$ j' y+ [2 B1 E' C6 V
ment);}}
+ E# A7 j, U5 Z( x& w 2)函数EndFullScreen可以退出全屏显示状态,问题是如何在“Esc”键被按下之后
/ N7 F& T& J" ?0 d- N0 V1 c5 t调用执行此函数。由于视图类可以处理键盘输入的有关消息(如WM_KEYDOWN表示用户按
: {# z5 S/ \' {6 Z- Q5 ~下了某一个键),我们将在视图类CFullScreenView中添加处理按键消息WM_KEYDOWN的响; L8 `1 n3 m' {0 {* }
应函数OnKeyDown。判断如果按的键为“Esc”键,则调用CMainFrame类的函数EndFullS- K3 n9 x* `- I% I6 o
creen,便可退出全屏显示状态。
/ i$ s5 q( m/ l' o/ Z void CFullScreenView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)) g, k: a/ \6 L! I
{if(nChar==VK_ESCAPE) // 如果按的键为Esc键 j" G; i2 c9 ]
{// 获取主框架窗口的指针! I( G# {. Y* U9 m3 O3 {; ?( m
CMainFrame *pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd;
3 I4 y b) m4 z1 g N! K; e // 调用主窗口类的自定义函数 EndFullScreen ,便可退出全屏显示状态
1 h% P, ~: [5 @# Q pFrame->EndFullScreen();}
8 o8 r2 P% C+ p& r$ `6 B: s- t' @ L CView::OnKeyDown(nChar, nRepCnt, nFlags);}0 U4 Z1 {7 X v
这样我们就实现了比较专业的全屏显示的功能,相信肯定会令你设计的软件程序增' t; Y5 h! V$ i
色不少。 |
zan
|