QQ登录

只需要一步,快速开始

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

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

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

21

主题

2

听众

104

积分

该用户从未签到

国际赛参赛者

元老勋章

跳转到指定楼层
1#
发表于 2004-4-30 10:41 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
全屏显示是一些应用软件程序必不可少的功能。比如在用VC++编辑工程源文件或
2 j  ^* ~" B! f$ Y, n6 ?编辑对话框等资源时,选择菜单“View\Full Screen”,即可进入全屏显示状态,按“  I5 Y3 |* A& j5 S+ J
Esc”键后会退出全屏显示状态。
% R( G2 X4 x$ ^9 s. F3 T% [% l  在VC++6.0中我们用AppWizard按默认方式生成单文档界面的应用程序框架。下面; X! h5 n" v% a1 O
将先讨论点击菜单项“View\Full Screen”实现全屏显示的方法,再讲述按“Esc”键后3 K: q4 c3 z$ R
如何退出全屏显示状态。6 V$ m' y! Y3 Q+ U" {+ y
  1) 在CMainFrame类中,增加如下三个成员变量。, R6 e4 B7 }; W; T% q
  class CMainFrame : public CFrameWnd" H; ~& x' Z/ N( Y4 L
  { private: //自己添加的三个成员变量) T" [5 x1 }# {6 @# p! q
  WINDOWPLACEMENT m_OldWndPlacement; //用来保存原窗口位置
: N( g: D* S( J% g+ R# m8 c. f/* typedef struct tagWINDOWPLACEMENT {     /* wndpl */& G! C7 \) f. X6 e6 N$ t1 y0 Q! d
                UINT  length;
2 o8 G+ P! m8 m' C+ Z  P                UINT  flags;2 D0 J# X) b# I3 c: d
                UINT  showCmd;
3 c1 j, a5 U' r6 i& F  t' S                POINT ptMinPosition;
) S+ G1 z2 I! P, j) C                POINT ptMaxPosition;
" r  |- u5 T4 a8 `6 }* \                RECT  rcNormalPosition;1 @+ v& W" f& V  o% ]+ D
        } WINDOWPLACEMENT;7 w+ K- _' K- s2 j
*/
9 n6 X/ u1 h& u: K5 h  BOOL m_bFullScreen; //全屏显示标志
( P8 P) H+ y5 m7 ~7 i- t& v6 b' w  CRect m_FullScreenRect; //表示全屏显示时的窗口位置
9 d0 z; \( d7 j8 ^3 Q+ `8 `! L: p  protected: CMainFrame();
; s. F' J0 Q2 B9 M3 @1 y' W" r$ A: p  DECLARE_DYNCREATE(CMainFrame)}  y/ o; X: g+ C8 l+ _% C
  2)在资源编辑器中编辑菜单IDR_MAINFRAME。在“View”菜单栏下添加菜单项“Fu
1 ^  a. L8 m- p% |& z, Kll Screen”。在其属性框中,ID设置为ID_FULL_SCREEN,Caption为“Full Screen”。2 X% b5 M! y5 C: w' t" ~
还可以在工具栏中添加新的工具图标,并使之与菜单项“Full Screen”相关联,即将其
1 X2 q) j* Q# v1 v6 fID值也设置为ID_FULL_SCREEN。, P4 ]7 h" d4 T, \" D3 G
  3)设计全屏显示处理函数,在CMainFrame类增加上述菜单项ID_FULL_SCREEN消息的
