- 在线时间
- 0 小时
- 最后登录
- 2004-7-1
- 注册时间
- 2004-4-27
- 听众数
- 2
- 收听数
- 0
- 能力
- 0 分
- 体力
- 487 点
- 威望
- 0 点
- 阅读权限
- 150
- 积分
- 104
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 24
- 主题
- 21
- 精华
- 0
- 分享
- 0
- 好友
- 0
该用户从未签到
国际赛参赛者
 |
全屏显示是一些应用软件程序必不可少的功能。比如在用VC++编辑工程源文件或! Z) A% P \4 c! e9 x5 K) ?
编辑对话框等资源时,选择菜单“View\Full Screen”,即可进入全屏显示状态,按“! F- H* T, M1 i
Esc”键后会退出全屏显示状态。
1 s6 u x& |2 ? 在VC++6.0中我们用AppWizard按默认方式生成单文档界面的应用程序框架。下面
, o. l# } t4 @1 X将先讨论点击菜单项“View\Full Screen”实现全屏显示的方法,再讲述按“Esc”键后
4 q: g2 l0 H3 w& ?" }. }9 M如何退出全屏显示状态。
* X- G" n- R. R$ E; F3 } 1) 在CMainFrame类中,增加如下三个成员变量。
( P/ ^! @: b8 U: A2 R7 b- z class CMainFrame : public CFrameWnd
" F) r$ c% o, T$ W' o/ D+ L; n { private: //自己添加的三个成员变量
* Y- n' r: v( R* u1 v4 u1 _ WINDOWPLACEMENT m_OldWndPlacement; //用来保存原窗口位置
3 {8 O4 E r/ c1 X3 x' @/* typedef struct tagWINDOWPLACEMENT { /* wndpl */
* g/ U4 W- v- x: h8 x UINT length;7 V$ k& x1 u* L
UINT flags;
# i, _& c6 f9 h7 E% _/ K r UINT showCmd;
8 c5 e' H2 V) |- n1 j" j POINT ptMinPosition;& J# U% }+ t- f% v& {$ n
POINT ptMaxPosition;
' G; J2 u! m3 p7 h6 b1 v RECT rcNormalPosition;
8 b+ R: v% v" W8 ` } WINDOWPLACEMENT;' B! w5 r+ {' O9 N2 G" p0 ^2 _
*/
; O9 G+ Z/ b! w# {% ?7 b BOOL m_bFullScreen; //全屏显示标志" m* _, \, V3 n
CRect m_FullScreenRect; //表示全屏显示时的窗口位置
: K' h3 G: ]9 I8 U protected: CMainFrame();2 z9 x/ v# B& Q# J; I# l
DECLARE_DYNCREATE(CMainFrame)}
/ ]* M4 [$ L i' x 2)在资源编辑器中编辑菜单IDR_MAINFRAME。在“View”菜单栏下添加菜单项“Fu+ s7 P$ Z, t) J+ v, D. c: P. ~
ll Screen”。在其属性框中,ID设置为ID_FULL_SCREEN,Caption为“Full Screen”。
. u {( z( S3 p0 \& z还可以在工具栏中添加新的工具图标,并使之与菜单项“Full Screen”相关联,即将其- V, M( c6 m( Y. ]/ s
ID值也设置为ID_FULL_SCREEN。- u- R: ~' \1 w( J/ ^
3)设计全屏显示处理函数,在CMainFrame类增加上述菜单项ID_FULL_SCREEN消息的
6 I$ J) C. u) \1 R2 x响应函数。响应函数如下:
: U& D. t6 _. i# o( L, @. _( [ void CMainFrame::OnFullScreen()
/ D; f' I/ ^' {1 `7 n4 k {GetWindowPlacement(&m_OldWndPlacement);3 Q$ i v' b! F3 c; l& \" p( P
CRect WindowRect;1 m( |3 R! x! I6 ~3 p/ T% Z6 Z
GetWindowRect(&WindowRect);
) F8 g$ u2 v7 `6 \- a, j6 T0 M% M CRect ClientRect;, q# U1 d. y( i9 R% X3 y% A
RepositionBars(0, 0xffff, AFX_IDW_PANE_FIRST, reposQuery, &ClientRect);
1 [! R. O2 k' O8 P( O, `- f4 {7 U* t: `, Y6 ?1 `* K
ClientToScreen(&ClientRect);1 p. m6 K8 W& o. _* {! {" f8 A
// 获取屏幕的分辨率
. `1 F3 @! A: ~7 h( |; _( R int nFullWidth=GetSystemMetrics(SM_CXSCREEN);% ]% D a- B) y. n. z
int nFullHeight=GetSystemMetrics(SM_CYSCREEN);! D/ H& p" O8 {# T+ F
// 将除控制条外的客户区全屏显示到从(0,0)到(nFullWidth, nFullHeight)区域5 }& k9 g0 f4 @
, 将(0,0)和(nFullWidth, nFullHeight)两个点外扩充原窗口和除控制条之外的 客户区" B6 B/ U. R' i: J( \7 v/ F' j& b
位置间的差值, 就得到全屏显示的窗口位置
: B8 t+ |7 Z2 ^3 G m_FullScreenRect.left=WindowRect.left-ClientRect.left;
( A7 U$ e# q7 [4 C1 m* ] m_FullScreenRect.top=WindowRect.top-ClientRect.top;( q1 K/ u" T$ v$ p% _! U+ |9 _
m_FullScreenRect.right=WindowRect.right-ClientRect.right+nFullWidth;2 ^1 L0 _8 M$ A2 ]9 ^3 t# v3 w
m_FullScreenRect.bottom=WindowRect.bottom-ClientRect.bottom+nFullHeigh
& S4 {% O$ I6 Pt;+ G- ?% ^5 Z& W" u4 r
m_bFullScreen=TRUE; // 设置全屏显示标志为 TRUE& q% u, p0 p& F& O2 A) S
// 进入全屏显示状态
K# c) p$ L9 ]8 T" ~ g WINDOWPLACEMENT wndpl;3 L9 m R% A# ]: n/ k* _
wndpl.length=sizeof(WINDOWPLACEMENT);
8 a* ~( A# m; n7 j$ s" r3 p wndpl.flags=0;
# K/ Z6 c/ b0 T9 p2 V wndpl.showCmd=SW_SHOWNORMAL;! V5 [+ D& W: U. P$ b0 G
wndpl.rcNormalPosition=m_FullScreenRect;" j& M& b& |" ^
SetWindowPlacement(&wndpl);}
$ b! {. J2 Q, F0 q 4)重载CMainFrame类的OnGetMinMaxInfo函数,在全屏显示时提供全屏显示的位置- L) O5 J& ^# O$ O* y5 ~
信息。( \6 x6 X( ~3 F- r$ o
void CMainFrame::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)
& D3 n' ~, {$ K' T$ e {if(m_bFullScreen)' \4 U' J$ O3 [
{lpMMI->ptMaxSize.x=m_FullScreenRect.Width();0 Z# Z: {- U; t. A. ~
lpMMI->ptMaxSize.y=m_FullScreenRect.Height();+ w- t% z( y7 x8 U( |
lpMMI->ptMaxPosition.x=m_FullScreenRect.Width();
1 S: [/ T1 ^$ B% e3 B& R lpMMI->ptMaxPosition.y=m_FullScreenRect.Height();( M+ Z+ X9 X N9 z* v
// 最大的Track尺寸也要改变
% T, d- n3 o, V. Q lpMMI->ptMaxTrackSize.x=m_FullScreenRect.Width();
9 D( `; M! n/ d% K& T) V5 ? lpMMI->ptMaxTrackSize.y=m_FullScreenRect.Height();
7 M& V8 \3 c5 [ W3 z6 h; m }CFrameWnd::OnGetMinMaxInfo(lpMMI) ;
& E! E. `6 G6 E+ E }完成上面的编程后,可以联编执行FullScreen.exe,选择菜单“View\Full Scree, n: Y4 I7 R) D
n”或点击与之关联的工具栏按钮即可进入全屏显示状态。但现在还需要增加用户退出全! j, s! P1 E" [: k9 k9 O2 D
屏显示状态的操作接口,下面讲述如何编程实现按“Esc”键退出全屏显示状态。
) S) W* B6 ]! e5 J5 o+ z 1)在ClassView中选中CMainFrame并单击鼠标右键,选择“Add Member Function.
: @' s! q5 r5 K4 m; p w! L..”,添加public类型的成员函数EndFullScreen,该函数将完成退出全屏显示的操作。
2 @, f$ u+ S; w0 j& [8 J, Z3 c9 O0 M9 e: z+ N3 }% a0 R
void CMainFrame::EndFullScreen()
0 E6 n& F4 c8 E5 F {if(m_bFullScreen)
6 n. ^2 I8 w2 L, z2 _ {// 退出全屏显示, 恢复原窗口显示# S" E7 x0 l! ?. ]8 V$ k
ShowWindow(SW_HIDE);, J- y' o% P6 v) S9 d6 f$ Y
SetWindowPlacement(&m_OldWndPlace?# @8 x# j; _. ]
ment);}}
8 }: |9 a( G/ p4 V 2)函数EndFullScreen可以退出全屏显示状态,问题是如何在“Esc”键被按下之后2 R5 E* Y9 a0 F" a( V
调用执行此函数。由于视图类可以处理键盘输入的有关消息(如WM_KEYDOWN表示用户按
& a" N% w- c5 Y) p下了某一个键),我们将在视图类CFullScreenView中添加处理按键消息WM_KEYDOWN的响
9 Q7 y! {2 j% p应函数OnKeyDown。判断如果按的键为“Esc”键,则调用CMainFrame类的函数EndFullS6 R2 f/ \; i+ `0 G
creen,便可退出全屏显示状态。
7 }8 _! C" F7 B5 Y1 D; w, S void CFullScreenView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
3 ?# {& k/ h g' N% c+ G {if(nChar==VK_ESCAPE) // 如果按的键为Esc键
* q- [! a: g4 O! ]& C {// 获取主框架窗口的指针
6 g+ s; o! M& m CMainFrame *pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd;6 x. O" O5 Q, t. w5 ^1 W! r
// 调用主窗口类的自定义函数 EndFullScreen ,便可退出全屏显示状态9 x! x3 ]# c( _ c+ O( T* O. @' G
pFrame->EndFullScreen();}
- J- i! @: L1 p4 D CView::OnKeyDown(nChar, nRepCnt, nFlags);}) p3 @# n' _9 p- M9 ^5 _$ s
这样我们就实现了比较专业的全屏显示的功能,相信肯定会令你设计的软件程序增7 x) o) R5 f' L+ }
色不少。 |
zan
|