2013年8月25日星期日(7-18窗口模式)
来源:互联网 发布:知乎发帖竟然封号 编辑:程序博客网 时间:2024/05/14 21:24
终于快结束第七章了,一鼓作气,今天完成它,
窗口模式其实已经封装了,这里是总结了一下,但是仍然要仔细看看,当时的想法是否正确。人,毕竟是个不断发展前进的过程。
先看看代码,首先确定了一个窗口大小400*400
#define WINDOW_WIDTH 400
#define WINDOW_HEIGHT 400
设置了个像素格式int pixel_format = 0;
GAME_MAIN()清空了。
在GAME_INIT()中,
原来是全屏,合作等级设置如下
lpdd->SetCooperativeLevel(main_window_handle,
DDSCL_FULLSCREEN | DDSCL_ALLOWMODEX |
DDSCL_EXCLUSIVE | DDSCL_ALLOWREBOOT)))
现在是窗口了,应该改为。DDSCL_NORMAL,再去掉setDisplaymode()
并去掉了关于调色板的部分,代替的是对像素格式的提取。
DDPIXELFORMAT ddpixelformat;
DDRAW_INIT_STRUCT( ddpixelformat );
lpddsprimary->GetPixelFormat( & ddpixelformat );
pixel_format = ddpixelformat.dwRGBBitCount;
继续往下,main()函数里面,
全屏时
if (!(hwnd = CreateWindowEx(NULL, // extended style
WINDOW_CLASS_NAME, // class
"DirectDraw 8-Bit Color Animation Demo",// title
WS_POPUP | WS_VISIBLE,
0,0, // initial x,y
SCREEN_WIDTH,SCREEN_HEIGHT, // initial width, height
NULL, // handle to parent
NULL, // handle to menu
hinstance,// instance of this application
NULL))) // extra creation parms
return(0);
现在是窗口模式了。
// create the window
if (!(hwnd = CreateWindowEx(NULL, // extended style
WINDOW_CLASS_NAME, // class
"DirectDraw 8-Bit Color Animation Demo",// title
WS_OVERLAPPED | WS_VISIBLE,
0,0, // initial x,y
WINDOW_WIDTH,WINDOW_HEIGHT, // initial width, height
NULL, // handle to parent
NULL, // handle to menu
hinstance,// instance of this application
NULL))) // extra creation parms
return(0);
改动的一个是WS_OVERLAPPED替代了WS_POPUP,一个是WINDOW_WIDTH,WINDOW_HEIGHT,分别替代了SCREN_WIDTH和SCREEN_HEIGHT。
结果很简单
现在看看书上还有什么补充的
1, 窗口模式很难控制色彩深度和分辨率的初始设置,但是调试方便。
2, 窗口方式的ddraw主表面就是整个显示屏幕,而不仅仅是窗口。
3, 窗口被移动或改变尺寸时,必须跟踪WM_SIZE和WM_MOVE消息
4, 当用8位调色板时,最好留下20个调色板项给WINDOWS和系统色彩
5, 在不同模式下,进行blit和像素操作,自己写代码处理各种色彩深度。
下一步封装,
发现了一点pixel_format = ddpixelformat.dwRGBBitCount;
并没有根据像素格式进行处理。估计留到下一个DEMO了把。
已经以前封装过了。
只要简单改为
ddraw->DDraw_Init( hwnd, WINDOW_WIDTH, WINDOW_HEIGHT, SCREEN_BPP,true);
即可。
不过会出错,在这里发生中断,
if( m_bWindowed == true )
{
DDraw_Fill_Surface( m_lpddsback, 0 );
}
这是以前没处理好的地方,不过可以看下t3dlib1,是如何处理的。
原来是在窗口模式下,没有创建后备缓冲。
if( m_bWindowed == false )
{
ddsd.ddsCaps.dwCaps = DDSCAPS_BACKBUFFER;
m_lpddsprimary->GetAttachedSurface( & ddsd.ddsCaps, & m_lpddsback );
}
else
{
m_lpddsback = DDraw_Create_Surface( width, height );
}
这里只能单独创建一个可以blit的窗口了,而不能链接了。
DDraw_Create_Surface也改下声明。
LPDIRECTDRAWSURFACE7 DDraw_Create_Surface( int width ,int height, int mem_flags = 0, USHORT color_key_value = 0 );
OK了,
- 2013年8月25日星期日(7-18窗口模式)
- 2013年8月11日星期日(7。15 色彩动画)
- 2011年12月18日 星期日(oracle读书笔记)
- 2013年9月22日星期日(序)
- 2010年4月18日星期日
- 2010年4月25日星期日
- 2017年8月6日 星期日
- 2017年8月20日 星期日
- 2009年6月7日 星期日
- VC++学习笔记(2009年7月26日 星期日)
- 2004年2月29日,星期日(1)
- 2004年2月29日,星期日(2)
- 2004年2月29日,星期日(3)
- (2010年9月26日星期日)
- 2011年12月11日星期日(oracle读书笔记)
- 2012年1月1日 星期日(oracle读书笔记)
- 2013年9月22日星期日(准备工作:分离ddraw的math和interface)
- 2012年1月8日 星期日(oracle读书笔记,PL/SQL程序包的使用)
- 大二实习使用的技术汇总(中)
- Linux设备驱动开发环境的搭建
- 小议IT公司的组织架构
- 抽象方法的枚举
- 从桃园结义看原始团队的建立
- 2013年8月25日星期日(7-18窗口模式)
- JavaEE连接池泄漏问题检测Oracle数据库
- hdu4611 Balls Rearrangement
- MySQL源码分析及核心内幕之1 -- 源码目录结构
- Windows Server 2008 系统远程账号5分钟自动注销
- HDU4532(组合DP)
- list,set,map,数组间的相互转换
- Java利用String的split方法对实验数据进行简化
- uva 10706 Number Sequence(数学规律)