你可以看到代码中指定的位图文件名是test.bmp,所以你也需要一个这样文件名的位图文件,在下面的源码包里附有一个,如果你想换一个文件也可以,不过这个文件以后将用于演示动画的例子。
第二个例子完,需要的话请下载源码
GameEdit2.zip
三、与GDI结合:
上面的两个例子的源码中没有包含资源文件,所以在使用的时候请先按照上面提到的方法建立自己的简单MFC单文档程序,再将源码文件替换你自己的文件再编译。
在第二个例子中,读入了一幅位图并显示在窗口的左上角。这在程序运行中没有任何问题,而且速度还相当快。但如果你同时运行了其他程序,或者将窗口移动到屏幕的边缘位置,会出现一些不正常现象。如果将窗口移动到屏幕边缘,在从后台到前台进行传送的时候,会发生非常矩形错误,意思是指你试图将页面传送到屏幕区域外,也就是前缓冲以外(前面说过,前缓冲与屏幕大小是一样的)。其结果并不会使你的程序当机,只是这次传送不会进行。另外,当你用其他程序的窗口盖住本程序窗口并移动上面的窗口的时候,本窗口的刷新可能导致将位图盖在其他窗口区域内。这是个严重的问题,在编写全屏幕程序的时候不会发生这种情况,因为屏幕被你的程序独占了,而在编写窗口程序的时候,你的程序就会显示非常差劲。
要解决上面的问题,一个办法是当程序失去焦点的时候,你就禁止将位图从后缓冲传送到前缓冲,当重新获得焦点的时候,再恢复位图传送。但有时候这样不理想,比如你在进行程序或者游戏的时候,同时发ICQ的信息,虽然ICQ占的屏幕面积不大,还是会导致你的程序停止更新画面,而如果你在游戏中此时正在紧张而且随时需要你干预的话,程序看起来就非常不友好。
另一个办法是与GDI结合,与GID结合会导致在图像速度上有微小的下降,但会使你的程序看来非常自然。其实方法也非常简单,就是获取后台缓冲的HDC,然后用HDC的BitBlt方法将后台缓冲复制给窗口CDC,可以将OnDraw中的BltFast的方法修改为:
HDC hdc;
lpBackBuffer->GetDC(&hdc);
//获得后台缓冲的HDC
::BitBlt(pDC->m_hDC,0,0,100,100,hdc,0,0,SRCCOPY);
//将后台缓冲的图片传送到窗口DC
lpBackBuffer->ReleaseDC(hdc);
//不要忘了用完后释放HDC,否则会出错
为了与HDC匹配,所以使用pDC的成员m_hDC。BitBlt的具体用法可以看一下帮助文件。使用这个办法以后,无论你将窗口移动到什么位置,以及无论你用什么窗口盖住程序的窗口,都不会有任何不正常的现象发生。它唯一的缺点就是比BltFast慢一点点。因为DC的处理方法是分几次进行,第一次复制到一个DC自己的后台缓冲,然后根据窗口的合法区域分一次或多次复制到屏幕。所以这个方法适用于制作编辑器以及对速度不是极度敏感的游戏。如果要达到最高速度,当然是非全屏幕模式莫属。
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=3405
游戏编辑器框架教程