双缓存技术
一个关于双缓存及普通绘图的链接:http://download.youkuaiyun.com/download/i_likechard/9676667
做了几个游戏发现每次刷屏时都会闪烁。这个问题怎么解决呢?当然是双缓存技术最好,解决问题面也最广!网上有很多双缓存技术的文章,可是很多说的不全。要你和我一样用了双缓存技术却还是闪屏,也许你直接看第五点就可以解决你的问题。
首先,简单讲一下双缓存技术(网上文章都会讲,知道就跳过此段)。双缓存技术就是在内存区先画一个位图,画好后直接将这个图一个点一个点覆盖到屏幕上,这个过程非常快,所以不会出现闪屏。
下面结合例子讲下步骤。比如要重画两个旗子和一张背景图:
白棋:m_bitwhite; 资源:IDB_BITMAP2
背景:m_bitbk; 资源:IDB_BITMAP3
1 view类中定义这三个位图。构造函数中把对应的资源给位图。
例如:view:CBitmap m_bitblack;
构造:m_bitblack.loadbitmap(IDB_BITMAP1);
其他也如此定义。
2 在Ondraw中定义一个CBitmap类型的对象membit.并定义大小:
CBitmap membit;
membit.CreateCompatibleBitmap(pDC,宽,高);
然后定义一个dc用于缓存区,定义三个dc用于黑白棋和背景,
CDC dc;
CDC bkdc,ftdc1,ftdc2;
创建与显示设备兼容的设备
dc.SelectObject(membit);
将黑白棋子以及背景分别传给他们:
bkdc.SelectObject(m_bitbk);
ftdc1.SelectObject(m_bitblack);
ftdc2.SelectObject(m_bitwhite);
3 将黑白棋子和背景分别在缓存区图上画出。
dc.bitblt(0,0,宽,高,&bkdc,0,0,SRCCOPY);//此函数请自己查用法
dc.bitblt(0,0,15,15,&ftdc1,0,0,SRCCOPY);
dc.bitblt(100,100,15,15,&ftdc2,0,0,SRCCOPY);
4 再将缓存区的图输出到屏幕上:
pDC->bitblt(0,0,宽,高,&dc,0,0,SCRCCOPY);
5 还没完呢,最后要重载一个函数:在view类中找到一个叫WM_ERASEBKGND的消息映射,添加函数,将返回值删除,干成TRUE就可以了。