数学建模社区-数学中国

标题: 在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 Kt;
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 ^" Un”或点击与之关联的工具栏按钮即可进入全屏显示状态。但现在还需要增加用户退出全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* [! gment);}}
/ 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类的函数EndFullS2 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