QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 11775|回复: 1
打印 上一主题 下一主题

在VC++6.0开发中实现全屏显示(转载)

[复制链接]
字体大小: 正常 放大
loveyuan        

21

主题

2

听众

104

积分

该用户从未签到

国际赛参赛者

元老勋章

跳转到指定楼层
1#
发表于 2004-4-30 10:41 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
全屏显示是一些应用软件程序必不可少的功能。比如在用VC++编辑工程源文件或
3 Y+ p. Q8 w6 L编辑对话框等资源时,选择菜单“View\Full Screen”,即可进入全屏显示状态,按“- `% x. j! q  _* ~' R+ E
Esc”键后会退出全屏显示状态。" m8 }4 T! s( i5 O; V0 d, z  y
  在VC++6.0中我们用AppWizard按默认方式生成单文档界面的应用程序框架。下面
: B8 G: b9 C* L, W8 w/ x将先讨论点击菜单项“View\Full Screen”实现全屏显示的方法,再讲述按“Esc”键后* G2 P. y+ b& Q! j
如何退出全屏显示状态。6 I4 s# ~  E* \8 Q* D# ]3 `
  1) 在CMainFrame类中,增加如下三个成员变量。
6 U* {5 [$ k$ \' k- P2 U6 l) h* H  class CMainFrame : public CFrameWnd! U/ Z' z+ ^% L
  { private: //自己添加的三个成员变量( p, a- \! R( _* t* `% Z
  WINDOWPLACEMENT m_OldWndPlacement; //用来保存原窗口位置) S3 B% L3 X7 ~* H
/* typedef struct tagWINDOWPLACEMENT {     /* wndpl */
  Z: j  J  G1 E                UINT  length;
: b; k6 c  C6 _/ N( w/ X                UINT  flags;
6 S! D' E9 V7 h2 N. I" y# ^2 a/ }1 g7 C                UINT  showCmd;6 n1 m* f, o# O1 ~
                POINT ptMinPosition;
' a4 j, d# i! P+ X$ x" r                POINT ptMaxPosition;
3 @, b8 Z2 `+ d3 O' b) K/ u% x! T                RECT  rcNormalPosition;
+ S* e/ p* Q" {/ G* A8 ?& V. d        } WINDOWPLACEMENT;+ O+ L" S$ V4 ~
*/; y& O  n  g, C+ x; ]; D! Q5 i
  BOOL m_bFullScreen; //全屏显示标志) ^& |4 g6 e' R% a5 a$ |; n
  CRect m_FullScreenRect; //表示全屏显示时的窗口位置! Z0 i8 n6 R/ [* Y9 o! a
  protected: CMainFrame();8 X& [0 o$ V5 U% b3 a' A
  DECLARE_DYNCREATE(CMainFrame)}/ J8 m8 M4 ]1 X2 O+ j# P, @
  2)在资源编辑器中编辑菜单IDR_MAINFRAME。在“View”菜单栏下添加菜单项“Fu, f8 k* b- X' x4 f
ll Screen”。在其属性框中,ID设置为ID_FULL_SCREEN,Caption为“Full Screen”。
9 E* ^$ V; d( X; ~0 E8 \, f% ~还可以在工具栏中添加新的工具图标,并使之与菜单项“Full Screen”相关联,即将其
: g1 y5 M. X; i/ a" `) xID值也设置为ID_FULL_SCREEN。
" F/ [8 b' y  t  y8 Q& w  3)设计全屏显示处理函数,在CMainFrame类增加上述菜单项ID_FULL_SCREEN消息的
* H- G3 C9 e9 z2 @! a* `响应函数。响应函数如下:: N  w4 M' h4 V# f$ p
  void CMainFrame::OnFullScreen(). r( z- W& ?8 w0 [, x2 a
  {GetWindowPlacement(&m_OldWndPlacement);
7 C; \# L  I, t5 X; [. P3 f  CRect WindowRect;/ K9 I8 Y' t. U6 y  u
  GetWindowRect(&WindowRect);
/ p  ^9 ?2 f6 m1 r' s  CRect ClientRect;$ |# e5 j- W( d; \: T
  RepositionBars(0, 0xffff, AFX_IDW_PANE_FIRST, reposQuery, &ClientRect);
- C6 i- _( z* r* ]' B% a
5 P9 h/ |# m( R( Y: [& H1 p  ClientToScreen(&ClientRect);. c8 }& V2 W) W( J
  // 获取屏幕的分辨率
- s  [9 y: ~. M( L; A% ^! e6 K  int nFullWidth=GetSystemMetrics(SM_CXSCREEN);2 I# p) s' j7 I- T" w
  int nFullHeight=GetSystemMetrics(SM_CYSCREEN);7 F7 r  O6 ?) G+ A1 v# D3 D9 y
  // 将除控制条外的客户区全屏显示到从(0,0)到(nFullWidth, nFullHeight)区域
6 h# b: \5 {" y0 {, 将(0,0)和(nFullWidth, nFullHeight)两个点外扩充原窗口和除控制条之外的 客户区9 C  A) `# P9 R. m* w( _" n! F: G
位置间的差值, 就得到全屏显示的窗口位置0 a  A: N" ~9 v9 ^* E
  m_FullScreenRect.left=WindowRect.left-ClientRect.left;  b) `: q2 I$ r$ k# ]4 R% n
  m_FullScreenRect.top=WindowRect.top-ClientRect.top;
9 f4 W  P# l' p# ^/ g  m_FullScreenRect.right=WindowRect.right-ClientRect.right+nFullWidth;+ d1 ^' A+ i" T2 ^
  m_FullScreenRect.bottom=WindowRect.bottom-ClientRect.bottom+nFullHeigh
5 p6 G7 S# T+ _& W9 d5 I, f8 Zt;% j: X+ q0 k% D3 R2 S2 s. U/ ^
  m_bFullScreen=TRUE; // 设置全屏显示标志为 TRUE+ k! l: C+ c# \5 [1 ]. @; X
  // 进入全屏显示状态" m# z/ C! Y. A3 y
  WINDOWPLACEMENT wndpl;& g$ J. I( b; |: c9 J
  wndpl.length=sizeof(WINDOWPLACEMENT);, q# S; A& e) y7 R0 N0 x
  wndpl.flags=0;- B/ K/ L$ p7 L* W1 H  x
  wndpl.showCmd=SW_SHOWNORMAL;; `7 i( w, z( O8 X4 A
  wndpl.rcNormalPosition=m_FullScreenRect;4 V. N1 n5 O0 b7 B
  SetWindowPlacement(&wndpl);}/ a) i% c2 e& o' a
  4)重载CMainFrame类的OnGetMinMaxInfo函数,在全屏显示时提供全屏显示的位置* Z1 K& u, Z1 i, s4 v5 U# j- n3 H
信息。, h  D! R, [# P9 |. N8 O! Y
  void CMainFrame::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)
6 z( f$ N2 z4 U! ~. ]  {if(m_bFullScreen)2 `2 j1 Z+ e! A% O. A
  {lpMMI->ptMaxSize.x=m_FullScreenRect.Width();$ e4 ~+ @* |' w  @
  lpMMI->ptMaxSize.y=m_FullScreenRect.Height();
# e) }0 C# {- a- g1 k0 ?  lpMMI->ptMaxPosition.x=m_FullScreenRect.Width();
! c9 y7 ]/ k6 |" m' c  lpMMI->ptMaxPosition.y=m_FullScreenRect.Height();$ t# V! T7 z- c: f* @: V. |$ \  R$ V
  // 最大的Track尺寸也要改变
" [( o$ ^% V; T# |" X( s9 m  lpMMI->ptMaxTrackSize.x=m_FullScreenRect.Width();
, Q% ]- O2 _3 p0 a: F& W/ x  lpMMI->ptMaxTrackSize.y=m_FullScreenRect.Height();$ G1 g) R$ H8 c3 f) B, o' Z
  }CFrameWnd::OnGetMinMaxInfo(lpMMI) ;
. |* `8 _& j- e9 _: ?/ V  }完成上面的编程后,可以联编执行FullScreen.exe,选择菜单“View\Full Scree9 w% U3 B, O8 s4 Y
n”或点击与之关联的工具栏按钮即可进入全屏显示状态。但现在还需要增加用户退出全' l9 t* I8 Y+ j# C/ b( l
屏显示状态的操作接口,下面讲述如何编程实现按“Esc”键退出全屏显示状态。
% E9 A& m0 u- c$ A' f/ F* S  1)在ClassView中选中CMainFrame并单击鼠标右键,选择“Add Member Function.
1 t8 B# }* o/ A4 ?' D, Q..”,添加public类型的成员函数EndFullScreen,该函数将完成退出全屏显示的操作。
! w( R- W3 v/ m" b* T! s9 n. r" n& x7 N* b& O
  void CMainFrame::EndFullScreen()
/ x. A3 m4 G; E$ u5 V. |; ]! J$ V  {if(m_bFullScreen)
7 c4 t$ V2 K9 u" `  x/ c  {// 退出全屏显示, 恢复原窗口显示# B2 n7 K$ x0 \. Z
  ShowWindow(SW_HIDE);
" `. i6 j4 U0 Z  SetWindowPlacement(&m_OldWndPlace?8 `) t' o6 m4 P$ j' y+ [2 B1 E' C6 V
ment);}}
+ E# A7 j, U5 Z( x& w  2)函数EndFullScreen可以退出全屏显示状态,问题是如何在“Esc”键被按下之后
/ N7 F& T& J" ?0 d- N0 V1 c5 t调用执行此函数。由于视图类可以处理键盘输入的有关消息(如WM_KEYDOWN表示用户按
: {# z5 S/ \' {6 Z- Q5 ~下了某一个键),我们将在视图类CFullScreenView中添加处理按键消息WM_KEYDOWN的响; L8 `1 n3 m' {0 {* }
应函数OnKeyDown。判断如果按的键为“Esc”键,则调用CMainFrame类的函数EndFullS- K3 n9 x* `- I% I6 o
creen,便可退出全屏显示状态。
/ i$ s5 q( m/ l' o/ Z  void CFullScreenView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)) g, k: a/ \6 L! I
  {if(nChar==VK_ESCAPE) // 如果按的键为Esc键  j" G; i2 c9 ]
  {// 获取主框架窗口的指针! I( G# {. Y* U9 m3 O3 {; ?( m
  CMainFrame *pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd;
3 I4 y  b) m4 z1 g  N! K; e  // 调用主窗口类的自定义函数 EndFullScreen ,便可退出全屏显示状态
1 h% P, ~: [5 @# Q  pFrame->EndFullScreen();}
8 o8 r2 P% C+ p& r$ `6 B: s- t' @  L  CView::OnKeyDown(nChar, nRepCnt, nFlags);}0 U4 Z1 {7 X  v
  这样我们就实现了比较专业的全屏显示的功能,相信肯定会令你设计的软件程序增' t; Y5 h! V$ i
色不少。
zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
May God grant me the wisdom to discover the right and strength to make it endure 因为陌生,所以勇敢,因为距离,所以美丽。

0

主题

3

听众

581

积分

升级  93.67%

  • TA的每日心情
    开心
    2012-3-29 11:18
  • 签到天数: 11 天

    [LV.3]偶尔看看II

    自我介绍
    朴实阳光,勤恳乐观。
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-4-18 08:58 , Processed in 0.331338 second(s), 58 queries .

    回顶部