0 y! l; H1 h& K/ H7 b7 a" k) C+ L响应函数。响应函数如下:
8 V( V; n% w* N. b) Z: y  void CMainFrame::OnFullScreen()" `$ I6 n2 R* @* g2 m0 x
  {GetWindowPlacement(&m_OldWndPlacement);) t2 v: ^+ Y5 t  B* l
  CRect WindowRect;
) H. e  I- k7 Z8 }- L& Z  GetWindowRect(&WindowRect);
/ l2 z: U0 J! G  CRect ClientRect;  \. \& L- M; m/ |; L- ]' K
  RepositionBars(0, 0xffff, AFX_IDW_PANE_FIRST, reposQuery, &ClientRect);8 [% l) M; G4 a* c3 d6 x2 h
  G6 F& F2 R) h: m, z/ h  Q
  ClientToScreen(&ClientRect);, [2 V$ w0 m  B+ S9 j# m
  // 获取屏幕的分辨率
$ T- S9 y8 t3 e* ?  int nFullWidth=GetSystemMetrics(SM_CXSCREEN);/ ^* N6 y  t! z* d- j
  int nFullHeight=GetSystemMetrics(SM_CYSCREEN);: u, y. K" L& \# M) O3 T& o
  // 将除控制条外的客户区全屏显示到从(0,0)到(nFullWidth, nFullHeight)区域
* {  X3 A$ J7 |4 b& O" q. Z. G, 将(0,0)和(nFullWidth, nFullHeight)两个点外扩充原窗口和除控制条之外的 客户区
1 B2 M6 ]7 p' ~4 P* `位置间的差值, 就得到全屏显示的窗口位置" p3 _: V5 p( Z* X+ q' Q0 s
  m_FullScreenRect.left=WindowRect.left-ClientRect.left;/ C7 B$ P' P3 b! {
  m_FullScreenRect.top=WindowRect.top-ClientRect.top;) |4 V+ s5 h( L2 A& R/ n
  m_FullScreenRect.right=WindowRect.right-ClientRect.right+nFullWidth;3 e7 `% n: g( n9 o0 F, H
  m_FullScreenRect.bottom=WindowRect.bottom-ClientRect.bottom+nFullHeigh# S  z" @3 o/ I8 }# L
t;
- k  K9 {+ e+ A  m_bFullScreen=TRUE; // 设置全屏显示标志为 TRUE
* m& L! G/ _( \! y7 i" p' Z  // 进入全屏显示状态
; w) I, l8 @5 D# G* ~  WINDOWPLACEMENT wndpl;
! _9 f" J2 X1 @" L9 p/ G  wndpl.length=sizeof(WINDOWPLACEMENT);
6 n' c1 P0 T$ ]1 o6 Q, o( t' M  wndpl.flags=0;+ z4 e' g2 m' O0 g' d
  wndpl.showCmd=SW_SHOWNORMAL;+ g# E8 d# P# Y" S% P; e
  wndpl.rcNormalPosition=m_FullScreenRect;
+ ]4 s# k& u$ s: w9 H( p  SetWindowPlacement(&wndpl);}
1 [6 W( s& t% ]0 r9 ^5 `  4)重载CMainFrame类的OnGetMinMaxInfo函数,在全屏显示时提供全屏显示的位置' J0 y2 o/ v  q; g2 B
信息。
( C+ N! |9 J+ ?% @9 `( |: F  void CMainFrame::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)
1 D+ Y- p2 D  y+ J1 z- _: k- ]% c  {if(m_bFullScreen)
) P6 b1 Q4 T; x2 K  {lpMMI->ptMaxSize.x=m_FullScreenRect.Width();$ q* D( S9 Y5 }0 x5 T+ |
  lpMMI->ptMaxSize.y=m_FullScreenRect.Height();
0 x1 n" k4 |0 b9 P7 b$ G  lpMMI->ptMaxPosition.x=m_FullScreenRect.Width();9 B* }# G* R8 ~; p: x5 }
  lpMMI->ptMaxPosition.y=m_FullScreenRect.Height();
  {2 L# k5 C6 B& ?1 H# W7 q+ w3 ~  // 最大的Track尺寸也要改变
( X  h* ]8 ]5 H  lpMMI->ptMaxTrackSize.x=m_FullScreenRect.Width();
+ X' J2 E" f& c7 a% S7 S  lpMMI->ptMaxTrackSize.y=m_FullScreenRect.Height();
9 l, q$ c, S3 O2 p$ X" ~  }CFrameWnd::OnGetMinMaxInfo(lpMMI) ;  p  h$ Y0 j7 P& C0 m( D
  }完成上面的编程后,可以联编执行FullScreen.exe,选择菜单“View\Full Scree# v2 [( B( v+ N$ `# N/ ~1 ]
n”或点击与之关联的工具栏按钮即可进入全屏显示状态。但现在还需要增加用户退出全# q( |6 t) u9 b6 W
屏显示状态的操作接口,下面讲述如何编程实现按“Esc”键退出全屏显示状态。! {, j% m7 g8 b
  1)在ClassView中选中CMainFrame并单击鼠标右键,选择“Add Member Function.
& r% p7 `! Z' i/ ]; h  g( S( L* [..”,添加public类型的成员函数EndFullScreen,该函数将完成退出全屏显示的操作。" V# k# n* e8 y8 @: l* i4 R
2 E" I! E2 ?& S# I
  void CMainFrame::EndFullScreen()
7 i; n% w* d+ V7 p2 p0 ?9 a6 E  {if(m_bFullScreen)
) _4 d7 T' U. S9 G; O1 A3 `  H  {// 退出全屏显示, 恢复原窗口显示1 W, k+ f8 t, n5 `+ g
  ShowWindow(SW_HIDE);
/ b4 ^& |2 m; n3 m  D, ^  SetWindowPlacement(&m_OldWndPlace?$ X* T0 z  X6 G! S
ment);}}
: k5 {& _; @% d8 s  2)函数EndFullScreen可以退出全屏显示状态,问题是如何在“Esc”键被按下之后
" m" `7 U& j# W! W3 j; F4 C* _调用执行此函数。由于视图类可以处理键盘输入的有关消息(如WM_KEYDOWN表示用户按* D  o6 l9 n' ?4 C
下了某一个键),我们将在视图类CFullScreenView中添加处理按键消息WM_KEYDOWN的响
6 r# N( T8 U" o: ?8 P应函数OnKeyDown。判断如果按的键为“Esc”键,则调用CMainFrame类的函数EndFullS
0 C9 E0 G1 M/ G; ]1 ccreen,便可退出全屏显示状态。
7 j- I5 c( `- K) v) i. e& m  void CFullScreenView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
8 ~" N9 e. |4 N1 `- x4 g  {if(nChar==VK_ESCAPE) // 如果按的键为Esc键
. n/ D. `: R1 x! [# R' Q3 {, ]- x  {// 获取主框架窗口的指针
; D* x. u# z( ~0 e6 w0 ]6 l& C, I  CMainFrame *pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd;
4 A: j7 H6 b9 K* Q9 b3 N! `" A  // 调用主窗口类的自定义函数 EndFullScreen ,便可退出全屏显示状态
; v! r, v; z" b: V3 }  pFrame->EndFullScreen();}
8 K& h$ B& u- l1 g* R6 U% C  CView::OnKeyDown(nChar, nRepCnt, nFlags);}8 v: _+ w: H4 E& C
  这样我们就实现了比较专业的全屏显示的功能,相信肯定会令你设计的软件程序增9 j+ M, x# A7 j+ m" N0 K
色不少。
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, 2025-9-6 14:42 , Processed in 0.495928 second(s), 57 queries .

    回顶部