现在我想用GDI做动画,
有很多小的图片要贴到一块大的背景图片上,
然后我再把这块大的背景图片贴到显示的hdc里,代码的话大概像这样:for(...)
{
BitBlt(hdcmem,x[i],y[i],w[i],h[i],hdcCar[i],0,0,SRCCOPY);
}BitBlt(hdc,0,0,1000,1000,hdcmem,0,0,SRCCOPY);现在遇到的问题是,
这样做的话,小图片没能成功贴上去,全是一小块一小块的黑色的,
但是如果我把这些小图片直接贴到显示的hdc上就没这个问题。
是不是BitBlt不能重复两次?还是什么原因?但是如果我直接把小图片贴到显示的hdc上的话,就会出现每一个小图片不是同时移动的问题,
因为贴的顺序是有先后的嘛。所以我才一定要先贴到一块内存上,再把内存这一块直接扔进显存。
不知应该怎么做?
请高人指教。
有很多小的图片要贴到一块大的背景图片上,
然后我再把这块大的背景图片贴到显示的hdc里,代码的话大概像这样:for(...)
{
BitBlt(hdcmem,x[i],y[i],w[i],h[i],hdcCar[i],0,0,SRCCOPY);
}BitBlt(hdc,0,0,1000,1000,hdcmem,0,0,SRCCOPY);现在遇到的问题是,
这样做的话,小图片没能成功贴上去,全是一小块一小块的黑色的,
但是如果我把这些小图片直接贴到显示的hdc上就没这个问题。
是不是BitBlt不能重复两次?还是什么原因?但是如果我直接把小图片贴到显示的hdc上的话,就会出现每一个小图片不是同时移动的问题,
因为贴的顺序是有先后的嘛。所以我才一定要先贴到一块内存上,再把内存这一块直接扔进显存。
不知应该怎么做?
请高人指教。
CRect rect;
GetClientRect(&rect);
CDC dcMem;
dcMem.CreateCompatibleDC(&dc);
CBitmap bmpBackground;
bmpBackground.LoadBitmap(IDB_BITMAP_BG);
//IDB_BITMAP_BG是你自己的图对应的ID
BITMAP bitmap;
bmpBackground.GetBitmap(&bitmap);
CBitmap *pbmpOld=dcMem.SelectObject(&bmpBackground);
dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,
bitmap.bmWidth,bitmap.bmHeight,SRCCOPY);
HDC hdcSecond;
HDC hdc = GetDC(hWnd);
HDC hdcCar = CreateCompatibleDC(hdc);hdcSecond = CreateCompatibleDC(hdc);
HBITMAP hbmp = CreateCompatibleBitmap(hdcSecond,1000,1000);
SelectObject(hdcSecond,hbmp);
PatBlt(hdcSecond,0,0,1000,1000,WHITENESS);//这里本来有个循环的,现在为了调试,只画一个
HBITMAP hCarBmp = (HBITMAP)LoadImage(hInst,L"car.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
SelectObject(hdcCar,hCarBmp);
BitBlt(hdcSecond,0,0,28,48,hdcCar,0,0,SRCCOPY);
//循环在这里结束 BitBlt(hdc,0,0,1000,1000,hdcSecond,0,0,SRCCOPY);
或者简单解释一下你写的这些东西什么意思?
(就是hdc = GetDC(hWnd);获得的hdc)
而且我如果不是贴小图,而是用Rectangle直接画的话,
画到hdcmem上再贴到hdc上也是可以画出来的,就是常说的双缓冲对吧。现在问题是过去用的双缓冲只能用Rectangle之类GDI函数画,
却不能用BitBlt贴图。不明白为什么。为什么帖的小图到hdcmem上就变成黑色块了呢?
hBitmap hbm = CreateComaptibleBitmap(hdcmem,1000,1000);
SelectObject(hdcmem,hbm);这里的hdcmem就是上面代码里的hdcSecond。