数学建模社区-数学中国
标题:
在VC++6.0开发中实现全屏显示(转载)
[打印本页]
作者:
loveyuan
时间:
2004-4-30 10:41
标题:
在VC++6.0开发中实现全屏显示(转载)
全屏显示是一些应用软件程序必不可少的功能。比如在用VC++编辑工程源文件或
' N- ^8 z/ y$ T% L4 w$ I) c
编辑对话框等资源时,选择菜单“View\Full Screen”,即可进入全屏显示状态,按“
7 a+ K# T0 z- m0 l' g* ^ k5 }2 O
Esc”键后会退出全屏显示状态。
0 r; h ]; X: {7 O* O' Y
在VC++6.0中我们用AppWizard按默认方式生成单文档界面的应用程序框架。下面
7 R; ?) O) F* Y. K! L, D' I
将先讨论点击菜单项“View\Full Screen”实现全屏显示的方法,再讲述按“Esc”键后
- m; V$ u& o- B2 Z+ X6 `
如何退出全屏显示状态。
% _5 h" `$ f) H
1) 在CMainFrame类中,增加如下三个成员变量。
! \. F# [) T/ p
class CMainFrame : public CFrameWnd
# U3 o: _5 g. p# {7 L) h
{ private: //自己添加的三个成员变量
P3 f/ |* o* b7 y1 T, Q
WINDOWPLACEMENT m_OldWndPlacement; //用来保存原窗口位置
* b5 {! p2 S5 L2 ^$ N& m% R
/* typedef struct tagWINDOWPLACEMENT { /* wndpl */
3 h7 y" q: \! t& ] L
UINT length;
3 o$ j: J% c; r1 V3 H9 i. N
UINT flags;
3 v o: ~5 M& j W4 x
UINT showCmd;
& N8 E3 Q2 [- U2 O* X
POINT ptMinPosition;
: @2 m9 U, i: o! ~5 f3 v' R
POINT ptMaxPosition;
& w7 j' F2 L, J. y4 u: z( m
RECT rcNormalPosition;
6 U, s. \5 E& k8 m* o
} WINDOWPLACEMENT;
! C9 B' @5 A) I8 s& G' M( S
*/
/ t4 b# d0 D' u1 ]0 K% t1 O$ |
BOOL m_bFullScreen; //全屏显示标志
" I6 Q- l" B1 L, f. ^: w0 C
CRect m_FullScreenRect; //表示全屏显示时的窗口位置
! I z0 A( ^$ ~3 z/ _- M4 N4 p) e
protected: CMainFrame();
+ \, ?' p) ?5 }5 k9 i
DECLARE_DYNCREATE(CMainFrame)}
$ |9 j. v2 ~6 Q
2)在资源编辑器中编辑菜单IDR_MAINFRAME。在“View”菜单栏下添加菜单项“Fu
# _7 t( `, f: K! |
ll Screen”。在其属性框中,ID设置为ID_FULL_SCREEN,Caption为“Full Screen”。
2 x1 D. v7 h$ C+ ?3 d2 R
还可以在工具栏中添加新的工具图标,并使之与菜单项“Full Screen”相关联,即将其
3 X3 V" j" w ?* |, y3 o0 ^
ID值也设置为ID_FULL_SCREEN。
7 C; J- ?+ n1 _& G7 i
3)设计全屏显示处理函数,在CMainFrame类增加上述菜单项ID_FULL_SCREEN消息的
( @0 o6 O# x% R
响应函数。响应函数如下:
2 w3 Z- P! }* Q: e: _! ^3 J5 I+ X
void CMainFrame::OnFullScreen()
6 ?. o4 [6 ?+ I: d% g) e
{GetWindowPlacement(&m_OldWndPlacement);
. @$ }" A" o' |6 h" z1 Q
CRect WindowRect;
5 Y' h* Y7 H3 U( |6 Q A2 s9 X4 D
GetWindowRect(&WindowRect);
) q3 e2 \% @2 t) L8 G8 g- s
CRect ClientRect;
0 S; Q/ }/ t0 j
RepositionBars(0, 0xffff, AFX_IDW_PANE_FIRST, reposQuery, &ClientRect);
7 S$ b9 W5 y5 o7 x* @
( a6 e! y$ T& _8 J7 `& v" m
ClientToScreen(&ClientRect);
. @( T, |4 N1 z
// 获取屏幕的分辨率
* k: z8 O) L. ~7 f8 U! T
int nFullWidth=GetSystemMetrics(SM_CXSCREEN);
# k1 ~& u z/ O _$ U
int nFullHeight=GetSystemMetrics(SM_CYSCREEN);
, _+ t; U/ k& u( i6 q
// 将除控制条外的客户区全屏显示到从(0,0)到(nFullWidth, nFullHeight)区域
$ s2 U( ^2 l+ c4 r
, 将(0,0)和(nFullWidth, nFullHeight)两个点外扩充原窗口和除控制条之外的 客户区
, K5 E7 k6 `" Z- H9 Y" R) U
位置间的差值, 就得到全屏显示的窗口位置
W! u1 j. I1 r# l# [2 m
m_FullScreenRect.left=WindowRect.left-ClientRect.left;
( E5 v/ d. g% L# f* h$ K G. n
m_FullScreenRect.top=WindowRect.top-ClientRect.top;
+ y, K& U: a+ x/ I6 \- H
m_FullScreenRect.right=WindowRect.right-ClientRect.right+nFullWidth;
# P- A5 N4 D% `" h9 r& t
m_FullScreenRect.bottom=WindowRect.bottom-ClientRect.bottom+nFullHeigh
: M. `4 e8 @$ `+ a1 K
t;
8 i' s S: G% u
m_bFullScreen=TRUE; // 设置全屏显示标志为 TRUE
7 W+ N; `* n L0 x! z
// 进入全屏显示状态
7 y- V; Y( K* {8 K
WINDOWPLACEMENT wndpl;
7 B% l: B& K' ?( \+ c' I
wndpl.length=sizeof(WINDOWPLACEMENT);
j& v' o2 B7 ]1 ], U! t2 w2 _
wndpl.flags=0;
; F9 n8 q: J; v H" C/ ]* P
wndpl.showCmd=SW_SHOWNORMAL;
^2 G7 c# `8 \* q* F
wndpl.rcNormalPosition=m_FullScreenRect;
+ w! `2 c/ H1 M
SetWindowPlacement(&wndpl);}
9 F- D0 y2 n+ a5 W) v0 m
4)重载CMainFrame类的OnGetMinMaxInfo函数,在全屏显示时提供全屏显示的位置
. f- l# _7 o1 D0 M' i
信息。
3 W4 R/ g: a' A8 _
void CMainFrame::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)
1 A3 o0 }8 i0 Q. O
{if(m_bFullScreen)
/ B7 k( N) p" o' _: c; L) E$ q( Z5 T
{lpMMI->ptMaxSize.x=m_FullScreenRect.Width();
: z, k: u+ K# G0 W
lpMMI->ptMaxSize.y=m_FullScreenRect.Height();
! K4 y9 ^8 t: j( _1 ]5 y& q
lpMMI->ptMaxPosition.x=m_FullScreenRect.Width();
+ \8 ?4 \* q6 o8 Z7 d( E
lpMMI->ptMaxPosition.y=m_FullScreenRect.Height();
& S' x, o! s4 S1 W! V- f2 a
// 最大的Track尺寸也要改变
6 Y2 b7 n( s% |0 r* ^
lpMMI->ptMaxTrackSize.x=m_FullScreenRect.Width();
8 k6 l% n5 h* Q( k7 H% u
lpMMI->ptMaxTrackSize.y=m_FullScreenRect.Height();
) { N3 `. B9 d
}CFrameWnd::OnGetMinMaxInfo(lpMMI) ;
% P% ~3 k) p$ N+ ]7 u% F
}完成上面的编程后,可以联编执行FullScreen.exe,选择菜单“View\Full Scree
& d' m f4 [& i0 ^" U
n”或点击与之关联的工具栏按钮即可进入全屏显示状态。但现在还需要增加用户退出全
9 ?% B$ {) f- {7 Q
屏显示状态的操作接口,下面讲述如何编程实现按“Esc”键退出全屏显示状态。
/ E5 R6 D m# e$ U$ e8 {6 O( {
1)在ClassView中选中CMainFrame并单击鼠标右键,选择“Add Member Function.
" l0 i2 {6 F% i
..”,添加public类型的成员函数EndFullScreen,该函数将完成退出全屏显示的操作。
8 u4 r7 a% d: \' p# t, v$ I& v
; `1 k5 R# E/ ^
void CMainFrame::EndFullScreen()
; M' |9 x0 x/ F% f% m5 g# d
{if(m_bFullScreen)
4 M/ P* j: j6 l) k
{// 退出全屏显示, 恢复原窗口显示
5 G. S1 f) }( I j+ s+ Z
ShowWindow(SW_HIDE);
* h- X' g) n% s7 |1 B" ^
SetWindowPlacement(&m_OldWndPlace?
- H f5 f* [! g
ment);}}
/ X; ]$ J/ @! d# g, {- r
2)函数EndFullScreen可以退出全屏显示状态,问题是如何在“Esc”键被按下之后
+ [7 N. ?% F, v7 R' R |
调用执行此函数。由于视图类可以处理键盘输入的有关消息(如WM_KEYDOWN表示用户按
) N, z1 P6 N$ F9 U' Q: t1 ]
下了某一个键),我们将在视图类CFullScreenView中添加处理按键消息WM_KEYDOWN的响
: x' ]5 @" Q3 S9 I" ?: }% T& V1 y
应函数OnKeyDown。判断如果按的键为“Esc”键,则调用CMainFrame类的函数EndFullS
2 A7 ]# M9 F7 z8 ]" c: J
creen,便可退出全屏显示状态。
: F6 W; i: ~8 e$ r# r R
void CFullScreenView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
/ M4 X( @4 L: B5 r: N3 N
{if(nChar==VK_ESCAPE) // 如果按的键为Esc键
, u4 a/ m# r; e" k7 k; D
{// 获取主框架窗口的指针
5 K) J8 Y5 o$ _
CMainFrame *pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd;
( a, D J6 L) B# N6 v7 w& b
// 调用主窗口类的自定义函数 EndFullScreen ,便可退出全屏显示状态
# p; p9 t$ c; q a) X0 a( [5 D9 g- T
pFrame->EndFullScreen();}
. {9 H# q" [! M. Q" Q2 b( s! b' P
CView::OnKeyDown(nChar, nRepCnt, nFlags);}
8 n8 S9 I; |- j( ? U. P8 C
这样我们就实现了比较专业的全屏显示的功能,相信肯定会令你设计的软件程序增
) L( M9 Y( M1 b# G& r l
色不少。
作者:
shuiqingchan
时间:
2010-5-13 00:50
好东西,值得借鉴!!!!!!!!!!!!!!!!!!
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5