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了,