QQ登录

只需要一步,快速开始

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

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

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

21

主题

2

听众

104

积分

该用户从未签到

国际赛参赛者

元老勋章

跳转到指定楼层
1#
发表于 2004-4-30 10:41 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
全屏显示是一些应用软件程序必不可少的功能。比如在用VC++编辑工程源文件或6 H  l' J$ J" f+ g4 i" f
编辑对话框等资源时,选择菜单“View\Full Screen”,即可进入全屏显示状态,按“4 n! A1 ?3 K" y1 z
Esc”键后会退出全屏显示状态。- i5 S" h: O- @5 d! [( S. S9 z
  在VC++6.0中我们用AppWizard按默认方式生成单文档界面的应用程序框架。下面
. r, G  r/ S4 t" b/ v" u将先讨论点击菜单项“View\Full Screen”实现全屏显示的方法,再讲述按“Esc”键后
' @3 Y  ]% v; `' g如何退出全屏显示状态。
$ }/ E5 V' [* T: T8 Z$ j# i: g  1) 在CMainFrame类中,增加如下三个成员变量。
; C+ j8 W! Z( w  class CMainFrame : public CFrameWnd3 I7 l8 M/ R6 D& v# N) K2 ?9 p; V
  { private: //自己添加的三个成员变量7 n- O2 x$ C' D0 V8 Z: l3 M
  WINDOWPLACEMENT m_OldWndPlacement; //用来保存原窗口位置
: l& ?4 `% Q0 [; F/* typedef struct tagWINDOWPLACEMENT {     /* wndpl */1 I2 u! U" J1 l* |/ M! }8 ?" V7 i
                UINT  length;
5 }0 ?% {7 {, M3 F0 [                UINT  flags;
1 M9 t( K# {* H                UINT  showCmd;
9 {3 e* C  I  T! K  m! E9 ]2 q                POINT ptMinPosition;
) ^5 Q* N7 W+ K0 X5 u" M* V                POINT ptMaxPosition;
+ `! q4 w  |% j9 C                RECT  rcNormalPosition;
& }2 r% O1 c! V, L" A        } WINDOWPLACEMENT;. V. E6 z# W6 r2 J5 g
*/
9 m3 s4 Y9 h# R6 h, v4 n  BOOL m_bFullScreen; //全屏显示标志8 x3 y1 \  q% J8 R
  CRect m_FullScreenRect; //表示全屏显示时的窗口位置
8 ~, I, w$ [+ k: b2 X0 T  protected: CMainFrame();$ N0 K  Q5 w# ?3 V6 m
  DECLARE_DYNCREATE(CMainFrame)}
$ j5 M; F3 _( W9 _! L  2)在资源编辑器中编辑菜单IDR_MAINFRAME。在“View”菜单栏下添加菜单项“Fu
) D3 {! D+ o8 g/ v( h9 ^0 V  D* yll Screen”。在其属性框中,ID设置为ID_FULL_SCREEN,Caption为“Full Screen”。
$ X! Z- n. \+ ~, k2 Q  {还可以在工具栏中添加新的工具图标,并使之与菜单项“Full Screen”相关联,即将其) b/ t+ o% r% s) ?+ I* z. B( g1 h
ID值也设置为ID_FULL_SCREEN。
$ C, N2 K! A$ R  O6 ]  3)设计全屏显示处理函数,在CMainFrame类增加上述菜单项ID_FULL_SCREEN消息的/ C! u* z7 R. M9 p/ @3 V8 e" }1 C
响应函数。响应函数如下:
5 Y! |* \  `9 X; }% g% m, Q  void CMainFrame::OnFullScreen()
. n& W& R9 |) p% L. M4 J  {GetWindowPlacement(&m_OldWndPlacement);
" s& u( m3 Y* O- C2 G' O! R  CRect WindowRect;
6 ]' z5 R+ b+ _: r* W/ I! G  GetWindowRect(&WindowRect);$ @* f. R. N/ U- G9 y
  CRect ClientRect;, E. O; a; B" G" l- n: k$ ~
  RepositionBars(0, 0xffff, AFX_IDW_PANE_FIRST, reposQuery, &ClientRect);
3 e& \4 f+ Y. e; u! }5 z8 m# g, C
: [) |8 z- t  s, W9 M9 s: c  ClientToScreen(&ClientRect);
; U8 v4 U# C* W" {: J  |; H  // 获取屏幕的分辨率4 F" q/ H- j" c. ^* F2 w. g
  int nFullWidth=GetSystemMetrics(SM_CXSCREEN);
1 A& s9 |6 ]9 a  a" U) Y  S  int nFullHeight=GetSystemMetrics(SM_CYSCREEN);2 l" N/ i/ i5 m% U. `
  // 将除控制条外的客户区全屏显示到从(0,0)到(nFullWidth, nFullHeight)区域% E7 h; Q% |% x0 E* j, F
, 将(0,0)和(nFullWidth, nFullHeight)两个点外扩充原窗口和除控制条之外的 客户区
. A9 i4 K; c" i: V: p5 F4 u位置间的差值, 就得到全屏显示的窗口位置
  e! c& y$ H) x0 J; }* ]7 q* {/ }% r  m_FullScreenRect.left=WindowRect.left-ClientRect.left;
