- 在线时间
- 0 小时
- 最后登录
- 2004-7-1
- 注册时间
- 2004-4-27
- 听众数
- 2
- 收听数
- 0
- 能力
- 0 分
- 体力
- 487 点
- 威望
- 0 点
- 阅读权限
- 150
- 积分
- 104
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 24
- 主题
- 21
- 精华
- 0
- 分享
- 0
- 好友
- 0
该用户从未签到
国际赛参赛者
 |
全屏显示是一些应用软件程序必不可少的功能。比如在用VC++编辑工程源文件或
" P# q# \5 \+ Y$ N编辑对话框等资源时,选择菜单“View\Full Screen”,即可进入全屏显示状态,按“
2 ` D( `0 [) S) `: _7 PEsc”键后会退出全屏显示状态。
2 z% {* p* H! D5 O8 W+ c 在VC++6.0中我们用AppWizard按默认方式生成单文档界面的应用程序框架。下面; J9 b! J' |7 m2 Z
将先讨论点击菜单项“View\Full Screen”实现全屏显示的方法,再讲述按“Esc”键后" G$ [7 d5 `, e2 }
如何退出全屏显示状态。
6 n- n* _' A# g2 ]! g+ c+ U+ } 1) 在CMainFrame类中,增加如下三个成员变量。
* I2 F3 Z5 A1 i6 Z1 J! |& D! \. H6 S class CMainFrame : public CFrameWnd- U) X' ^: f0 l+ O' s$ Q
{ private: //自己添加的三个成员变量
& ~& Z$ O* @7 ?* V( s WINDOWPLACEMENT m_OldWndPlacement; //用来保存原窗口位置
( \8 A2 o7 _2 G5 Y5 j( \% y/* typedef struct tagWINDOWPLACEMENT { /* wndpl */& C+ v8 V7 ^9 G$ M# r+ |# g
UINT length;
, H( ]2 F( {) F8 Y8 _ UINT flags;( Q' i5 G* Z$ Q0 ]$ H
UINT showCmd;
+ s: V- M) r5 @3 L% f; p POINT ptMinPosition;# u" e0 R( q, v( T; g
POINT ptMaxPosition;
e0 q% w; K8 k6 S3 k RECT rcNormalPosition;
) q+ T- O2 o! |+ Y } WINDOWPLACEMENT;
0 h) K% q/ y) ^! C4 f*/
8 g% J; G4 N6 x; s1 l: X0 T, s$ d BOOL m_bFullScreen; //全屏显示标志! S* Y* ?" ]2 j3 L6 R2 i
CRect m_FullScreenRect; //表示全屏显示时的窗口位置7 P$ S5 |- G0 W" l( S. j
protected: CMainFrame();4 {8 v& k- i* m5 Q5 {
DECLARE_DYNCREATE(CMainFrame)}- D3 Q X+ l% {) [
2)在资源编辑器中编辑菜单IDR_MAINFRAME。在“View”菜单栏下添加菜单项“Fu
5 ?$ j; d9 G, Q1 sll Screen”。在其属性框中,ID设置为ID_FULL_SCREEN,Caption为“Full Screen”。0 g; y( |" i; U) o
还可以在工具栏中添加新的工具图标,并使之与菜单项“Full Screen”相关联,即将其" R$ P2 n! [. \2 p
ID值也设置为ID_FULL_SCREEN。
, P+ f5 X |3 v5 U 3)设计全屏显示处理函数,在CMainFrame类增加上述菜单项ID_FULL_SCREEN消息的: ]- Y& c4 N- w5 `! x+ Y+ q4 O
响应函数。响应函数如下:* o b6 i! W# t5 D9 F7 I: J
void CMainFrame::OnFullScreen()
) M) u* i7 Q3 r" K' G; r {GetWindowPlacement(&m_OldWndPlacement);
% G" P0 u# ^9 P$ R- U8 A0 f CRect WindowRect;
. j6 w5 V% k5 G: E% I GetWindowRect(&WindowRect);
: q3 `2 ^) I0 J4 P& X CRect ClientRect;/ g6 D9 e: U5 d K" X
RepositionBars(0, 0xffff, AFX_IDW_PANE_FIRST, reposQuery, &ClientRect);
# _2 X' a. W9 t
* H2 N5 H7 D3 I+ i8 p ClientToScreen(&ClientRect);
& O4 o8 {4 l4 z# h4 t m // 获取屏幕的分辨率) c; B2 p8 g& |* B7 x0 }( Q2 x
int nFullWidth=GetSystemMetrics(SM_CXSCREEN);
4 w$ a1 W; `, K w% _ int nFullHeight=GetSystemMetrics(SM_CYSCREEN);! k% o) l3 o6 V% C [
// 将除控制条外的客户区全屏显示到从(0,0)到(nFullWidth, nFullHeight)区域/ g( e9 f# k6 }, U, d5 M
, 将(0,0)和(nFullWidth, nFullHeight)两个点外扩充原窗口和除控制条之外的 客户区
! G- F1 n/ K1 k- o位置间的差值, 就得到全屏显示的窗口位置& Q7 ]' K( n3 @7 Z8 w
m_FullScreenRect.left=WindowRect.left-ClientRect.left;, \% r: ~, q4 h2 _" ^6 V
m_FullScreenRect.top=WindowRect.top-ClientRect.top;
9 L4 k, y* l: s# J. m m_FullScreenRect.right=WindowRect.right-ClientRect.right+nFullWidth;
7 X/ a( d1 ]& n+ b( m" c m_FullScreenRect.bottom=WindowRect.bottom-ClientRect.bottom+nFullHeigh
6 v$ t, J% X. ]# ^/ |t;
8 u* e5 c9 t$ T1 K% M: _ m_bFullScreen=TRUE; // 设置全屏显示标志为 TRUE; c+ m- W6 `) g) B- v
// 进入全屏显示状态$ j/ c. R/ D; Q* E$ I
WINDOWPLACEMENT wndpl;
) S D+ W8 u7 E7 V8 T. @2 p# P wndpl.length=sizeof(WINDOWPLACEMENT);0 B# V0 v+ F+ F( x, g) q( H
wndpl.flags=0;
' t" I2 @, A/ r7 k4 ]5 v, M wndpl.showCmd=SW_SHOWNORMAL;
! q2 h/ b' Z. x+ T& {& t$ B2 V0 J" w wndpl.rcNormalPosition=m_FullScreenRect;5 C. w0 R$ |+ G& b- V" X, R$ Q
SetWindowPlacement(&wndpl);}0 V) q4 A! z" L6 B
4)重载CMainFrame类的OnGetMinMaxInfo函数,在全屏显示时提供全屏显示的位置7 L& P S/ A0 W/ y# D. {7 E
信息。2 n# Q9 U' a" J6 a. Z- H
void CMainFrame::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)! z$ w) Z3 w' }6 q: ~
{if(m_bFullScreen)- ` t$ U" }+ Y
{lpMMI->ptMaxSize.x=m_FullScreenRect.Width();
5 v" q6 T5 e5 {2 c lpMMI->ptMaxSize.y=m_FullScreenRect.Height();+ k' ?3 R/ G8 n; E4 F6 P- E
lpMMI->ptMaxPosition.x=m_FullScreenRect.Width();
/ q. X# @0 Q/ f1 Q+ ?% b6 \5 p1 z lpMMI->ptMaxPosition.y=m_FullScreenRect.Height();
5 }0 l$ z* ?: `7 K( k // 最大的Track尺寸也要改变
# O# U' ]* G* Y( }+ Y. C lpMMI->ptMaxTrackSize.x=m_FullScreenRect.Width();
2 G5 s7 V" X, Z7 M7 M lpMMI->ptMaxTrackSize.y=m_FullScreenRect.Height();8 @) s$ ~" e. @
}CFrameWnd::OnGetMinMaxInfo(lpMMI) ;0 X; G- m; G& H* d& t' W0 B$ q0 ?" R
}完成上面的编程后,可以联编执行FullScreen.exe,选择菜单“View\Full Scree
: ^9 n* c8 b: r" H! [n”或点击与之关联的工具栏按钮即可进入全屏显示状态。但现在还需要增加用户退出全/ @& e+ [/ y& g: j. A( V( B. ^7 S7 R
屏显示状态的操作接口,下面讲述如何编程实现按“Esc”键退出全屏显示状态。% H8 f: r# h. A; u
1)在ClassView中选中CMainFrame并单击鼠标右键,选择“Add Member Function.# T, W0 g6 F2 y
..”,添加public类型的成员函数EndFullScreen,该函数将完成退出全屏显示的操作。
* J. {9 R# {5 z: M/ H8 {8 @8 O) T' F3 i
void CMainFrame::EndFullScreen()
3 J8 C+ t( d! j( L: o ~1 J2 k {if(m_bFullScreen)
; y/ U1 b( t5 V* O# g {// 退出全屏显示, 恢复原窗口显示 i& P3 g' L, V$ p6 D8 i
ShowWindow(SW_HIDE);
9 Q" j4 H5 R$ B5 m7 o' g SetWindowPlacement(&m_OldWndPlace?
* {7 [$ ~+ ~; ]/ Gment);}}. B+ n& h" A i. c. \
2)函数EndFullScreen可以退出全屏显示状态,问题是如何在“Esc”键被按下之后7 w3 N( o9 j' L: l/ K
调用执行此函数。由于视图类可以处理键盘输入的有关消息(如WM_KEYDOWN表示用户按/ k9 E$ Y3 x+ A' H! B
下了某一个键),我们将在视图类CFullScreenView中添加处理按键消息WM_KEYDOWN的响
- p3 ?# T2 J# K# k" k' m应函数OnKeyDown。判断如果按的键为“Esc”键,则调用CMainFrame类的函数EndFullS
( W4 Q- x) y: _% g9 qcreen,便可退出全屏显示状态。
7 ]' M, ~5 N; C6 O' S: | void CFullScreenView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)0 b- A1 {3 F# U6 O
{if(nChar==VK_ESCAPE) // 如果按的键为Esc键
1 Z' q0 f& t( j5 j {// 获取主框架窗口的指针/ u# h7 }: W* v1 |
CMainFrame *pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd;
' v( c2 D" Y: f4 D1 q // 调用主窗口类的自定义函数 EndFullScreen ,便可退出全屏显示状态
p, e/ d' _$ Y* y pFrame->EndFullScreen();}
# W" \, x1 R4 L. R8 k/ T CView::OnKeyDown(nChar, nRepCnt, nFlags);}& }% s& F m7 c2 E
这样我们就实现了比较专业的全屏显示的功能,相信肯定会令你设计的软件程序增# I* J. D4 R) c& ?
色不少。 |
zan
|