QQ登录

只需要一步,快速开始

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

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

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

21

主题

2

听众

104

积分

该用户从未签到

国际赛参赛者

元老勋章

跳转到指定楼层
1#
发表于 2004-4-30 10:41 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
全屏显示是一些应用软件程序必不可少的功能。比如在用VC++编辑工程源文件或# k# r# p/ Q, n5 c# ^; d. n
编辑对话框等资源时,选择菜单“View\Full Screen”,即可进入全屏显示状态,按“
$ J# x& g$ L6 i4 `4 z1 G5 NEsc”键后会退出全屏显示状态。
/ D1 O% Z) I7 ~5 Y3 K9 T6 W  在VC++6.0中我们用AppWizard按默认方式生成单文档界面的应用程序框架。下面
4 ~' a3 g* ]1 c4 M将先讨论点击菜单项“View\Full Screen”实现全屏显示的方法,再讲述按“Esc”键后+ E/ f, {6 t4 P
如何退出全屏显示状态。
/ c& j* S5 ~7 I4 g# t; Z; D" F  1) 在CMainFrame类中,增加如下三个成员变量。
) L  L. o2 x& w" M  class CMainFrame : public CFrameWnd
, d  {) O% d- L) x' {, _  { private: //自己添加的三个成员变量
, W' Z& b$ I3 T: s7 c  WINDOWPLACEMENT m_OldWndPlacement; //用来保存原窗口位置, i7 Y/ x( `3 [* F" w) i
/* typedef struct tagWINDOWPLACEMENT {     /* wndpl */
) I3 `) {+ M& [- m& i# H                UINT  length;
( I) n/ C! M8 R                UINT  flags;+ D9 x  h1 |5 P' z7 d
                UINT  showCmd;
2 a4 m( r- g  q" d9 S8 p0 I% B* f                POINT ptMinPosition;6 q) s0 \* T# q8 W6 b
                POINT ptMaxPosition;) a5 M: ~$ A8 A' c. \; B8 p3 ~( y$ `
                RECT  rcNormalPosition;
; O1 V& e& k) S0 d5 G        } WINDOWPLACEMENT;
2 d/ R8 y  ~4 }! q; E8 W- b*/4 [' {9 P5 C! |$ l
  BOOL m_bFullScreen; //全屏显示标志8 \  x6 O0 Y: b# e: a% B
  CRect m_FullScreenRect; //表示全屏显示时的窗口位置
: b9 ]* O* |8 T: _' w  protected: CMainFrame();2 ]0 g& x1 r" n/ Q
  DECLARE_DYNCREATE(CMainFrame)}3 H7 \+ Q$ y* ]! u
  2)在资源编辑器中编辑菜单IDR_MAINFRAME。在“View”菜单栏下添加菜单项“Fu
. Q5 r# J3 v$ w4 [8 c3 Mll Screen”。在其属性框中,ID设置为ID_FULL_SCREEN,Caption为“Full Screen”。
% D3 f4 t" o9 a  S8 S& E9 ^& S" V还可以在工具栏中添加新的工具图标,并使之与菜单项“Full Screen”相关联,即将其
( s6 F& ~( @- rID值也设置为ID_FULL_SCREEN。
3 w: r7 m* T1 n) E8 ~  3)设计全屏显示处理函数,在CMainFrame类增加上述菜单项ID_FULL_SCREEN消息的6 q2 l: k9 r- C
响应函数。响应函数如下:
4 `8 `  N! q( m  void CMainFrame::OnFullScreen()
# r! J1 ^& S1 ^! [, E  {GetWindowPlacement(&m_OldWndPlacement);" k% }; l( `6 q4 I- R  b" x. ]' e
  CRect WindowRect;3 L4 x& B& x" Y5 ]1 T
  GetWindowRect(&WindowRect);
% Q' v( `7 ]- g9 Q3 \  CRect ClientRect;  i/ ~, b0 n5 c6 |, ^9 U$ F  a# j
  RepositionBars(0, 0xffff, AFX_IDW_PANE_FIRST, reposQuery, &ClientRect);* _! _1 }  p/ [9 U
) ^7 \7 W3 a' w5 z; C9 V. @* r
  ClientToScreen(&ClientRect);
1 {, E4 B" B0 k2 A# `  // 获取屏幕的分辨率7 P+ C  |2 ~* g" H9 M- o. M
  int nFullWidth=GetSystemMetrics(SM_CXSCREEN);) L$ H8 v$ X( _: ^, I3 _% c, r' ?
  int nFullHeight=GetSystemMetrics(SM_CYSCREEN);5 i) I! ?; P, A* N
  // 将除控制条外的客户区全屏显示到从(0,0)到(nFullWidth, nFullHeight)区域, h7 x0 C7 H  e+ C- t  f; N& ?
