VC++位图移动问题
来源:百度知道 编辑:UC知道 时间:2024/06/17 07:52:11
客户区同时还有别的位图啊,重绘窗口的话会覆盖的呀
把整个客户区背景重新涂一遍就行了。之后再贴图。
如果背景也是一副位图,那就在加载移动的位图之前,先贴背景图,便会覆盖前一帧所有图片;之后再贴移动的位图。
这是基本的二维动画技巧。
/////////////////////////////////////////////////////
当收到定时器消息时,全部位于客户区的位图都要重绘!按照“前后”顺序——最底下的(一般是背景图)最先贴图,离屏幕最近的最后贴图。做动画有种技巧叫“Z-ORDER”,就是这个意思。
简言之,你不能只贴移动的图,要全部重新贴图。
另外这个也没必要多线程,如果你对贴图效率不满意的话可以考虑多建几个。单线程在贴图数量不多时,丝毫不会在视觉上造成什么“延迟”的感觉。事实上我曾试过没1/60秒将1024*768,基于32位色深的画面贴到主画面上(使用3级缓冲),有贴了许多其他图,程序稳定在60帧每秒。当然那是专门的动画程序,对图形图像进行了一些优化。性能要明显强过一般的窗口程序。
貌似这个问题要多线程才能实现,每个移动的位图一个线程。
ps:我也不会,不过好像在一本书中看到过类似的例子,就是讲多线程的。
介绍一个函数把一种指定的颜色变成透明色,并可改变大小看懂了差不多就可以
// hdc 显示句柄
// hBitmap要显示的位图
// xStart,xStart显示的位置
// xadd,yadd显示的位图的大小变化:放大缩小
// 如:xadd=3表示位图宽度加3
// cTransparentColor变成透明的那种颜色
void CMy1_6View::TransparentBitmap(HDC hdc, HBITMAP hBitmap,short xStart, short yStart, short xadd,short yadd, COLORREF,cTransparentColor)
{
BITMAP m_bm;
COLORREF