QQ登录

只需要一步,快速开始

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

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

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

21

主题

2

听众

104

积分

该用户从未签到

国际赛参赛者

元老勋章

跳转到指定楼层
1#
发表于 2004-4-30 10:41 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
全屏显示是一些应用软件程序必不可少的功能。比如在用VC++编辑工程源文件或! Z) A% P  \4 c! e9 x5 K) ?
编辑对话框等资源时,选择菜单“View\Full Screen”,即可进入全屏显示状态,按“! F- H* T, M1 i
Esc”键后会退出全屏显示状态。
1 s6 u  x& |2 ?  在VC++6.0中我们用AppWizard按默认方式生成单文档界面的应用程序框架。下面
, o. l# }  t4 @1 X将先讨论点击菜单项“View\Full Screen”实现全屏显示的方法,再讲述按“Esc”键后
4 q: g2 l0 H3 w& ?" }. }9 M如何退出全屏显示状态。
* X- G" n- R. R$ E; F3 }  1) 在CMainFrame类中,增加如下三个成员变量。
( P/ ^! @: b8 U: A2 R7 b- z  class CMainFrame : public CFrameWnd
" F) r$ c% o, T$ W' o/ D+ L; n  { private: //自己添加的三个成员变量
* Y- n' r: v( R* u1 v4 u1 _  WINDOWPLACEMENT m_OldWndPlacement; //用来保存原窗口位置
3 {8 O4 E  r/ c1 X3 x' @/* typedef struct tagWINDOWPLACEMENT {     /* wndpl */
* g/ U4 W- v- x: h8 x                UINT  length;7 V$ k& x1 u* L
                UINT  flags;
# i, _& c6 f9 h7 E% _/ K  r                UINT  showCmd;
8 c5 e' H2 V) |- n1 j" j                POINT ptMinPosition;& J# U% }+ t- f% v& {$ n
                POINT ptMaxPosition;
' G; J2 u! m3 p7 h6 b1 v                RECT  rcNormalPosition;
8 b+ R: v% v" W8 `        } WINDOWPLACEMENT;' B! w5 r+ {' O9 N2 G" p0 ^2 _
*/
; O9 G+ Z/ b! w# {% ?7 b  BOOL m_bFullScreen; //全屏显示标志" m* _, \, V3 n
  CRect m_FullScreenRect; //表示全屏显示时的窗口位置
: K' h3 G: ]9 I8 U  protected: CMainFrame();2 z9 x/ v# B& Q# J; I# l
  DECLARE_DYNCREATE(CMainFrame)}
/ ]* M4 [$ L  i' x  2)在资源编辑器中编辑菜单IDR_MAINFRAME。在“View”菜单栏下添加菜单项“Fu+ s7 P$ Z, t) J+ v, D. c: P. ~
ll Screen”。在其属性框中,ID设置为ID_FULL_SCREEN,Caption为“Full Screen”。
. u  {( z( S3 p0 \& z还可以在工具栏中添加新的工具图标,并使之与菜单项“Full Screen”相关联,即将其- V, M( c6 m( Y. ]/ s
ID值也设置为ID_FULL_SCREEN。- u- R: ~' \1 w( J/ ^
  3)设计全屏显示处理函数,在CMainFrame类增加上述菜单项ID_FULL_SCREEN消息的
6 I$ J) C. u) \1 R2 x响应函数。响应函数如下:
: U& D. t6 _. i# o( L, @. _( [  void CMainFrame::OnFullScreen()
/ D; f' I/ ^' {1 `7 n4 k  {GetWindowPlacement(&m_OldWndPlacement);3 Q$ i  v' b! F3 c; l& \" p( P
  CRect WindowRect;1 m( |3 R! x! I6 ~3 p/ T% Z6 Z
  GetWindowRect(&WindowRect);
) F8 g$ u2 v7 `6 \- a, j6 T0 M% M  CRect ClientRect;, q# U1 d. y( i9 R% X3 y% A
  RepositionBars(0, 0xffff, AFX_IDW_PANE_FIRST, reposQuery, &ClientRect);
1 [! R. O2 k' O8 P( O, `- f4 {7 U* t: `, Y6 ?1 `* K
  ClientToScreen(&ClientRect);1 p. m6 K8 W& o. _* {! {" f8 A
  // 获取屏幕的分辨率
. `1 F3 @! A: ~7 h( |; _( R  int nFullWidth=GetSystemMetrics(SM_CXSCREEN);% ]% D  a- B) y. n. z
  int nFullHeight=GetSystemMetrics(SM_CYSCREEN);! D/ H& p" O8 {# T+ F
  // 将除控制条外的客户区全屏显示到从(0,0)到(nFullWidth, nFullHeight)区域5 }& k9 g0 f4 @
, 将(0,0)和(nFullWidth, nFullHeight)两个点外扩充原窗口和除控制条之外的 客户区" B6 B/ U. R' i: J( \7 v/ F' j& b
位置间的差值, 就得到全屏显示的窗口位置
: B8 t+ |7 Z2 ^3 G  m_FullScreenRect.left=WindowRect.left-ClientRect.left;
( A7 U$ e# q7 [4 C1 m* ]  m_FullScreenRect.top=WindowRect.top-ClientRect.top;( q1 K/ u" T$ v$ p% _! U+ |9 _
  m_FullScreenRect.right=WindowRect.right-ClientRect.right+nFullWidth;2 ^1 L0 _8 M$ A2 ]9 ^3 t# v3 w
  m_FullScreenRect.bottom=WindowRect.bottom-ClientRect.bottom+nFullHeigh
& S4 {% O$ I6 Pt;+ G- ?% ^5 Z& W" u4 r
  m_bFullScreen=TRUE; // 设置全屏显示标志为 TRUE& q% u, p0 p& F& O2 A) S
  // 进入全屏显示状态
  K# c) p$ L9 ]8 T" ~  g  WINDOWPLACEMENT wndpl;3 L9 m  R% A# ]: n/ k* _
  wndpl.length=sizeof(WINDOWPLACEMENT);
8 a* ~( A# m; n7 j$ s" r3 p  wndpl.flags=0;
# K/ Z6 c/ b0 T9 p2 V  wndpl.showCmd=SW_SHOWNORMAL;! V5 [+ D& W: U. P$ b0 G
  wndpl.rcNormalPosition=m_FullScreenRect;" j& M& b& |" ^
  SetWindowPlacement(&wndpl);}
$ b! {. J2 Q, F0 q  4)重载CMainFrame类的OnGetMinMaxInfo函数,在全屏显示时提供全屏显示的位置- L) O5 J& ^# O$ O* y5 ~
信息。( \6 x6 X( ~3 F- r$ o
  void CMainFrame::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)
& D3 n' ~, {$ K' T$ e  {if(m_bFullScreen)' \4 U' J$ O3 [
  {lpMMI->ptMaxSize.x=m_FullScreenRect.Width();0 Z# Z: {- U; t. A. ~
  lpMMI->ptMaxSize.y=m_FullScreenRect.Height();+ w- t% z( y7 x8 U( |
  lpMMI->ptMaxPosition.x=m_FullScreenRect.Width();
1 S: [/ T1 ^$ B% e3 B& R  lpMMI->ptMaxPosition.y=m_FullScreenRect.Height();( M+ Z+ X9 X  N9 z* v
  // 最大的Track尺寸也要改变
% T, d- n3 o, V. Q  lpMMI->ptMaxTrackSize.x=m_FullScreenRect.Width();
9 D( `; M! n/ d% K& T) V5 ?  lpMMI->ptMaxTrackSize.y=m_FullScreenRect.Height();
7 M& V8 \3 c5 [  W3 z6 h; m  }CFrameWnd::OnGetMinMaxInfo(lpMMI) ;
& E! E. `6 G6 E+ E  }完成上面的编程后,可以联编执行FullScreen.exe,选择菜单“View\Full Scree, n: Y4 I7 R) D
n”或点击与之关联的工具栏按钮即可进入全屏显示状态。但现在还需要增加用户退出全! j, s! P1 E" [: k9 k9 O2 D
屏显示状态的操作接口,下面讲述如何编程实现按“Esc”键退出全屏显示状态。
) S) W* B6 ]! e5 J5 o+ z  1)在ClassView中选中CMainFrame并单击鼠标右键,选择“Add Member Function.
: @' s! q5 r5 K4 m; p  w! L..”,添加public类型的成员函数EndFullScreen,该函数将完成退出全屏显示的操作。
2 @, f$ u+ S; w0 j& [8 J, Z3 c9 O0 M9 e: z+ N3 }% a0 R
  void CMainFrame::EndFullScreen()
0 E6 n& F4 c8 E5 F  {if(m_bFullScreen)
6 n. ^2 I8 w2 L, z2 _  {// 退出全屏显示, 恢复原窗口显示# S" E7 x0 l! ?. ]8 V$ k
  ShowWindow(SW_HIDE);, J- y' o% P6 v) S9 d6 f$ Y
  SetWindowPlacement(&m_OldWndPlace?# @8 x# j; _. ]
ment);}}
8 }: |9 a( G/ p4 V  2)函数EndFullScreen可以退出全屏显示状态,问题是如何在“Esc”键被按下之后2 R5 E* Y9 a0 F" a( V
调用执行此函数。由于视图类可以处理键盘输入的有关消息(如WM_KEYDOWN表示用户按
& a" N% w- c5 Y) p下了某一个键),我们将在视图类CFullScreenView中添加处理按键消息WM_KEYDOWN的响
9 Q7 y! {2 j% p应函数OnKeyDown。判断如果按的键为“Esc”键,则调用CMainFrame类的函数EndFullS6 R2 f/ \; i+ `0 G
creen,便可退出全屏显示状态。
7 }8 _! C" F7 B5 Y1 D; w, S  void CFullScreenView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
3 ?# {& k/ h  g' N% c+ G  {if(nChar==VK_ESCAPE) // 如果按的键为Esc键
* q- [! a: g4 O! ]& C  {// 获取主框架窗口的指针
6 g+ s; o! M& m  CMainFrame *pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd;6 x. O" O5 Q, t. w5 ^1 W! r
  // 调用主窗口类的自定义函数 EndFullScreen ,便可退出全屏显示状态9 x! x3 ]# c( _  c+ O( T* O. @' G
  pFrame->EndFullScreen();}
- J- i! @: L1 p4 D  CView::OnKeyDown(nChar, nRepCnt, nFlags);}) p3 @# n' _9 p- M9 ^5 _$ s
  这样我们就实现了比较专业的全屏显示的功能,相信肯定会令你设计的软件程序增7 x) o) R5 f' L+ }
色不少。
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 18:18 , Processed in 1.496084 second(s), 57 queries .

    回顶部