- 在线时间
- 0 小时
- 最后登录
- 2004-7-1
- 注册时间
- 2004-4-27
- 听众数
- 2
- 收听数
- 0
- 能力
- 0 分
- 体力
- 487 点
- 威望
- 0 点
- 阅读权限
- 150
- 积分
- 104
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 24
- 主题
- 21
- 精华
- 0
- 分享
- 0
- 好友
- 0
该用户从未签到
国际赛参赛者
 |
全屏显示是一些应用软件程序必不可少的功能。比如在用VC++编辑工程源文件或
/ j' N `+ h y7 h7 m8 V编辑对话框等资源时,选择菜单“View\Full Screen”,即可进入全屏显示状态,按“' g; w" P; }( y/ ~% T `7 E g5 o
Esc”键后会退出全屏显示状态。5 u8 }: X1 k! [" g. q
在VC++6.0中我们用AppWizard按默认方式生成单文档界面的应用程序框架。下面
9 b# z3 V+ _( W( k @将先讨论点击菜单项“View\Full Screen”实现全屏显示的方法,再讲述按“Esc”键后
, }0 @8 m! E" }, s) Q" z如何退出全屏显示状态。3 L0 i- O3 M% U! S, Z( j! l5 Y$ H
1) 在CMainFrame类中,增加如下三个成员变量。: a) o4 e$ v5 o" s6 d- F
class CMainFrame : public CFrameWnd, H0 }# D$ S! i$ C; J$ d7 A& K
{ private: //自己添加的三个成员变量
! ]& P. I( x% E. D, b' C; a WINDOWPLACEMENT m_OldWndPlacement; //用来保存原窗口位置8 i0 {" k# e5 {7 b' B. l! m( J9 H
/* typedef struct tagWINDOWPLACEMENT { /* wndpl */
4 I) T. N9 _) Q4 _1 h' G* l3 I UINT length;2 t2 S/ q) u0 e
UINT flags;% l- r; h2 Y2 L/ k2 T6 E; M
UINT showCmd; r8 b8 F( @6 w W2 {7 f
POINT ptMinPosition;
$ t3 t1 ]) V6 s) C0 {1 j1 G2 W POINT ptMaxPosition;. O. H* ^8 O) M2 t( e. p: d9 o
RECT rcNormalPosition;7 p$ Q# I/ P8 N7 I
} WINDOWPLACEMENT;+ ~- B F% g/ Y: f
*/( ~% {# ^6 Q3 i2 @7 Q# k8 q% }6 Y
BOOL m_bFullScreen; //全屏显示标志
& `* S) I. c/ n- Q; _* ? CRect m_FullScreenRect; //表示全屏显示时的窗口位置2 b i# S, \5 D
protected: CMainFrame();+ P* @, [( B2 f" ]. m8 Z
DECLARE_DYNCREATE(CMainFrame)}* R7 U, m0 U: R6 e+ _" D
2)在资源编辑器中编辑菜单IDR_MAINFRAME。在“View”菜单栏下添加菜单项“Fu9 p/ U* L, p# X2 a: t
ll Screen”。在其属性框中,ID设置为ID_FULL_SCREEN,Caption为“Full Screen”。. z0 p3 O w4 | U/ D3 b. c9 O
还可以在工具栏中添加新的工具图标,并使之与菜单项“Full Screen”相关联,即将其; m$ I. E5 {% V- C* K
ID值也设置为ID_FULL_SCREEN。
% i& W+ t: _1 @# g9 e# p5 C 3)设计全屏显示处理函数,在CMainFrame类增加上述菜单项ID_FULL_SCREEN消息的
5 |# K* j: ~" C! v4 h1 |4 x响应函数。响应函数如下:, X" _) ]8 d5 n |/ P
void CMainFrame::OnFullScreen()
& R, f/ Q8 Z: ^ {GetWindowPlacement(&m_OldWndPlacement);! {6 s4 [: Q5 f. w4 t
CRect WindowRect;
* U; ?) [9 T. Q$ Y7 p/ P2 a GetWindowRect(&WindowRect);
) z5 k/ i5 ?' k CRect ClientRect;
# m: m, f5 j& ~; A0 _" x+ c RepositionBars(0, 0xffff, AFX_IDW_PANE_FIRST, reposQuery, &ClientRect);
0 g4 k" s$ p5 A2 f5 }- Z! J! w7 [7 \- M% n# ~/ P
ClientToScreen(&ClientRect);, E& R% y. Q4 L5 v1 a
// 获取屏幕的分辨率
# ?& f, p$ P; Q& I! b' T. R int nFullWidth=GetSystemMetrics(SM_CXSCREEN);
6 s9 }( V3 f* H C- {4 m9 D% ~ int nFullHeight=GetSystemMetrics(SM_CYSCREEN);
% S* Y% e3 v+ }+ \: ]7 x* x // 将除控制条外的客户区全屏显示到从(0,0)到(nFullWidth, nFullHeight)区域 G0 S8 V" K+ h0 ?, ~( k3 l
, 将(0,0)和(nFullWidth, nFullHeight)两个点外扩充原窗口和除控制条之外的 客户区0 Z k# U* G( H+ c+ O8 ~
位置间的差值, 就得到全屏显示的窗口位置
" A( l$ V, |) J$ R- e m_FullScreenRect.left=WindowRect.left-ClientRect.left;
- t" S0 J% B( J m_FullScreenRect.top=WindowRect.top-ClientRect.top;
B6 G4 [, Q6 X h m_FullScreenRect.right=WindowRect.right-ClientRect.right+nFullWidth;: f7 C R2 S2 _) X
m_FullScreenRect.bottom=WindowRect.bottom-ClientRect.bottom+nFullHeigh t2 J8 C# O i/ V! q
t;
$ b7 G: _5 u- @7 u6 g m_bFullScreen=TRUE; // 设置全屏显示标志为 TRUE
, ?) \* D9 M3 y, o/ k // 进入全屏显示状态# ?; Z+ I( @5 h9 s/ p0 a
WINDOWPLACEMENT wndpl;! t# q% r& S2 d' t% d
wndpl.length=sizeof(WINDOWPLACEMENT);# `, X% l$ D) [. U) `
wndpl.flags=0;
# b1 w) B. b/ j3 o0 l" p wndpl.showCmd=SW_SHOWNORMAL;$ w" Y; H! ]+ O* G* `5 [1 g
wndpl.rcNormalPosition=m_FullScreenRect;
# z3 {( U4 v9 q1 X9 J- q7 S SetWindowPlacement(&wndpl);}
7 z8 ]8 I% ~" ~ 4)重载CMainFrame类的OnGetMinMaxInfo函数,在全屏显示时提供全屏显示的位置
7 O/ I2 m8 Y5 y- x5 u( t0 c5 S! D信息。5 P& z+ Y1 S8 x" k/ T" g
void CMainFrame::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)/ p% |+ K3 f( g& c. r# N
{if(m_bFullScreen)# a; v9 _, l! S, n9 A* |( J- h
{lpMMI->ptMaxSize.x=m_FullScreenRect.Width();
5 z4 |: k$ S- |! j, J% b lpMMI->ptMaxSize.y=m_FullScreenRect.Height();
; Z! H" D* q) D8 |0 w( u1 l lpMMI->ptMaxPosition.x=m_FullScreenRect.Width();
# w: ?0 i% |3 }/ t' f" z# ]6 C lpMMI->ptMaxPosition.y=m_FullScreenRect.Height(); \! e* w7 `% j" m3 p- T1 x
// 最大的Track尺寸也要改变# v4 D, q6 z7 [' K
lpMMI->ptMaxTrackSize.x=m_FullScreenRect.Width();/ i8 R. C7 [ C1 G4 s
lpMMI->ptMaxTrackSize.y=m_FullScreenRect.Height();
1 \% q- |5 D% w2 { }CFrameWnd::OnGetMinMaxInfo(lpMMI) ;6 ]7 h$ q0 k" `
}完成上面的编程后,可以联编执行FullScreen.exe,选择菜单“View\Full Scree! A7 y9 g" r3 y- r j/ ^0 c
n”或点击与之关联的工具栏按钮即可进入全屏显示状态。但现在还需要增加用户退出全
" b0 C" m7 o. S- s% ]7 m屏显示状态的操作接口,下面讲述如何编程实现按“Esc”键退出全屏显示状态。
: z$ S# `. d6 N- c 1)在ClassView中选中CMainFrame并单击鼠标右键,选择“Add Member Function.
, M/ Y3 I8 L# N; h9 S$ k2 m0 {..”,添加public类型的成员函数EndFullScreen,该函数将完成退出全屏显示的操作。5 D7 X& V/ Y/ g. W1 {9 a
$ @5 n3 ], s. n
void CMainFrame::EndFullScreen()
5 K% i* y+ k- D' a9 k {if(m_bFullScreen)
7 V# @5 M, Q. Z {// 退出全屏显示, 恢复原窗口显示$ r2 N* }4 Y) H2 [3 c
ShowWindow(SW_HIDE);1 N) a% t# D* l, Z+ |! n; p
SetWindowPlacement(&m_OldWndPlace?
- @1 d8 }. x+ [6 X/ T& ?2 ]) cment);}}; m) A5 n: { ?. V+ k% z( o1 I! y$ b
2)函数EndFullScreen可以退出全屏显示状态,问题是如何在“Esc”键被按下之后
8 D, p" C7 g& ?/ w调用执行此函数。由于视图类可以处理键盘输入的有关消息(如WM_KEYDOWN表示用户按
0 X2 V) U: ^- Z9 l7 ~% w& J+ w5 o下了某一个键),我们将在视图类CFullScreenView中添加处理按键消息WM_KEYDOWN的响4 u+ A- x( U7 s$ S+ o7 W3 t3 Z
应函数OnKeyDown。判断如果按的键为“Esc”键,则调用CMainFrame类的函数EndFullS {) Z4 m. ~; L# v- n4 B
creen,便可退出全屏显示状态。
. `8 y' w8 B( P8 W1 {/ N* Z, R7 ^. C void CFullScreenView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
u; n" ~( P7 ?. F {if(nChar==VK_ESCAPE) // 如果按的键为Esc键- ? R3 d, n9 ]( i" t' V4 c# [
{// 获取主框架窗口的指针
0 A, k2 Q* W0 J( c8 i! I5 x' I CMainFrame *pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd;
8 R- F- k8 M7 y! J" Q. e: h // 调用主窗口类的自定义函数 EndFullScreen ,便可退出全屏显示状态
- k8 ? l/ T- T* y% c# J pFrame->EndFullScreen();}
& `& K8 {4 i9 P) j7 r4 t0 Y- _6 ^% p CView::OnKeyDown(nChar, nRepCnt, nFlags);}
# g/ G8 ^. T" @/ V) r. o 这样我们就实现了比较专业的全屏显示的功能,相信肯定会令你设计的软件程序增
# ~1 ]* a5 C( s" Q. |$ i$ t色不少。 |
zan
|