QQ登录

只需要一步,快速开始

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

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

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

21

主题

2

听众

104

积分

该用户从未签到

国际赛参赛者

元老勋章

跳转到指定楼层
1#
发表于 2004-4-30 10:41 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
全屏显示是一些应用软件程序必不可少的功能。比如在用VC++编辑工程源文件或+ ~3 ]+ k" X/ p# H/ ^$ c
编辑对话框等资源时,选择菜单“View\Full Screen”,即可进入全屏显示状态,按“8 A& ]9 F+ W0 Y' b3 O  Q
Esc”键后会退出全屏显示状态。
9 V7 d. P5 J8 X: T9 O  在VC++6.0中我们用AppWizard按默认方式生成单文档界面的应用程序框架。下面0 c( s# y: d6 \+ w0 Z! L
将先讨论点击菜单项“View\Full Screen”实现全屏显示的方法,再讲述按“Esc”键后
0 t2 O! y$ d1 z  m如何退出全屏显示状态。
0 ]' |, {3 `, X- Y( C  1) 在CMainFrame类中,增加如下三个成员变量。/ a2 [- C/ n) q4 J
  class CMainFrame : public CFrameWnd# }0 M2 }2 }. Y' w0 Y& G5 U" t9 r5 f; y
  { private: //自己添加的三个成员变量
8 `4 N* R7 N3 n% s$ `6 u  WINDOWPLACEMENT m_OldWndPlacement; //用来保存原窗口位置" s: g# @, E) E8 \, p" z
/* typedef struct tagWINDOWPLACEMENT {     /* wndpl */
8 z* D! e8 [. U6 o+ j! k8 g                UINT  length;, X6 b- L6 M' Z9 g, V
                UINT  flags;
  g% c8 j. j% o  `& U                UINT  showCmd;7 B8 z" \; c8 R# o* B& {% ^
                POINT ptMinPosition;4 W  `4 K( s& M/ D3 @* x6 j
                POINT ptMaxPosition;3 ~; {* W% |2 c  Q& Q
                RECT  rcNormalPosition;
  \7 Q; O9 g1 I* D# L        } WINDOWPLACEMENT;
* L" Y$ J" _$ h2 X0 E/ f*/: W) \: M' w- Q+ s
  BOOL m_bFullScreen; //全屏显示标志4 S! {: ?  r5 @' _
  CRect m_FullScreenRect; //表示全屏显示时的窗口位置
+ e% |" [& C5 o) s2 h5 ^  protected: CMainFrame();
3 ]8 n( A. H4 L, y+ A5 e  DECLARE_DYNCREATE(CMainFrame)}* L" A  O4 u& J
  2)在资源编辑器中编辑菜单IDR_MAINFRAME。在“View”菜单栏下添加菜单项“Fu
8 O! m/ y' ], o* T5 z( i0 Ill Screen”。在其属性框中,ID设置为ID_FULL_SCREEN,Caption为“Full Screen”。
( p: Z* q2 t3 u7 K# O! M还可以在工具栏中添加新的工具图标,并使之与菜单项“Full Screen”相关联,即将其( c9 ]1 ]( n! Q6 a
ID值也设置为ID_FULL_SCREEN。7 D4 H# t  U. R( P( n3 n
  3)设计全屏显示处理函数,在CMainFrame类增加上述菜单项ID_FULL_SCREEN消息的+ x* n. _/ p3 a. a& D0 ^3 v
响应函数。响应函数如下:
- n; G5 W( S& Q+ X3 d  void CMainFrame::OnFullScreen()7 x5 l( z6 g. N. Q" Q
  {GetWindowPlacement(&m_OldWndPlacement);
. [# Q/ B5 @' s+ K* V* F  CRect WindowRect;
& V' F6 C: J3 H' h. s  GetWindowRect(&WindowRect);) `6 f. C6 b+ P# Y* s
  CRect ClientRect;
: |$ K. V5 T9 t* O. u1 j- X  RepositionBars(0, 0xffff, AFX_IDW_PANE_FIRST, reposQuery, &ClientRect);
8 L5 G- C/ v. b: C
; V& O2 _8 C. z' z6 w7 G  ClientToScreen(&ClientRect);
% W) r( z9 `0 g: q  [  // 获取屏幕的分辨率
3 [% _' c$ ~4 Z3 P  int nFullWidth=GetSystemMetrics(SM_CXSCREEN);
. b( J+ V3 V/ P5 n# i  int nFullHeight=GetSystemMetrics(SM_CYSCREEN);
8 j* [, O8 D# N! e+ V  // 将除控制条外的客户区全屏显示到从(0,0)到(nFullWidth, nFullHeight)区域0 d9 j' V1 }4 {1 y7 K7 q; {6 N: J$ W
, 将(0,0)和(nFullWidth, nFullHeight)两个点外扩充原窗口和除控制条之外的 客户区
* z2 Y5 w- ]+ |! l位置间的差值, 就得到全屏显示的窗口位置
+ U' R; x( h. Q. k  m_FullScreenRect.left=WindowRect.left-ClientRect.left;! r5 G) t9 u1 y+ G
  m_FullScreenRect.top=WindowRect.top-ClientRect.top;
- k+ |. H8 a* p2 V8 m6 |  m_FullScreenRect.right=WindowRect.right-ClientRect.right+nFullWidth;
: q8 u& C1 i& {7 ]4 ^" v$ Q  m_FullScreenRect.bottom=WindowRect.bottom-ClientRect.bottom+nFullHeigh& p, M0 _+ H9 }
t;
/ t# w2 k: Q8 ^" u$ m- z; L  m_bFullScreen=TRUE; // 设置全屏显示标志为 TRUE
+ f9 b" c* R) D% d# p* A4 a8 r  // 进入全屏显示状态' N) R6 s. e& R
  WINDOWPLACEMENT wndpl;1 S/ \% T) ]# O" r- C
  wndpl.length=sizeof(WINDOWPLACEMENT);
3 k  G, i$ r$ @% w  v( a2 G  wndpl.flags=0;/ ~3 A0 p8 \6 R/ c. a
  wndpl.showCmd=SW_SHOWNORMAL;
! A4 p! h) Z  F; e% B  wndpl.rcNormalPosition=m_FullScreenRect;
1 \; B) v7 e1 |2 O  SetWindowPlacement(&wndpl);}+ {& L7 r6 b0 ]! M& f, ~, G
  4)重载CMainFrame类的OnGetMinMaxInfo函数,在全屏显示时提供全屏显示的位置/ i, o" d6 C8 T& m. p/ L
信息。
3 ~4 F. h; R0 B. p. b  void CMainFrame::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)
; d6 r# T, E5 {7 U; g  {if(m_bFullScreen)
% @2 Z, D0 r% o! h' o  {lpMMI->ptMaxSize.x=m_FullScreenRect.Width();
2 i5 M  w% O2 |6 V  lpMMI->ptMaxSize.y=m_FullScreenRect.Height();
7 O# I  M1 G1 Q7 {, }# E$ `  lpMMI->ptMaxPosition.x=m_FullScreenRect.Width();
4 _3 e1 g( J3 \# A5 o  Y& t  lpMMI->ptMaxPosition.y=m_FullScreenRect.Height();
( ?" E% m: Q! X) N) @  // 最大的Track尺寸也要改变
5 D' c8 q/ E- f- Y" T$ P* t  lpMMI->ptMaxTrackSize.x=m_FullScreenRect.Width();
8 U6 ?: \, E  L7 k, G0 H9 N' R, H  lpMMI->ptMaxTrackSize.y=m_FullScreenRect.Height();7 G9 n- d* ^- `' I* ?
  }CFrameWnd::OnGetMinMaxInfo(lpMMI) ;6 D1 m- M  P& z$ H% K/ W# _6 p' Y( D
  }完成上面的编程后,可以联编执行FullScreen.exe,选择菜单“View\Full Scree3 ~0 |7 Y- j4 I( i4 v( P) M
n”或点击与之关联的工具栏按钮即可进入全屏显示状态。但现在还需要增加用户退出全
' j0 ~6 T% z/ m$ A( ^7 W$ v屏显示状态的操作接口,下面讲述如何编程实现按“Esc”键退出全屏显示状态。1 x9 E5 I8 B* [. b. ?2 b
  1)在ClassView中选中CMainFrame并单击鼠标右键,选择“Add Member Function.7 I$ q; {- A8 g, S- f; T2 N8 t6 B0 P
..”,添加public类型的成员函数EndFullScreen,该函数将完成退出全屏显示的操作。% f! D" |( ~% O& ?" o- B/ t
" V5 a: {2 M7 X+ n# I
  void CMainFrame::EndFullScreen()+ ?) L( K. R; ]  f
  {if(m_bFullScreen)
4 ^) M8 U  y; k  l6 T: \) Y9 b  {// 退出全屏显示, 恢复原窗口显示0 w% `1 G8 u& `) @& b8 Z
  ShowWindow(SW_HIDE);
4 o! M  o5 T2 a  SetWindowPlacement(&m_OldWndPlace?
8 g, I1 `; s4 _& Dment);}}
) V/ B! ?3 J1 ]/ J; F' j  x* ]  2)函数EndFullScreen可以退出全屏显示状态,问题是如何在“Esc”键被按下之后1 K& f, c# c4 h0 x  |
调用执行此函数。由于视图类可以处理键盘输入的有关消息(如WM_KEYDOWN表示用户按0 L- Z3 e/ e1 ]( B0 m
下了某一个键),我们将在视图类CFullScreenView中添加处理按键消息WM_KEYDOWN的响
! n& X0 d7 v, _# U应函数OnKeyDown。判断如果按的键为“Esc”键,则调用CMainFrame类的函数EndFullS3 z2 ~2 w' o+ D" Q0 R5 N1 `
creen,便可退出全屏显示状态。
- |7 R' C" H2 R9 R' O  void CFullScreenView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
% _  f2 d' {7 v5 x2 y7 E1 l* v  {if(nChar==VK_ESCAPE) // 如果按的键为Esc键7 I6 K4 p1 `9 p5 J
  {// 获取主框架窗口的指针- l+ m% O% L/ q7 y- n$ l
  CMainFrame *pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd;
9 l) w) k5 u. l  // 调用主窗口类的自定义函数 EndFullScreen ,便可退出全屏显示状态
6 W) B3 ~" I; m2 c5 [1 P  pFrame->EndFullScreen();}
" Z% \9 s* K( L8 u  CView::OnKeyDown(nChar, nRepCnt, nFlags);}
- u: r1 k* ~0 K7 ^. O  这样我们就实现了比较专业的全屏显示的功能,相信肯定会令你设计的软件程序增
/ T! c( h, y: l7 U色不少。
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-7-17 21:07 , Processed in 0.403300 second(s), 58 queries .

    回顶部