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

解决方案 »

  1.   

    你的内存位图创建了没有,选入hdcmem没有。内存位图不能从空的内存DC创建。
      

  2.   

    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);
      

  3.   

    建了啊,
    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);
      

  4.   

    抱歉不大懂MFC,不知道能不能给出一份用API的代码?
    或者简单解释一下你写的这些东西什么意思?
      

  5.   

    应该是hdcmem和hdcCar[i]的问题,把创建这些DC的代码贴出来。
      

  6.   

    你要知道如果我把图片直接贴到hdc上是没问题的。
    (就是hdc = GetDC(hWnd);获得的hdc)
    而且我如果不是贴小图,而是用Rectangle直接画的话,
    画到hdcmem上再贴到hdc上也是可以画出来的,就是常说的双缓冲对吧。现在问题是过去用的双缓冲只能用Rectangle之类GDI函数画,
    却不能用BitBlt贴图。不明白为什么。为什么帖的小图到hdcmem上就变成黑色块了呢?
      

  7.   

    hdcmem = CreateCompatibleDC(hdc);
    hBitmap hbm = CreateComaptibleBitmap(hdcmem,1000,1000);
    SelectObject(hdcmem,hbm);这里的hdcmem就是上面代码里的hdcSecond。
      

  8.   

    HBITMAP hbmp = CreateCompatibleBitmap(hdc,1000,1000);