- 在线时间
- 0 小时
- 最后登录
- 2004-7-1
- 注册时间
- 2004-4-27
- 听众数
- 2
- 收听数
- 0
- 能力
- 0 分
- 体力
- 487 点
- 威望
- 0 点
- 阅读权限
- 150
- 积分
- 104
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 24
- 主题
- 21
- 精华
- 0
- 分享
- 0
- 好友
- 0
该用户从未签到
国际赛参赛者
 |
全屏显示是一些应用软件程序必不可少的功能。比如在用VC++编辑工程源文件或
2 j ^* ~" B! f$ Y, n6 ?编辑对话框等资源时,选择菜单“View\Full Screen”,即可进入全屏显示状态,按“ I5 Y3 |* A& j5 S+ J
Esc”键后会退出全屏显示状态。
% R( G2 X4 x$ ^9 s. F3 T% [% l 在VC++6.0中我们用AppWizard按默认方式生成单文档界面的应用程序框架。下面; X! h5 n" v% a1 O
将先讨论点击菜单项“View\Full Screen”实现全屏显示的方法,再讲述按“Esc”键后3 K: q4 c3 z$ R
如何退出全屏显示状态。6 V$ m' y! Y3 Q+ U" {+ y
1) 在CMainFrame类中,增加如下三个成员变量。, R6 e4 B7 }; W; T% q
class CMainFrame : public CFrameWnd" H; ~& x' Z/ N( Y4 L
{ private: //自己添加的三个成员变量) T" [5 x1 }# {6 @# p! q
WINDOWPLACEMENT m_OldWndPlacement; //用来保存原窗口位置
: N( g: D* S( J% g+ R# m8 c. f/* typedef struct tagWINDOWPLACEMENT { /* wndpl */& G! C7 \) f. X6 e6 N$ t1 y0 Q! d
UINT length;
2 o8 G+ P! m8 m' C+ Z P UINT flags;2 D0 J# X) b# I3 c: d
UINT showCmd;
3 c1 j, a5 U' r6 i& F t' S POINT ptMinPosition;
) S+ G1 z2 I! P, j) C POINT ptMaxPosition;
" r |- u5 T4 a8 `6 }* \ RECT rcNormalPosition;1 @+ v& W" f& V o% ]+ D
} WINDOWPLACEMENT;7 w+ K- _' K- s2 j
*/
9 n6 X/ u1 h& u: K5 h BOOL m_bFullScreen; //全屏显示标志
( P8 P) H+ y5 m7 ~7 i- t& v6 b' w CRect m_FullScreenRect; //表示全屏显示时的窗口位置
9 d0 z; \( d7 j8 ^3 Q+ `8 `! L: p protected: CMainFrame();
; s. F' J0 Q2 B9 M3 @1 y' W" r$ A: p DECLARE_DYNCREATE(CMainFrame)} y/ o; X: g+ C8 l+ _% C
2)在资源编辑器中编辑菜单IDR_MAINFRAME。在“View”菜单栏下添加菜单项“Fu
1 ^ a. L8 m- p% |& z, Kll Screen”。在其属性框中,ID设置为ID_FULL_SCREEN,Caption为“Full Screen”。2 X% b5 M! y5 C: w' t" ~
还可以在工具栏中添加新的工具图标,并使之与菜单项“Full Screen”相关联,即将其
1 X2 q) j* Q# v1 v6 fID值也设置为ID_FULL_SCREEN。, P4 ]7 h" d4 T, \" D3 G
3)设计全屏显示处理函数,在CMainFrame类增加上述菜单项ID_FULL_SCREEN消息的
0 y! l; H1 h& K/ H7 b7 a" k) C+ L响应函数。响应函数如下:
8 V( V; n% w* N. b) Z: y void CMainFrame::OnFullScreen()" `$ I6 n2 R* @* g2 m0 x
{GetWindowPlacement(&m_OldWndPlacement);) t2 v: ^+ Y5 t B* l
CRect WindowRect;
) H. e I- k7 Z8 }- L& Z GetWindowRect(&WindowRect);
/ l2 z: U0 J! G CRect ClientRect; \. \& L- M; m/ |; L- ]' K
RepositionBars(0, 0xffff, AFX_IDW_PANE_FIRST, reposQuery, &ClientRect);8 [% l) M; G4 a* c3 d6 x2 h
G6 F& F2 R) h: m, z/ h Q
ClientToScreen(&ClientRect);, [2 V$ w0 m B+ S9 j# m
// 获取屏幕的分辨率
$ T- S9 y8 t3 e* ? int nFullWidth=GetSystemMetrics(SM_CXSCREEN);/ ^* N6 y t! z* d- j
int nFullHeight=GetSystemMetrics(SM_CYSCREEN);: u, y. K" L& \# M) O3 T& o
// 将除控制条外的客户区全屏显示到从(0,0)到(nFullWidth, nFullHeight)区域
* { X3 A$ J7 |4 b& O" q. Z. G, 将(0,0)和(nFullWidth, nFullHeight)两个点外扩充原窗口和除控制条之外的 客户区
1 B2 M6 ]7 p' ~4 P* `位置间的差值, 就得到全屏显示的窗口位置" p3 _: V5 p( Z* X+ q' Q0 s
m_FullScreenRect.left=WindowRect.left-ClientRect.left;/ C7 B$ P' P3 b! {
m_FullScreenRect.top=WindowRect.top-ClientRect.top;) |4 V+ s5 h( L2 A& R/ n
m_FullScreenRect.right=WindowRect.right-ClientRect.right+nFullWidth;3 e7 `% n: g( n9 o0 F, H
m_FullScreenRect.bottom=WindowRect.bottom-ClientRect.bottom+nFullHeigh# S z" @3 o/ I8 }# L
t;
- k K9 {+ e+ A m_bFullScreen=TRUE; // 设置全屏显示标志为 TRUE
* m& L! G/ _( \! y7 i" p' Z // 进入全屏显示状态
; w) I, l8 @5 D# G* ~ WINDOWPLACEMENT wndpl;
! _9 f" J2 X1 @" L9 p/ G wndpl.length=sizeof(WINDOWPLACEMENT);
6 n' c1 P0 T$ ]1 o6 Q, o( t' M wndpl.flags=0;+ z4 e' g2 m' O0 g' d
wndpl.showCmd=SW_SHOWNORMAL;+ g# E8 d# P# Y" S% P; e
wndpl.rcNormalPosition=m_FullScreenRect;
+ ]4 s# k& u$ s: w9 H( p SetWindowPlacement(&wndpl);}
1 [6 W( s& t% ]0 r9 ^5 ` 4)重载CMainFrame类的OnGetMinMaxInfo函数,在全屏显示时提供全屏显示的位置' J0 y2 o/ v q; g2 B
信息。
( C+ N! |9 J+ ?% @9 `( |: F void CMainFrame::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)
1 D+ Y- p2 D y+ J1 z- _: k- ]% c {if(m_bFullScreen)
) P6 b1 Q4 T; x2 K {lpMMI->ptMaxSize.x=m_FullScreenRect.Width();$ q* D( S9 Y5 }0 x5 T+ |
lpMMI->ptMaxSize.y=m_FullScreenRect.Height();
0 x1 n" k4 |0 b9 P7 b$ G lpMMI->ptMaxPosition.x=m_FullScreenRect.Width();9 B* }# G* R8 ~; p: x5 }
lpMMI->ptMaxPosition.y=m_FullScreenRect.Height();
{2 L# k5 C6 B& ?1 H# W7 q+ w3 ~ // 最大的Track尺寸也要改变
( X h* ]8 ]5 H lpMMI->ptMaxTrackSize.x=m_FullScreenRect.Width();
+ X' J2 E" f& c7 a% S7 S lpMMI->ptMaxTrackSize.y=m_FullScreenRect.Height();
9 l, q$ c, S3 O2 p$ X" ~ }CFrameWnd::OnGetMinMaxInfo(lpMMI) ; p h$ Y0 j7 P& C0 m( D
}完成上面的编程后,可以联编执行FullScreen.exe,选择菜单“View\Full Scree# v2 [( B( v+ N$ `# N/ ~1 ]
n”或点击与之关联的工具栏按钮即可进入全屏显示状态。但现在还需要增加用户退出全# q( |6 t) u9 b6 W
屏显示状态的操作接口,下面讲述如何编程实现按“Esc”键退出全屏显示状态。! {, j% m7 g8 b
1)在ClassView中选中CMainFrame并单击鼠标右键,选择“Add Member Function.
& r% p7 `! Z' i/ ]; h g( S( L* [..”,添加public类型的成员函数EndFullScreen,该函数将完成退出全屏显示的操作。" V# k# n* e8 y8 @: l* i4 R
2 E" I! E2 ?& S# I
void CMainFrame::EndFullScreen()
7 i; n% w* d+ V7 p2 p0 ?9 a6 E {if(m_bFullScreen)
) _4 d7 T' U. S9 G; O1 A3 ` H {// 退出全屏显示, 恢复原窗口显示1 W, k+ f8 t, n5 `+ g
ShowWindow(SW_HIDE);
/ b4 ^& |2 m; n3 m D, ^ SetWindowPlacement(&m_OldWndPlace?$ X* T0 z X6 G! S
ment);}}
: k5 {& _; @% d8 s 2)函数EndFullScreen可以退出全屏显示状态,问题是如何在“Esc”键被按下之后
" m" `7 U& j# W! W3 j; F4 C* _调用执行此函数。由于视图类可以处理键盘输入的有关消息(如WM_KEYDOWN表示用户按* D o6 l9 n' ?4 C
下了某一个键),我们将在视图类CFullScreenView中添加处理按键消息WM_KEYDOWN的响
6 r# N( T8 U" o: ?8 P应函数OnKeyDown。判断如果按的键为“Esc”键,则调用CMainFrame类的函数EndFullS
0 C9 E0 G1 M/ G; ]1 ccreen,便可退出全屏显示状态。
7 j- I5 c( `- K) v) i. e& m void CFullScreenView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
8 ~" N9 e. |4 N1 `- x4 g {if(nChar==VK_ESCAPE) // 如果按的键为Esc键
. n/ D. `: R1 x! [# R' Q3 {, ]- x {// 获取主框架窗口的指针
; D* x. u# z( ~0 e6 w0 ]6 l& C, I CMainFrame *pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd;
4 A: j7 H6 b9 K* Q9 b3 N! `" A // 调用主窗口类的自定义函数 EndFullScreen ,便可退出全屏显示状态
; v! r, v; z" b: V3 } pFrame->EndFullScreen();}
8 K& h$ B& u- l1 g* R6 U% C CView::OnKeyDown(nChar, nRepCnt, nFlags);}8 v: _+ w: H4 E& C
这样我们就实现了比较专业的全屏显示的功能,相信肯定会令你设计的软件程序增9 j+ M, x# A7 j+ m" N0 K
色不少。 |
zan
|