4 k: W$ k5 \. ?) w( w  m  m_FullScreenRect.top=WindowRect.top-ClientRect.top;
) r0 ^1 i6 q: D. Q  m_FullScreenRect.right=WindowRect.right-ClientRect.right+nFullWidth;
; g7 ~$ f  @, a( Y. M" w/ h  m_FullScreenRect.bottom=WindowRect.bottom-ClientRect.bottom+nFullHeigh9 j: _7 r  t: @
t;3 p# q/ x2 F% z7 v5 f0 N  r# j* Q$ B/ a
  m_bFullScreen=TRUE; // 设置全屏显示标志为 TRUE! [7 z7 Q' J$ Q7 w& w; e
  // 进入全屏显示状态+ Y6 {5 R; C2 s. O, ]
  WINDOWPLACEMENT wndpl;+ Y9 U8 _  K8 \3 v2 d3 V" i1 k# O
  wndpl.length=sizeof(WINDOWPLACEMENT);; Q3 i1 `: F9 l& B) N
  wndpl.flags=0;
1 z8 `3 R* u, B% Z  v0 d: w  wndpl.showCmd=SW_SHOWNORMAL;
. L4 G$ A0 r- o/ f3 N+ s' |  wndpl.rcNormalPosition=m_FullScreenRect;
' }+ z% o7 l. m- l* K: q, w8 u  SetWindowPlacement(&wndpl);}" k  @$ `: j; ^; b6 ?1 N% R
  4)重载CMainFrame类的OnGetMinMaxInfo函数,在全屏显示时提供全屏显示的位置4 E$ q  n3 b2 d4 Z4 i
信息。5 ?& U) o& v' K6 q0 ?1 z1 M! Y
  void CMainFrame::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)9 r, w( L1 _/ W+ M* b% T& j7 b
  {if(m_bFullScreen)1 I% q0 ]" S, H) h
  {lpMMI->ptMaxSize.x=m_FullScreenRect.Width();: H, w/ M6 K  v' r
  lpMMI->ptMaxSize.y=m_FullScreenRect.Height();
: L) S7 y( \2 R  }4 T5 C  lpMMI->ptMaxPosition.x=m_FullScreenRect.Width();
: U, ]9 E( w( A  M9 [" {3 T  r# k  lpMMI->ptMaxPosition.y=m_FullScreenRect.Height();
, K5 b% P: G+ G! R3 J" L  // 最大的Track尺寸也要改变( J4 J- ~1 G+ d! t6 T
  lpMMI->ptMaxTrackSize.x=m_FullScreenRect.Width();% c% C; p& z! X+ C) Z% s9 y/ q4 M
  lpMMI->ptMaxTrackSize.y=m_FullScreenRect.Height();! ~+ v9 N# d. G+ d, L- }" @
  }CFrameWnd::OnGetMinMaxInfo(lpMMI) ;$ `& ]! n& l  ~& y
  }完成上面的编程后,可以联编执行FullScreen.exe,选择菜单“View\Full Scree
# [& w* b0 j. |% S. O  M" k+ mn”或点击与之关联的工具栏按钮即可进入全屏显示状态。但现在还需要增加用户退出全2 n0 M4 q7 p9 ^8 l( g: _! k
屏显示状态的操作接口,下面讲述如何编程实现按“Esc”键退出全屏显示状态。. y0 ?4 \- r# K$ b4 M5 `1 U
  1)在ClassView中选中CMainFrame并单击鼠标右键,选择“Add Member Function.
! ^, Y) ^( m) b9 p..”,添加public类型的成员函数EndFullScreen,该函数将完成退出全屏显示的操作。9 T# ?; k# G. P; J# M' E7 k

; v5 X" P" _/ i4 r( _6 ?) h  void CMainFrame::EndFullScreen()' a4 Z4 N! e6 {9 y% X  s
  {if(m_bFullScreen)
* @, {1 `1 k( c/ P  u  {// 退出全屏显示, 恢复原窗口显示- T% Q9 V& c& u3 }! ]) g
  ShowWindow(SW_HIDE);
: }& o1 O6 k/ w3 O; B! |  SetWindowPlacement(&m_OldWndPlace?7 F: m+ z8 [6 C* T& L+ L. c% c
ment);}}
* ]8 n9 \7 Z$ l0 t) G  2)函数EndFullScreen可以退出全屏显示状态,问题是如何在“Esc”键被按下之后
$ a, k. ?) ^8 {: H4 Q调用执行此函数。由于视图类可以处理键盘输入的有关消息(如WM_KEYDOWN表示用户按+ F2 U2 d; c7 a* r" W
下了某一个键),我们将在视图类CFullScreenView中添加处理按键消息WM_KEYDOWN的响
8 N' f( [" I2 _& k. w: i4 f应函数OnKeyDown。判断如果按的键为“Esc”键,则调用CMainFrame类的函数EndFullS9 f; M& n! B# w2 P  w+ L
creen,便可退出全屏显示状态。6 N% S! ^# ]$ t( u
  void CFullScreenView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)" k+ U/ V! q7 k' y# V; Q0 E6 q
  {if(nChar==VK_ESCAPE) // 如果按的键为Esc键* H# V! b- D6 L: i- D% L
  {// 获取主框架窗口的指针1 o; d' {+ b2 p  r. f; [" Q
  CMainFrame *pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd;7 T- ]8 n4 ~8 _5 [* \) R  [' k
  // 调用主窗口类的自定义函数 EndFullScreen ,便可退出全屏显示状态
9 F2 D7 i8 G4 L  pFrame->EndFullScreen();}$ w3 q4 O5 C" K$ }
  CView::OnKeyDown(nChar, nRepCnt, nFlags);}
. ~- L% k/ Z$ v1 s  这样我们就实现了比较专业的全屏显示的功能,相信肯定会令你设计的软件程序增8 M& y0 i6 h% h( t5 m! r
色不少。
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 13:33 , Processed in 0.387013 second(s), 58 queries .

    回顶部