- 在线时间
- 0 小时
- 最后登录
- 2004-7-1
- 注册时间
- 2004-4-27
- 听众数
- 2
- 收听数
- 0
- 能力
- 0 分
- 体力
- 487 点
- 威望
- 0 点
- 阅读权限
- 150
- 积分
- 104
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 24
- 主题
- 21
- 精华
- 0
- 分享
- 0
- 好友
- 0
该用户从未签到
国际赛参赛者
 |
全屏显示是一些应用软件程序必不可少的功能。比如在用VC++编辑工程源文件或# k# r# p/ Q, n5 c# ^; d. n
编辑对话框等资源时,选择菜单“View\Full Screen”,即可进入全屏显示状态,按“
$ J# x& g$ L6 i4 `4 z1 G5 NEsc”键后会退出全屏显示状态。
/ D1 O% Z) I7 ~5 Y3 K9 T6 W 在VC++6.0中我们用AppWizard按默认方式生成单文档界面的应用程序框架。下面
4 ~' a3 g* ]1 c4 M将先讨论点击菜单项“View\Full Screen”实现全屏显示的方法,再讲述按“Esc”键后+ E/ f, {6 t4 P
如何退出全屏显示状态。
/ c& j* S5 ~7 I4 g# t; Z; D" F 1) 在CMainFrame类中,增加如下三个成员变量。
) L L. o2 x& w" M class CMainFrame : public CFrameWnd
, d {) O% d- L) x' {, _ { private: //自己添加的三个成员变量
, W' Z& b$ I3 T: s7 c WINDOWPLACEMENT m_OldWndPlacement; //用来保存原窗口位置, i7 Y/ x( `3 [* F" w) i
/* typedef struct tagWINDOWPLACEMENT { /* wndpl */
) I3 `) {+ M& [- m& i# H UINT length;
( I) n/ C! M8 R UINT flags;+ D9 x h1 |5 P' z7 d
UINT showCmd;
2 a4 m( r- g q" d9 S8 p0 I% B* f POINT ptMinPosition;6 q) s0 \* T# q8 W6 b
POINT ptMaxPosition;) a5 M: ~$ A8 A' c. \; B8 p3 ~( y$ `
RECT rcNormalPosition;
; O1 V& e& k) S0 d5 G } WINDOWPLACEMENT;
2 d/ R8 y ~4 }! q; E8 W- b*/4 [' {9 P5 C! |$ l
BOOL m_bFullScreen; //全屏显示标志8 \ x6 O0 Y: b# e: a% B
CRect m_FullScreenRect; //表示全屏显示时的窗口位置
: b9 ]* O* |8 T: _' w protected: CMainFrame();2 ]0 g& x1 r" n/ Q
DECLARE_DYNCREATE(CMainFrame)}3 H7 \+ Q$ y* ]! u
2)在资源编辑器中编辑菜单IDR_MAINFRAME。在“View”菜单栏下添加菜单项“Fu
. Q5 r# J3 v$ w4 [8 c3 Mll Screen”。在其属性框中,ID设置为ID_FULL_SCREEN,Caption为“Full Screen”。
% D3 f4 t" o9 a S8 S& E9 ^& S" V还可以在工具栏中添加新的工具图标,并使之与菜单项“Full Screen”相关联,即将其
( s6 F& ~( @- rID值也设置为ID_FULL_SCREEN。
3 w: r7 m* T1 n) E8 ~ 3)设计全屏显示处理函数,在CMainFrame类增加上述菜单项ID_FULL_SCREEN消息的6 q2 l: k9 r- C
响应函数。响应函数如下:
4 `8 ` N! q( m void CMainFrame::OnFullScreen()
# r! J1 ^& S1 ^! [, E {GetWindowPlacement(&m_OldWndPlacement);" k% }; l( `6 q4 I- R b" x. ]' e
CRect WindowRect;3 L4 x& B& x" Y5 ]1 T
GetWindowRect(&WindowRect);
% Q' v( `7 ]- g9 Q3 \ CRect ClientRect; i/ ~, b0 n5 c6 |, ^9 U$ F a# j
RepositionBars(0, 0xffff, AFX_IDW_PANE_FIRST, reposQuery, &ClientRect);* _! _1 } p/ [9 U
) ^7 \7 W3 a' w5 z; C9 V. @* r
ClientToScreen(&ClientRect);
1 {, E4 B" B0 k2 A# ` // 获取屏幕的分辨率7 P+ C |2 ~* g" H9 M- o. M
int nFullWidth=GetSystemMetrics(SM_CXSCREEN);) L$ H8 v$ X( _: ^, I3 _% c, r' ?
int nFullHeight=GetSystemMetrics(SM_CYSCREEN);5 i) I! ?; P, A* N
// 将除控制条外的客户区全屏显示到从(0,0)到(nFullWidth, nFullHeight)区域, h7 x0 C7 H e+ C- t f; N& ?
, 将(0,0)和(nFullWidth, nFullHeight)两个点外扩充原窗口和除控制条之外的 客户区
6 n( Z2 D8 E7 Q% ?位置间的差值, 就得到全屏显示的窗口位置& F6 L; r" h) P* S6 X
m_FullScreenRect.left=WindowRect.left-ClientRect.left;$ n3 G8 L" F& h6 i" f
m_FullScreenRect.top=WindowRect.top-ClientRect.top;# ?+ K# [9 I- `' a1 V
m_FullScreenRect.right=WindowRect.right-ClientRect.right+nFullWidth;* @, f, Y5 x4 k5 z* o. {
m_FullScreenRect.bottom=WindowRect.bottom-ClientRect.bottom+nFullHeigh1 J/ E7 a6 T" q+ h) i E
t;8 y( H: f2 g, p5 S1 @7 g* s
m_bFullScreen=TRUE; // 设置全屏显示标志为 TRUE3 }3 j0 g8 U" c7 @0 B4 X2 Q
// 进入全屏显示状态
/ B1 O6 F; x% x/ s2 q0 S WINDOWPLACEMENT wndpl;" ~2 h' [2 C3 l
wndpl.length=sizeof(WINDOWPLACEMENT);4 E3 t& @( r) S# W- A7 a; N
wndpl.flags=0;
. U+ r+ A" j! N% |( r wndpl.showCmd=SW_SHOWNORMAL;
5 R8 z8 D6 C/ o x3 c7 A. @3 s/ O wndpl.rcNormalPosition=m_FullScreenRect;
- `! T' M2 }3 ]+ R6 z$ j6 U# A' k SetWindowPlacement(&wndpl);}9 V! |& _) D3 j9 i7 ~- c
4)重载CMainFrame类的OnGetMinMaxInfo函数,在全屏显示时提供全屏显示的位置
' h% m6 x) H5 j, I. v信息。
* f# G3 b7 L2 \2 C void CMainFrame::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)) ^% r! S* ^- L& L7 k
{if(m_bFullScreen)0 d) {" v Z) u% s
{lpMMI->ptMaxSize.x=m_FullScreenRect.Width();2 {7 ]8 }2 s; N5 @0 k
lpMMI->ptMaxSize.y=m_FullScreenRect.Height();& k4 y5 ^0 }. g" q6 Z; x; ^1 r. z
lpMMI->ptMaxPosition.x=m_FullScreenRect.Width();0 \6 @; ?" Z& [( l2 V% j1 O
lpMMI->ptMaxPosition.y=m_FullScreenRect.Height();
9 U9 C6 r8 M" r6 ~ // 最大的Track尺寸也要改变
+ K" U* |8 I& f8 y lpMMI->ptMaxTrackSize.x=m_FullScreenRect.Width();
! `2 {6 ]2 m) P1 I0 p6 w/ w/ x; J' J8 h lpMMI->ptMaxTrackSize.y=m_FullScreenRect.Height();5 t/ X; w6 i/ r% i
}CFrameWnd::OnGetMinMaxInfo(lpMMI) ;! `* r5 O3 j, j/ `
}完成上面的编程后,可以联编执行FullScreen.exe,选择菜单“View\Full Scree
0 K1 ^6 s/ V$ Un”或点击与之关联的工具栏按钮即可进入全屏显示状态。但现在还需要增加用户退出全
1 P1 S% ?3 D! g6 {! [; y6 ~# T屏显示状态的操作接口,下面讲述如何编程实现按“Esc”键退出全屏显示状态。
3 d8 X9 H- t+ m5 N 1)在ClassView中选中CMainFrame并单击鼠标右键,选择“Add Member Function.! r) ^) V8 q7 I% l$ [; C# h
..”,添加public类型的成员函数EndFullScreen,该函数将完成退出全屏显示的操作。$ t1 \! U/ R% ^- u& o
1 \1 X# f/ W" I1 A4 R
void CMainFrame::EndFullScreen()+ `7 d# ^! ?6 x2 q4 E
{if(m_bFullScreen)7 _$ w& ~- i2 x6 z+ i
{// 退出全屏显示, 恢复原窗口显示
. {& {" o: H3 K+ m4 N( C0 i4 O ShowWindow(SW_HIDE);5 j7 |# f4 O4 x6 K3 M9 G6 d4 H$ c
SetWindowPlacement(&m_OldWndPlace?8 c$ y- W: l4 I
ment);}}
) f/ n* z% P* a0 v3 f 2)函数EndFullScreen可以退出全屏显示状态,问题是如何在“Esc”键被按下之后6 M" w- w! M8 o# E4 {* ^$ A
调用执行此函数。由于视图类可以处理键盘输入的有关消息(如WM_KEYDOWN表示用户按+ |. E1 E! O2 ^* v2 Q H
下了某一个键),我们将在视图类CFullScreenView中添加处理按键消息WM_KEYDOWN的响
' _( m& a3 ^& \. u应函数OnKeyDown。判断如果按的键为“Esc”键,则调用CMainFrame类的函数EndFullS( `7 |8 a m. I
creen,便可退出全屏显示状态。
# D5 E: X( V& Q7 S7 _ \ void CFullScreenView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
' N* F6 D+ T4 K" k) b {if(nChar==VK_ESCAPE) // 如果按的键为Esc键% y1 @4 L6 d# B: R: L
{// 获取主框架窗口的指针1 D( A+ V N! d' @) c0 T
CMainFrame *pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd;
+ g" V! g4 W. S% o // 调用主窗口类的自定义函数 EndFullScreen ,便可退出全屏显示状态2 L. d+ t7 m: t) G; u
pFrame->EndFullScreen();}
% u8 E2 U1 U9 s7 b& ?6 p# x CView::OnKeyDown(nChar, nRepCnt, nFlags);}. A. u& I0 \9 c8 A8 F V$ n* X4 `
这样我们就实现了比较专业的全屏显示的功能,相信肯定会令你设计的软件程序增" r: b! C3 ?) }' H
色不少。 |
zan
|