, 将(0,0)和(nFullWidth, nFullHeight)两个点外扩充原窗口和除控制条之外的 客户区
6 n( Z2 D8 E7 Q% ?位置间的差值, 就得到全屏显示的窗口位置& F6 L; r" h) P* S6 X
  m_FullScreenRect.left=WindowRect.left-ClientRect.left;$ n3 G8 L" F& h6 i" f
  m_FullScreenRect.top=WindowRect.top-ClientRect.top;# ?+ K# [9 I- `' a1 V
  m_FullScreenRect.right=WindowRect.right-ClientRect.right+nFullWidth;* @, f, Y5 x4 k5 z* o. {
  m_FullScreenRect.bottom=WindowRect.bottom-ClientRect.bottom+nFullHeigh1 J/ E7 a6 T" q+ h) i  E
t;8 y( H: f2 g, p5 S1 @7 g* s
  m_bFullScreen=TRUE; // 设置全屏显示标志为 TRUE3 }3 j0 g8 U" c7 @0 B4 X2 Q
  // 进入全屏显示状态
/ B1 O6 F; x% x/ s2 q0 S  WINDOWPLACEMENT wndpl;" ~2 h' [2 C3 l
  wndpl.length=sizeof(WINDOWPLACEMENT);4 E3 t& @( r) S# W- A7 a; N
  wndpl.flags=0;
. U+ r+ A" j! N% |( r  wndpl.showCmd=SW_SHOWNORMAL;
5 R8 z8 D6 C/ o  x3 c7 A. @3 s/ O  wndpl.rcNormalPosition=m_FullScreenRect;
- `! T' M2 }3 ]+ R6 z$ j6 U# A' k  SetWindowPlacement(&wndpl);}9 V! |& _) D3 j9 i7 ~- c
  4)重载CMainFrame类的OnGetMinMaxInfo函数,在全屏显示时提供全屏显示的位置
' h% m6 x) H5 j, I. v信息。
* f# G3 b7 L2 \2 C  void CMainFrame::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)) ^% r! S* ^- L& L7 k
  {if(m_bFullScreen)0 d) {" v  Z) u% s
  {lpMMI->ptMaxSize.x=m_FullScreenRect.Width();2 {7 ]8 }2 s; N5 @0 k
  lpMMI->ptMaxSize.y=m_FullScreenRect.Height();& k4 y5 ^0 }. g" q6 Z; x; ^1 r. z
  lpMMI->ptMaxPosition.x=m_FullScreenRect.Width();0 \6 @; ?" Z& [( l2 V% j1 O
  lpMMI->ptMaxPosition.y=m_FullScreenRect.Height();
9 U9 C6 r8 M" r6 ~  // 最大的Track尺寸也要改变
+ K" U* |8 I& f8 y  lpMMI->ptMaxTrackSize.x=m_FullScreenRect.Width();
! `2 {6 ]2 m) P1 I0 p6 w/ w/ x; J' J8 h  lpMMI->ptMaxTrackSize.y=m_FullScreenRect.Height();5 t/ X; w6 i/ r% i
  }CFrameWnd::OnGetMinMaxInfo(lpMMI) ;! `* r5 O3 j, j/ `
  }完成上面的编程后,可以联编执行FullScreen.exe,选择菜单“View\Full Scree
0 K1 ^6 s/ V$ Un”或点击与之关联的工具栏按钮即可进入全屏显示状态。但现在还需要增加用户退出全
1 P1 S% ?3 D! g6 {! [; y6 ~# T屏显示状态的操作接口,下面讲述如何编程实现按“Esc”键退出全屏显示状态。
3 d8 X9 H- t+ m5 N  1)在ClassView中选中CMainFrame并单击鼠标右键,选择“Add Member Function.! r) ^) V8 q7 I% l$ [; C# h
..”,添加public类型的成员函数EndFullScreen,该函数将完成退出全屏显示的操作。$ t1 \! U/ R% ^- u& o
1 \1 X# f/ W" I1 A4 R
  void CMainFrame::EndFullScreen()+ `7 d# ^! ?6 x2 q4 E
  {if(m_bFullScreen)7 _$ w& ~- i2 x6 z+ i
  {// 退出全屏显示, 恢复原窗口显示
. {& {" o: H3 K+ m4 N( C0 i4 O  ShowWindow(SW_HIDE);5 j7 |# f4 O4 x6 K3 M9 G6 d4 H$ c
  SetWindowPlacement(&m_OldWndPlace?8 c$ y- W: l4 I
ment);}}
) f/ n* z% P* a0 v3 f  2)函数EndFullScreen可以退出全屏显示状态,问题是如何在“Esc”键被按下之后6 M" w- w! M8 o# E4 {* ^$ A
调用执行此函数。由于视图类可以处理键盘输入的有关消息(如WM_KEYDOWN表示用户按+ |. E1 E! O2 ^* v2 Q  H
下了某一个键),我们将在视图类CFullScreenView中添加处理按键消息WM_KEYDOWN的响
' _( m& a3 ^& \. u应函数OnKeyDown。判断如果按的键为“Esc”键,则调用CMainFrame类的函数EndFullS( `7 |8 a  m. I
creen,便可退出全屏显示状态。
# D5 E: X( V& Q7 S7 _  \  void CFullScreenView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
' N* F6 D+ T4 K" k) b  {if(nChar==VK_ESCAPE) // 如果按的键为Esc键% y1 @4 L6 d# B: R: L
  {// 获取主框架窗口的指针1 D( A+ V  N! d' @) c0 T
  CMainFrame *pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd;
+ g" V! g4 W. S% o  // 调用主窗口类的自定义函数 EndFullScreen ,便可退出全屏显示状态2 L. d+ t7 m: t) G; u
  pFrame->EndFullScreen();}
% u8 E2 U1 U9 s7 b& ?6 p# x  CView::OnKeyDown(nChar, nRepCnt, nFlags);}. A. u& I0 \9 c8 A8 F  V$ n* X4 `
  这样我们就实现了比较专业的全屏显示的功能,相信肯定会令你设计的软件程序增" r: b! C3 ?) }' H
色不少。
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-6-2 13:09 , Processed in 0.451848 second(s), 58 queries .

    回顶部