如何将多个小图片贴到一块大的图片上?

hawk_with_wind 2008-04-19 11:15:42
现在我想用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上的话,就会出现每一个小图片不是同时移动的问题,
因为贴的顺序是有先后的嘛。所以我才一定要先贴到一块内存上,再把内存这一块直接扔进显存。
不知应该怎么做?
请高人指教。

...全文
259 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnzdgs 2008-04-20
  • 打赏
  • 举报
回复
HBITMAP hbmp = CreateCompatibleBitmap(hdc,1000,1000);
hawk_with_wind 2008-04-19
  • 打赏
  • 举报
回复
hdcmem = CreateCompatibleDC(hdc);
hBitmap hbm = CreateComaptibleBitmap(hdcmem,1000,1000);
SelectObject(hdcmem,hbm);

这里的hdcmem就是上面代码里的hdcSecond。
hawk_with_wind 2008-04-19
  • 打赏
  • 举报
回复
你要知道如果我把图片直接贴到hdc上是没问题的。
(就是hdc = GetDC(hWnd);获得的hdc)
而且我如果不是贴小图,而是用Rectangle直接画的话,
画到hdcmem上再贴到hdc上也是可以画出来的,就是常说的双缓冲对吧。

现在问题是过去用的双缓冲只能用Rectangle之类GDI函数画,
却不能用BitBlt贴图。不明白为什么。为什么帖的小图到hdcmem上就变成黑色块了呢?
queshangxintou 2008-04-19
  • 打赏
  • 举报
回复
你的hdcmem是怎么得到的
cnzdgs 2008-04-19
  • 打赏
  • 举报
回复
应该是hdcmem和hdcCar[i]的问题,把创建这些DC的代码贴出来。
hawk_with_wind 2008-04-19
  • 打赏
  • 举报
回复
抱歉不大懂MFC,不知道能不能给出一份用API的代码?
或者简单解释一下你写的这些东西什么意思?
hawk_with_wind 2008-04-19
  • 打赏
  • 举报
回复
建了啊,
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);
scq2099yt 2008-04-19
  • 打赏
  • 举报
回复
CPaintDC dc(this);
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);
scq2099yt 2008-04-19
  • 打赏
  • 举报
回复
up
菜牛 2008-04-19
  • 打赏
  • 举报
回复
你的内存位图创建了没有,选入hdcmem没有。内存位图不能从空的内存DC创建。

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