提供自己写的一个类,用MFC可以方便设置窗口全屏显示 - Gods_巨蚁

原创技术文章 欢迎转载 但请注明出处

凌晨1:35,本人刚开通本博,感觉至少留下篇原创技术文章吧,在兄弟这,还不急着睡。

我原来的博客地址为 http://hi.baidu.com/zhongji

此博客会继续使用,但更多的技术文章将发布于博客园。

进入正题

最近学习DX,结合着MFC来使用,发现无法使用DX直接在创建设备的时候设置全屏

我尝试设置 D3DPRESENT_PARAMETERS中的Windowed参数,却发现之后的调用CreateDevice出错

所以未找到解决之道,在网上搜索了一些技术文章,直接用MFC设置全屏,说白了就是把窗口的位置设置为足够包含整个屏幕,依据自己的详细实现,完成了如下的类

头文件 ATMfcFullScreen.h

 
  
1 #pragma once
2
3 #include < assert.h >
4
5   class ATMfcFullScreen
6 {
7   public :
8 ATMfcFullScreen();
9
10 void SetFrameView(CWnd * pFrame, CWnd * pView);
11 bool IsReady();
12
13 void FullScreen();
14 void Restore();
15 bool IsFullScreen();
16 CSize GetFullScreenSize();
17
18   private :
19 CRect FullScreenRect(CRect & rcFrame, CRect & rcView, CRect & rcScreen);
20 CRect FullScreenRect(CWnd * pFrame, CWnd * pView);
21
22 void SetFrameViewPos(CRect rectPos);
23
24   private :
25 CRect m_rectRestore;
26 CWnd * m_pFrame;
27 CWnd * m_pView;
28 bool m_bFullScreen;
29 };

实现文件 ATMfcFullScreen.cpp

 
  
1 #include " stdafx.h "
2
3 #include " ATMfcFullScreen.h "
4
5
6 ATMfcFullScreen::ATMfcFullScreen():m_rectRestore( 0 , 0 , 0 , 0 )
7 {
8 m_pFrame = NULL;
9 m_pView = NULL;
10 m_bFullScreen = false ;
11 }
12
13 void ATMfcFullScreen::SetFrameView(CWnd * pFrame, CWnd * pView)
14 {
15 assert(pFrame != NULL && pView != NULL);
16 m_pFrame = pFrame;
17 m_pView = pView;
18 }
19
20 bool ATMfcFullScreen::IsReady()
21 {
22 return (m_pFrame != NULL && m_pView != NULL);
23 }
24
25 void ATMfcFullScreen::FullScreen()
26 {
27 if ( ! m_bFullScreen)
28 {
29 m_bFullScreen = true ;
30 m_pFrame -> GetWindowRect(m_rectRestore);
31 SetFrameViewPos(FullScreenRect(m_pFrame, m_pView));
32 }
33 }
34
35 void ATMfcFullScreen::Restore()
36 {
37 if (m_bFullScreen)
38 {
39 m_bFullScreen = false ;
40 SetFrameViewPos(m_rectRestore);
41 }
42 }
43
44 bool ATMfcFullScreen::IsFullScreen()
45 {
46 return m_bFullScreen;
47 }
48
49 CSize ATMfcFullScreen::GetFullScreenSize()
50 {
51 CRect rectFullScreen = FullScreenRect(m_pFrame, m_pView);
52 return rectFullScreen.Size();
53 }
54
55 CRect ATMfcFullScreen::FullScreenRect(CRect & rcFrame, CRect & rcView, CRect & rcScreen)
56 {
57 CRect rcMax;
58 rcMax.left = rcScreen.left + rcFrame.left - rcView.left;
59 rcMax.top = rcScreen.top + rcFrame.top - rcView.top;
60 rcMax.right = rcScreen.right + rcFrame.right - rcView.right;
61 rcMax.bottom = rcScreen.bottom + rcFrame.bottom - rcView.bottom;
62 return rcMax;
63 }
64
65 CRect ATMfcFullScreen::FullScreenRect(CWnd * pFrame, CWnd * pView)
66 {
67 assert(pFrame != NULL && pView != NULL);
68
69 CRect rectScreen( 0 , 0 , GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN));
70 CRect rectFrame, rectView;
71 pFrame -> GetWindowRect(rectFrame);
72 pView -> GetClientRect(rectView);
73 pView -> ClientToScreen(rectView);
74
75 return FullScreenRect(rectFrame, rectView, rectScreen);
76 }
77
78 void ATMfcFullScreen::SetFrameViewPos(CRect rectPos)
79 {
80 // m_pFrame->SetWindowPos(NULL, rectPos.left, rectPos.top, rectPos.right, rectPos.bottom,
81 // SWP_NOZORDER);
82
83 m_pFrame -> MoveWindow(rectPos);
84 if (m_bFullScreen)
85 {
86 m_pFrame -> SetWindowPos( & CWnd::wndTopMost, rectPos.left, rectPos.top,
87 0 , 0 , SWP_NOSIZE);
88 }
89 else
90 {
91 m_pFrame -> SetWindowPos( & CWnd::wndNoTopMost, rectPos.left, rectPos.top,
92 0 , 0 , SWP_NOSIZE);
93 }
94 }

