数学建模社区-数学中国

标题: 在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 ]: Dt;
. y0 o. f3 v% {1 U* i: ^" V  m_bFullScreen=TRUE; // 设置全屏显示标志为 TRUE7 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: acreen,便可退出全屏显示状态。, 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