数学建模社区-数学中国
标题:
在VC++6.0开发中实现全屏显示(转载)
[打印本页]
作者:
loveyuan
时间:
2004-4-30 10:41
标题:
在VC++6.0开发中实现全屏显示(转载)
全屏显示是一些应用软件程序必不可少的功能。比如在用VC++编辑工程源文件或
6 M+ P, O) t) v) m* j: i. z
编辑对话框等资源时,选择菜单“View\Full Screen”,即可进入全屏显示状态,按“
# z ~; I4 L$ ]* R7 R |2 h3 z
Esc”键后会退出全屏显示状态。
5 f2 Z- U5 c5 D' k1 N) R$ [6 S
在VC++6.0中我们用AppWizard按默认方式生成单文档界面的应用程序框架。下面
0 f" m4 q: j1 z3 ?+ U
将先讨论点击菜单项“View\Full Screen”实现全屏显示的方法,再讲述按“Esc”键后
9 Y0 F+ ^9 \+ S6 i% \# `
如何退出全屏显示状态。
6 a y0 R0 t* J& H% O
1) 在CMainFrame类中,增加如下三个成员变量。
/ c, X2 B2 W0 d: H4 C
class CMainFrame : public CFrameWnd
, a0 j' b2 [( F( R- ?' W
{ private: //自己添加的三个成员变量
3 k- _" {( o$ V' f+ ~) M" {
WINDOWPLACEMENT m_OldWndPlacement; //用来保存原窗口位置
b$ n4 i: f- e* n
/* typedef struct tagWINDOWPLACEMENT { /* wndpl */
4 f1 J9 h" y) E6 ]8 M3 Z
UINT length;
+ h8 @: }4 c( o. p4 P
UINT flags;
) z) H- ~, p, [ {+ J* ^ n
UINT showCmd;
( ]" Q+ Z X1 w
POINT ptMinPosition;
1 } i' t% L1 F! g" e0 }: h
POINT ptMaxPosition;
! E ` w6 y8 B) y+ c
RECT rcNormalPosition;
! ?4 V7 Y+ F0 ?( |3 g X* k' W
} WINDOWPLACEMENT;
+ Q8 l' G! a3 n1 e* O3 a
*/
6 ?7 Y- g/ b8 K
BOOL m_bFullScreen; //全屏显示标志
A+ R' _$ O0 ~
CRect m_FullScreenRect; //表示全屏显示时的窗口位置
3 l6 g) m0 \5 Y. M+ t0 a( [
protected: CMainFrame();
* G) x$ [6 {5 c$ b3 [
DECLARE_DYNCREATE(CMainFrame)}
9 C3 u, f. K6 C% z1 C# h, e! `
2)在资源编辑器中编辑菜单IDR_MAINFRAME。在“View”菜单栏下添加菜单项“Fu
C2 B3 w" q9 `+ M+ p' R0 S
ll Screen”。在其属性框中,ID设置为ID_FULL_SCREEN,Caption为“Full Screen”。
. }& J) Y1 L; C; J6 ?
还可以在工具栏中添加新的工具图标,并使之与菜单项“Full Screen”相关联,即将其
: r7 p& L# Y6 J/ |9 y; ~
ID值也设置为ID_FULL_SCREEN。
: q2 j p$ Z* J4 S
3)设计全屏显示处理函数,在CMainFrame类增加上述菜单项ID_FULL_SCREEN消息的
5 H ^: f4 _1 N3 x
响应函数。响应函数如下:
. D; T2 P+ M8 ~% W! {2 R# ?- J; q
void CMainFrame::OnFullScreen()
" e9 R: V0 w9 M
{GetWindowPlacement(&m_OldWndPlacement);
+ _) @- Z4 D! M
CRect WindowRect;
' z$ P3 S( J. \0 ^3 C* h" D
GetWindowRect(&WindowRect);
7 {4 X* P5 I1 q' M6 \) e
CRect ClientRect;
, M4 r, J; O! M9 Z
RepositionBars(0, 0xffff, AFX_IDW_PANE_FIRST, reposQuery, &ClientRect);
) L5 P, ^) }8 ?! u/ j
7 B7 `& e, k! d
ClientToScreen(&ClientRect);
; f. {9 r: K+ ~" q# T/ g+ ^3 u
// 获取屏幕的分辨率
9 ~( t4 [" x# @) v
int nFullWidth=GetSystemMetrics(SM_CXSCREEN);
" U. d5 k: n$ J8 |
int nFullHeight=GetSystemMetrics(SM_CYSCREEN);
5 [) R, O1 R; K \% D) p/ C
// 将除控制条外的客户区全屏显示到从(0,0)到(nFullWidth, nFullHeight)区域
# Y7 B' D$ h, l* m) K
, 将(0,0)和(nFullWidth, nFullHeight)两个点外扩充原窗口和除控制条之外的 客户区
2 M0 ]" x6 l2 s; Z2 f
位置间的差值, 就得到全屏显示的窗口位置
4 H2 L# T2 b7 |% F; n1 y
m_FullScreenRect.left=WindowRect.left-ClientRect.left;
( x" E* d4 F0 y
m_FullScreenRect.top=WindowRect.top-ClientRect.top;
. D% P$ w# E- x! ?: M+ @7 Q
m_FullScreenRect.right=WindowRect.right-ClientRect.right+nFullWidth;
# M0 ~' E5 o: x1 u# `9 f, _
m_FullScreenRect.bottom=WindowRect.bottom-ClientRect.bottom+nFullHeigh
5 O. ?' [ O/ v! X6 ]: D
t;
. y0 o. f3 v% {1 U* i: ^" V
m_bFullScreen=TRUE; // 设置全屏显示标志为 TRUE
7 V0 y( Y7 \) k' N' {
// 进入全屏显示状态
& E+ {! z# I' x7 f" U# F
WINDOWPLACEMENT wndpl;
( F" A m. L) ?/ r: ?6 u' n
wndpl.length=sizeof(WINDOWPLACEMENT);
$ N6 Q$ q# |* Z4 K5 ?6 A9 G/ A
wndpl.flags=0;
& F7 o- v. T3 v0 ]4 e
wndpl.showCmd=SW_SHOWNORMAL;
/ V, ]$ j! N6 |( ~% }
wndpl.rcNormalPosition=m_FullScreenRect;
/ |9 [% ?. b7 T" |: g7 e: I6 a* \
SetWindowPlacement(&wndpl);}
0 W; r" g3 ^3 c$ R
4)重载CMainFrame类的OnGetMinMaxInfo函数,在全屏显示时提供全屏显示的位置
7 E9 E& ^; a. [* U8 C. @* w/ K7 C
信息。
0 v2 v' Y ~" O
void CMainFrame::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)
, u/ Z/ K6 {. [
{if(m_bFullScreen)
- i2 ?1 G5 G2 J7 b
{lpMMI->ptMaxSize.x=m_FullScreenRect.Width();
# @( a& q, V' Z7 E) |, E/ [
lpMMI->ptMaxSize.y=m_FullScreenRect.Height();
" n3 h2 j) w( N' p' W3 D3 X
lpMMI->ptMaxPosition.x=m_FullScreenRect.Width();
6 M) o! _" J) }, f. p
lpMMI->ptMaxPosition.y=m_FullScreenRect.Height();
. Q9 c& g8 o9 q$ Q
// 最大的Track尺寸也要改变
7 b& A" o* y* m! ~
lpMMI->ptMaxTrackSize.x=m_FullScreenRect.Width();
/ d0 c1 H# A/ S' u8 j; O. ^
lpMMI->ptMaxTrackSize.y=m_FullScreenRect.Height();
, K9 h ]0 y8 G6 e
}CFrameWnd::OnGetMinMaxInfo(lpMMI) ;
% t2 r0 x. R- e# e2 O8 `/ I T& _1 D
}完成上面的编程后,可以联编执行FullScreen.exe,选择菜单“View\Full Scree
+ H9 z- C6 J3 L( V
n”或点击与之关联的工具栏按钮即可进入全屏显示状态。但现在还需要增加用户退出全
+ o0 w: s! ]2 F$ ^( ?
屏显示状态的操作接口,下面讲述如何编程实现按“Esc”键退出全屏显示状态。
2 ]+ ?' y. p% m6 x2 I
1)在ClassView中选中CMainFrame并单击鼠标右键,选择“Add Member Function.
/ N0 a% A2 p$ q, U. w7 S7 D
..”,添加public类型的成员函数EndFullScreen,该函数将完成退出全屏显示的操作。
9 v1 {. g9 c6 i& P. W( ~- ^
U% ?6 h. J* ?# z/ q# N/ I# d
void CMainFrame::EndFullScreen()
. W4 E+ w v; [: U0 X @3 N2 ]
{if(m_bFullScreen)
: B) ?8 ^' [0 n# Y$ w
{// 退出全屏显示, 恢复原窗口显示
+ y% Z9 o& I) \( V& z6 m& M9 _" E- N
ShowWindow(SW_HIDE);
* L' U7 o: R$ c ~
SetWindowPlacement(&m_OldWndPlace?
# T9 f& ]5 ~% a0 j
ment);}}
( H' q: L$ a/ U9 j
2)函数EndFullScreen可以退出全屏显示状态,问题是如何在“Esc”键被按下之后
- Z6 U' w! q7 X m! @
调用执行此函数。由于视图类可以处理键盘输入的有关消息(如WM_KEYDOWN表示用户按
$ I0 G; F V b a3 P& |2 e% g" b5 N4 {
下了某一个键),我们将在视图类CFullScreenView中添加处理按键消息WM_KEYDOWN的响
/ z# y" }; W* l/ X& x$ t
应函数OnKeyDown。判断如果按的键为“Esc”键,则调用CMainFrame类的函数EndFullS
* w! f: F) G/ j4 b: a
creen,便可退出全屏显示状态。
, f, K8 t. {5 c& i, H4 M" x2 r
void CFullScreenView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
- a' J% l- z; e
{if(nChar==VK_ESCAPE) // 如果按的键为Esc键
6 y: m6 a2 u. ^) P% c
{// 获取主框架窗口的指针
& t: h: t+ [/ t, J! C
CMainFrame *pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd;
3 w* D* Q& ?2 H d
// 调用主窗口类的自定义函数 EndFullScreen ,便可退出全屏显示状态
, u. N6 G) J5 T; _" n6 C* I
pFrame->EndFullScreen();}
. Q, S; |1 S9 P7 q/ ~9 a. ~9 X2 J) [% b
CView::OnKeyDown(nChar, nRepCnt, nFlags);}
% z) U. c2 x) [; _+ @! B: M
这样我们就实现了比较专业的全屏显示的功能,相信肯定会令你设计的软件程序增
8 q* C0 y8 c0 t) n0 n0 }
色不少。
作者:
shuiqingchan
时间:
2010-5-13 00:50
好东西,值得借鉴!!!!!!!!!!!!!!!!!!
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5