下面为使用方式

我之前写的个小程序是用来练习使用DX的,所以没有使用MFC的DOC/VIEW结构,我这里仅仅使用了MFC的单文档形式

具体实现方式

在CMainFrame中包含上面的头文件后,添加

private:
	//By 巨蚁
	ATMfcFullScreen m_fullscreen;

在CMainFrame::OnCreate中添加

	//初始化m_fullscreen
	m_fullscreen.SetFrameView(this, &m_wndView);

在CMainFram中添加WM_GETMINMAXINFO消息处理函数,函数实现如下所示,之所以添加一个检测m_fullscreen.IsReady(),原因在于此消息会先于WM_CREATE消息发出,而此时,我们在OnCreate中的m_fullscreen的初始化还没有进行。

void CMainFrame::OnGetMinMaxInfo(MINMAXINFO* lpMMI)
{
	if (m_fullscreen.IsReady())
	{
		CPoint point(m_fullscreen.GetFullScreenSize());

		lpMMI->ptMaxSize = point;
		lpMMI->ptMaxTrackSize = point;
	}
	else
	{
		CFrameWnd::OnGetMinMaxInfo(lpMMI);
	}
}

基本设置已经完成,下面就是设置全屏 和 还原 的命令了

为了方便测试,我定义了一个快捷键,当按下空格,产生 ID_AT_FULLSCREEN消息

我在CMainFrame中添加了消息处理函数,如下

void CMainFrame::OnAtFullscreen()
{
	if (m_fullscreen.IsFullScreen())
	{
		m_fullscreen.Restore();
	}
	else
	{
		m_fullscreen.FullScreen();
	}
}

编译完成,现在可以使用空格键来实现这个MFC程序从全屏与原大小之间的切换了

好,完成了,我就先飘过了~

转载于:https://www.cnblogs.com/gods/archive/2011/03/30/ATMfcFullScreen.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
此代码为先前版本,只具有部分功能 小车的造型被我画成了战车 此程序没有使用任何图形开发或者游戏开发方面的库,仅使用MFC,并调用GUI函数绘图。 斜方向四边形等图形绘制我使用了自己的类,这个程序的目的在于练习与娱乐,所以界面很简单。 1、程序用了比较简单合理巧妙的算法,模拟了车辆的移动方式。左右键控制车的前轮方向,上下键控制车的加减速,可以倒车。 2、程序使用了卷轴效果,小车移动到窗口边缘一定距离时,屏幕会被拉动,确保小车始终在窗口中可见。(先前的程序小车会跑出屏幕,结果就找不回来了^_^) 3、程序使用了我自己编的碰撞检测,小车碰到建筑物会停住。 4、程序给小车增加了漂移功能,虽不明显,这个还没有想好具体怎么设置算法比较合理,现实中正常车辆形式时的漂移好像需要借助刹车,我没强到可以模拟真实物理。不过现在具有一定车速的时候转弯,车身会向侧面移动一小段距离。 介绍完毕 需要程序试玩的朋友 请留邮箱! 鉴于有些朋友或同学想知道程序的具体实现,比如小车的移动算法,我可以提供一个之前的版本,足以用于学习之用,呵呵。留邮箱即可! 如果其他问题,请加我QQ:517377100 得学学图形程序开发方面的库了,不能啥代码都自己,开发效率太低。。。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值