- 在线时间
- 0 小时
- 最后登录
- 2004-7-1
- 注册时间
- 2004-4-27
- 听众数
- 2
- 收听数
- 0
- 能力
- 0 分
- 体力
- 487 点
- 威望
- 0 点
- 阅读权限
- 150
- 积分
- 104
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 24
- 主题
- 21
- 精华
- 0
- 分享
- 0
- 好友
- 0
该用户从未签到
国际赛参赛者
 |
全屏显示是一些应用软件程序必不可少的功能。比如在用VC++编辑工程源文件或+ ~3 ]+ k" X/ p# H/ ^$ c
编辑对话框等资源时,选择菜单“View\Full Screen”,即可进入全屏显示状态,按“8 A& ]9 F+ W0 Y' b3 O Q
Esc”键后会退出全屏显示状态。
9 V7 d. P5 J8 X: T9 O 在VC++6.0中我们用AppWizard按默认方式生成单文档界面的应用程序框架。下面0 c( s# y: d6 \+ w0 Z! L
将先讨论点击菜单项“View\Full Screen”实现全屏显示的方法,再讲述按“Esc”键后
0 t2 O! y$ d1 z m如何退出全屏显示状态。
0 ]' |, {3 `, X- Y( C 1) 在CMainFrame类中,增加如下三个成员变量。/ a2 [- C/ n) q4 J
class CMainFrame : public CFrameWnd# }0 M2 }2 }. Y' w0 Y& G5 U" t9 r5 f; y
{ private: //自己添加的三个成员变量
8 `4 N* R7 N3 n% s$ `6 u WINDOWPLACEMENT m_OldWndPlacement; //用来保存原窗口位置" s: g# @, E) E8 \, p" z
/* typedef struct tagWINDOWPLACEMENT { /* wndpl */
8 z* D! e8 [. U6 o+ j! k8 g UINT length;, X6 b- L6 M' Z9 g, V
UINT flags;
g% c8 j. j% o `& U UINT showCmd;7 B8 z" \; c8 R# o* B& {% ^
POINT ptMinPosition;4 W `4 K( s& M/ D3 @* x6 j
POINT ptMaxPosition;3 ~; {* W% |2 c Q& Q
RECT rcNormalPosition;
\7 Q; O9 g1 I* D# L } WINDOWPLACEMENT;
* L" Y$ J" _$ h2 X0 E/ f*/: W) \: M' w- Q+ s
BOOL m_bFullScreen; //全屏显示标志4 S! {: ? r5 @' _
CRect m_FullScreenRect; //表示全屏显示时的窗口位置
+ e% |" [& C5 o) s2 h5 ^ protected: CMainFrame();
3 ]8 n( A. H4 L, y+ A5 e DECLARE_DYNCREATE(CMainFrame)}* L" A O4 u& J
2)在资源编辑器中编辑菜单IDR_MAINFRAME。在“View”菜单栏下添加菜单项“Fu
8 O! m/ y' ], o* T5 z( i0 Ill Screen”。在其属性框中,ID设置为ID_FULL_SCREEN,Caption为“Full Screen”。
( p: Z* q2 t3 u7 K# O! M还可以在工具栏中添加新的工具图标,并使之与菜单项“Full Screen”相关联,即将其( c9 ]1 ]( n! Q6 a
ID值也设置为ID_FULL_SCREEN。7 D4 H# t U. R( P( n3 n
3)设计全屏显示处理函数,在CMainFrame类增加上述菜单项ID_FULL_SCREEN消息的+ x* n. _/ p3 a. a& D0 ^3 v
响应函数。响应函数如下:
- n; G5 W( S& Q+ X3 d void CMainFrame::OnFullScreen()7 x5 l( z6 g. N. Q" Q
{GetWindowPlacement(&m_OldWndPlacement);
. [# Q/ B5 @' s+ K* V* F CRect WindowRect;
& V' F6 C: J3 H' h. s GetWindowRect(&WindowRect);) `6 f. C6 b+ P# Y* s
CRect ClientRect;
: |$ K. V5 T9 t* O. u1 j- X RepositionBars(0, 0xffff, AFX_IDW_PANE_FIRST, reposQuery, &ClientRect);
8 L5 G- C/ v. b: C
; V& O2 _8 C. z' z6 w7 G ClientToScreen(&ClientRect);
% W) r( z9 `0 g: q [ // 获取屏幕的分辨率
3 [% _' c$ ~4 Z3 P int nFullWidth=GetSystemMetrics(SM_CXSCREEN);
. b( J+ V3 V/ P5 n# i int nFullHeight=GetSystemMetrics(SM_CYSCREEN);
8 j* [, O8 D# N! e+ V // 将除控制条外的客户区全屏显示到从(0,0)到(nFullWidth, nFullHeight)区域0 d9 j' V1 }4 {1 y7 K7 q; {6 N: J$ W
, 将(0,0)和(nFullWidth, nFullHeight)两个点外扩充原窗口和除控制条之外的 客户区
* z2 Y5 w- ]+ |! l位置间的差值, 就得到全屏显示的窗口位置
+ U' R; x( h. Q. k m_FullScreenRect.left=WindowRect.left-ClientRect.left;! r5 G) t9 u1 y+ G
m_FullScreenRect.top=WindowRect.top-ClientRect.top;
- k+ |. H8 a* p2 V8 m6 | m_FullScreenRect.right=WindowRect.right-ClientRect.right+nFullWidth;
: q8 u& C1 i& {7 ]4 ^" v$ Q m_FullScreenRect.bottom=WindowRect.bottom-ClientRect.bottom+nFullHeigh& p, M0 _+ H9 }
t;
/ t# w2 k: Q8 ^" u$ m- z; L m_bFullScreen=TRUE; // 设置全屏显示标志为 TRUE
+ f9 b" c* R) D% d# p* A4 a8 r // 进入全屏显示状态' N) R6 s. e& R
WINDOWPLACEMENT wndpl;1 S/ \% T) ]# O" r- C
wndpl.length=sizeof(WINDOWPLACEMENT);
3 k G, i$ r$ @% w v( a2 G wndpl.flags=0;/ ~3 A0 p8 \6 R/ c. a
wndpl.showCmd=SW_SHOWNORMAL;
! A4 p! h) Z F; e% B wndpl.rcNormalPosition=m_FullScreenRect;
1 \; B) v7 e1 |2 O SetWindowPlacement(&wndpl);}+ {& L7 r6 b0 ]! M& f, ~, G
4)重载CMainFrame类的OnGetMinMaxInfo函数,在全屏显示时提供全屏显示的位置/ i, o" d6 C8 T& m. p/ L
信息。
3 ~4 F. h; R0 B. p. b void CMainFrame::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)
; d6 r# T, E5 {7 U; g {if(m_bFullScreen)
% @2 Z, D0 r% o! h' o {lpMMI->ptMaxSize.x=m_FullScreenRect.Width();
2 i5 M w% O2 |6 V lpMMI->ptMaxSize.y=m_FullScreenRect.Height();
7 O# I M1 G1 Q7 {, }# E$ ` lpMMI->ptMaxPosition.x=m_FullScreenRect.Width();
4 _3 e1 g( J3 \# A5 o Y& t lpMMI->ptMaxPosition.y=m_FullScreenRect.Height();
( ?" E% m: Q! X) N) @ // 最大的Track尺寸也要改变
5 D' c8 q/ E- f- Y" T$ P* t lpMMI->ptMaxTrackSize.x=m_FullScreenRect.Width();
8 U6 ?: \, E L7 k, G0 H9 N' R, H lpMMI->ptMaxTrackSize.y=m_FullScreenRect.Height();7 G9 n- d* ^- `' I* ?
}CFrameWnd::OnGetMinMaxInfo(lpMMI) ;6 D1 m- M P& z$ H% K/ W# _6 p' Y( D
}完成上面的编程后,可以联编执行FullScreen.exe,选择菜单“View\Full Scree3 ~0 |7 Y- j4 I( i4 v( P) M
n”或点击与之关联的工具栏按钮即可进入全屏显示状态。但现在还需要增加用户退出全
' j0 ~6 T% z/ m$ A( ^7 W$ v屏显示状态的操作接口,下面讲述如何编程实现按“Esc”键退出全屏显示状态。1 x9 E5 I8 B* [. b. ?2 b
1)在ClassView中选中CMainFrame并单击鼠标右键,选择“Add Member Function.7 I$ q; {- A8 g, S- f; T2 N8 t6 B0 P
..”,添加public类型的成员函数EndFullScreen,该函数将完成退出全屏显示的操作。% f! D" |( ~% O& ?" o- B/ t
" V5 a: {2 M7 X+ n# I
void CMainFrame::EndFullScreen()+ ?) L( K. R; ] f
{if(m_bFullScreen)
4 ^) M8 U y; k l6 T: \) Y9 b {// 退出全屏显示, 恢复原窗口显示0 w% `1 G8 u& `) @& b8 Z
ShowWindow(SW_HIDE);
4 o! M o5 T2 a SetWindowPlacement(&m_OldWndPlace?
8 g, I1 `; s4 _& Dment);}}
) V/ B! ?3 J1 ]/ J; F' j x* ] 2)函数EndFullScreen可以退出全屏显示状态,问题是如何在“Esc”键被按下之后1 K& f, c# c4 h0 x |
调用执行此函数。由于视图类可以处理键盘输入的有关消息(如WM_KEYDOWN表示用户按0 L- Z3 e/ e1 ]( B0 m
下了某一个键),我们将在视图类CFullScreenView中添加处理按键消息WM_KEYDOWN的响
! n& X0 d7 v, _# U应函数OnKeyDown。判断如果按的键为“Esc”键,则调用CMainFrame类的函数EndFullS3 z2 ~2 w' o+ D" Q0 R5 N1 `
creen,便可退出全屏显示状态。
- |7 R' C" H2 R9 R' O void CFullScreenView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
% _ f2 d' {7 v5 x2 y7 E1 l* v {if(nChar==VK_ESCAPE) // 如果按的键为Esc键7 I6 K4 p1 `9 p5 J
{// 获取主框架窗口的指针- l+ m% O% L/ q7 y- n$ l
CMainFrame *pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd;
9 l) w) k5 u. l // 调用主窗口类的自定义函数 EndFullScreen ,便可退出全屏显示状态
6 W) B3 ~" I; m2 c5 [1 P pFrame->EndFullScreen();}
" Z% \9 s* K( L8 u CView::OnKeyDown(nChar, nRepCnt, nFlags);}
- u: r1 k* ~0 K7 ^. O 这样我们就实现了比较专业的全屏显示的功能,相信肯定会令你设计的软件程序增
/ T! c( h, y: l7 U色不少。 |
zan
|