- 在线时间
- 0 小时
- 最后登录
- 2004-7-1
- 注册时间
- 2004-4-27
- 听众数
- 2
- 收听数
- 0
- 能力
- 0 分
- 体力
- 487 点
- 威望
- 0 点
- 阅读权限
- 150
- 积分
- 104
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 24
- 主题
- 21
- 精华
- 0
- 分享
- 0
- 好友
- 0
该用户从未签到
国际赛参赛者
 |
全屏显示是一些应用软件程序必不可少的功能。比如在用VC++编辑工程源文件或6 H l' J$ J" f+ g4 i" f
编辑对话框等资源时,选择菜单“View\Full Screen”,即可进入全屏显示状态,按“4 n! A1 ?3 K" y1 z
Esc”键后会退出全屏显示状态。- i5 S" h: O- @5 d! [( S. S9 z
在VC++6.0中我们用AppWizard按默认方式生成单文档界面的应用程序框架。下面
. r, G r/ S4 t" b/ v" u将先讨论点击菜单项“View\Full Screen”实现全屏显示的方法,再讲述按“Esc”键后
' @3 Y ]% v; `' g如何退出全屏显示状态。
$ }/ E5 V' [* T: T8 Z$ j# i: g 1) 在CMainFrame类中,增加如下三个成员变量。
; C+ j8 W! Z( w class CMainFrame : public CFrameWnd3 I7 l8 M/ R6 D& v# N) K2 ?9 p; V
{ private: //自己添加的三个成员变量7 n- O2 x$ C' D0 V8 Z: l3 M
WINDOWPLACEMENT m_OldWndPlacement; //用来保存原窗口位置
: l& ?4 `% Q0 [; F/* typedef struct tagWINDOWPLACEMENT { /* wndpl */1 I2 u! U" J1 l* |/ M! }8 ?" V7 i
UINT length;
5 }0 ?% {7 {, M3 F0 [ UINT flags;
1 M9 t( K# {* H UINT showCmd;
9 {3 e* C I T! K m! E9 ]2 q POINT ptMinPosition;
) ^5 Q* N7 W+ K0 X5 u" M* V POINT ptMaxPosition;
+ `! q4 w |% j9 C RECT rcNormalPosition;
& }2 r% O1 c! V, L" A } WINDOWPLACEMENT;. V. E6 z# W6 r2 J5 g
*/
9 m3 s4 Y9 h# R6 h, v4 n BOOL m_bFullScreen; //全屏显示标志8 x3 y1 \ q% J8 R
CRect m_FullScreenRect; //表示全屏显示时的窗口位置
8 ~, I, w$ [+ k: b2 X0 T protected: CMainFrame();$ N0 K Q5 w# ?3 V6 m
DECLARE_DYNCREATE(CMainFrame)}
$ j5 M; F3 _( W9 _! L 2)在资源编辑器中编辑菜单IDR_MAINFRAME。在“View”菜单栏下添加菜单项“Fu
) D3 {! D+ o8 g/ v( h9 ^0 V D* yll Screen”。在其属性框中,ID设置为ID_FULL_SCREEN,Caption为“Full Screen”。
$ X! Z- n. \+ ~, k2 Q {还可以在工具栏中添加新的工具图标,并使之与菜单项“Full Screen”相关联,即将其) b/ t+ o% r% s) ?+ I* z. B( g1 h
ID值也设置为ID_FULL_SCREEN。
$ C, N2 K! A$ R O6 ] 3)设计全屏显示处理函数,在CMainFrame类增加上述菜单项ID_FULL_SCREEN消息的/ C! u* z7 R. M9 p/ @3 V8 e" }1 C
响应函数。响应函数如下:
5 Y! |* \ `9 X; }% g% m, Q void CMainFrame::OnFullScreen()
. n& W& R9 |) p% L. M4 J {GetWindowPlacement(&m_OldWndPlacement);
" s& u( m3 Y* O- C2 G' O! R CRect WindowRect;
6 ]' z5 R+ b+ _: r* W/ I! G GetWindowRect(&WindowRect);$ @* f. R. N/ U- G9 y
CRect ClientRect;, E. O; a; B" G" l- n: k$ ~
RepositionBars(0, 0xffff, AFX_IDW_PANE_FIRST, reposQuery, &ClientRect);
3 e& \4 f+ Y. e; u! }5 z8 m# g, C
: [) |8 z- t s, W9 M9 s: c ClientToScreen(&ClientRect);
; U8 v4 U# C* W" {: J |; H // 获取屏幕的分辨率4 F" q/ H- j" c. ^* F2 w. g
int nFullWidth=GetSystemMetrics(SM_CXSCREEN);
1 A& s9 |6 ]9 a a" U) Y S int nFullHeight=GetSystemMetrics(SM_CYSCREEN);2 l" N/ i/ i5 m% U. `
// 将除控制条外的客户区全屏显示到从(0,0)到(nFullWidth, nFullHeight)区域% E7 h; Q% |% x0 E* j, F
, 将(0,0)和(nFullWidth, nFullHeight)两个点外扩充原窗口和除控制条之外的 客户区
. A9 i4 K; c" i: V: p5 F4 u位置间的差值, 就得到全屏显示的窗口位置
e! c& y$ H) x0 J; }* ]7 q* {/ }% r m_FullScreenRect.left=WindowRect.left-ClientRect.left;
4 k: W$ k5 \. ?) w( w m m_FullScreenRect.top=WindowRect.top-ClientRect.top;
) r0 ^1 i6 q: D. Q m_FullScreenRect.right=WindowRect.right-ClientRect.right+nFullWidth;
; g7 ~$ f @, a( Y. M" w/ h m_FullScreenRect.bottom=WindowRect.bottom-ClientRect.bottom+nFullHeigh9 j: _7 r t: @
t;3 p# q/ x2 F% z7 v5 f0 N r# j* Q$ B/ a
m_bFullScreen=TRUE; // 设置全屏显示标志为 TRUE! [7 z7 Q' J$ Q7 w& w; e
// 进入全屏显示状态+ Y6 {5 R; C2 s. O, ]
WINDOWPLACEMENT wndpl;+ Y9 U8 _ K8 \3 v2 d3 V" i1 k# O
wndpl.length=sizeof(WINDOWPLACEMENT);; Q3 i1 `: F9 l& B) N
wndpl.flags=0;
1 z8 `3 R* u, B% Z v0 d: w wndpl.showCmd=SW_SHOWNORMAL;
. L4 G$ A0 r- o/ f3 N+ s' | wndpl.rcNormalPosition=m_FullScreenRect;
' }+ z% o7 l. m- l* K: q, w8 u SetWindowPlacement(&wndpl);}" k @$ `: j; ^; b6 ?1 N% R
4)重载CMainFrame类的OnGetMinMaxInfo函数,在全屏显示时提供全屏显示的位置4 E$ q n3 b2 d4 Z4 i
信息。5 ?& U) o& v' K6 q0 ?1 z1 M! Y
void CMainFrame::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)9 r, w( L1 _/ W+ M* b% T& j7 b
{if(m_bFullScreen)1 I% q0 ]" S, H) h
{lpMMI->ptMaxSize.x=m_FullScreenRect.Width();: H, w/ M6 K v' r
lpMMI->ptMaxSize.y=m_FullScreenRect.Height();
: L) S7 y( \2 R }4 T5 C lpMMI->ptMaxPosition.x=m_FullScreenRect.Width();
: U, ]9 E( w( A M9 [" {3 T r# k lpMMI->ptMaxPosition.y=m_FullScreenRect.Height();
, K5 b% P: G+ G! R3 J" L // 最大的Track尺寸也要改变( J4 J- ~1 G+ d! t6 T
lpMMI->ptMaxTrackSize.x=m_FullScreenRect.Width();% c% C; p& z! X+ C) Z% s9 y/ q4 M
lpMMI->ptMaxTrackSize.y=m_FullScreenRect.Height();! ~+ v9 N# d. G+ d, L- }" @
}CFrameWnd::OnGetMinMaxInfo(lpMMI) ;$ `& ]! n& l ~& y
}完成上面的编程后,可以联编执行FullScreen.exe,选择菜单“View\Full Scree
# [& w* b0 j. |% S. O M" k+ mn”或点击与之关联的工具栏按钮即可进入全屏显示状态。但现在还需要增加用户退出全2 n0 M4 q7 p9 ^8 l( g: _! k
屏显示状态的操作接口,下面讲述如何编程实现按“Esc”键退出全屏显示状态。. y0 ?4 \- r# K$ b4 M5 `1 U
1)在ClassView中选中CMainFrame并单击鼠标右键,选择“Add Member Function.
! ^, Y) ^( m) b9 p..”,添加public类型的成员函数EndFullScreen,该函数将完成退出全屏显示的操作。9 T# ?; k# G. P; J# M' E7 k
; v5 X" P" _/ i4 r( _6 ?) h void CMainFrame::EndFullScreen()' a4 Z4 N! e6 {9 y% X s
{if(m_bFullScreen)
* @, {1 `1 k( c/ P u {// 退出全屏显示, 恢复原窗口显示- T% Q9 V& c& u3 }! ]) g
ShowWindow(SW_HIDE);
: }& o1 O6 k/ w3 O; B! | SetWindowPlacement(&m_OldWndPlace?7 F: m+ z8 [6 C* T& L+ L. c% c
ment);}}
* ]8 n9 \7 Z$ l0 t) G 2)函数EndFullScreen可以退出全屏显示状态,问题是如何在“Esc”键被按下之后
$ a, k. ?) ^8 {: H4 Q调用执行此函数。由于视图类可以处理键盘输入的有关消息(如WM_KEYDOWN表示用户按+ F2 U2 d; c7 a* r" W
下了某一个键),我们将在视图类CFullScreenView中添加处理按键消息WM_KEYDOWN的响
8 N' f( [" I2 _& k. w: i4 f应函数OnKeyDown。判断如果按的键为“Esc”键,则调用CMainFrame类的函数EndFullS9 f; M& n! B# w2 P w+ L
creen,便可退出全屏显示状态。6 N% S! ^# ]$ t( u
void CFullScreenView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)" k+ U/ V! q7 k' y# V; Q0 E6 q
{if(nChar==VK_ESCAPE) // 如果按的键为Esc键* H# V! b- D6 L: i- D% L
{// 获取主框架窗口的指针1 o; d' {+ b2 p r. f; [" Q
CMainFrame *pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd;7 T- ]8 n4 ~8 _5 [* \) R [' k
// 调用主窗口类的自定义函数 EndFullScreen ,便可退出全屏显示状态
9 F2 D7 i8 G4 L pFrame->EndFullScreen();}$ w3 q4 O5 C" K$ }
CView::OnKeyDown(nChar, nRepCnt, nFlags);}
. ~- L% k/ Z$ v1 s 这样我们就实现了比较专业的全屏显示的功能,相信肯定会令你设计的软件程序增8 M& y0 i6 h% h( t5 m! r
色不少。 |
zan
|