怎么用DirectDraw中显示一张位图?
  我现在可以写出一个基本框架!! 
    就差这一块!

解决方案 »

  1.   

    把位图载入离屏页面,然后blit到后备缓冲页面,用flip()就可以啦.
    HBITMAP hbmp;
    BITMAP bmp; hbmp=(HBITMAP)::LoadImage(GetModuleHandle(NULL),szFileName,IMAGE_BITMAP,0,0,
     LR_CREATEDIBSECTION); if(!hbmp)
    hbmp=(HBITMAP)::LoadImage(NULL,szFileName,IMAGE_BITMAP,0,0,
    LR_LOADFROMFILE|LR_CREATEDIBSECTION);
    if(!hbmp)
    return -1;

    ::GetObject(hbmp,sizeof(bmp),&bmp);
            然后创建离屏页面
            HDC memhdc;
    memhdc=::CreateCompatibleDC(hDC);
    if(!memhdc)
    return -2;
    ::SelectObject(memhdc,hbmp);
    BOOL b=::BitBlt(hDC,0,0,m_nWidth,m_nHeight,memhdc,0,0,SRCCOPY);
    ::DeleteDC(memhdc);
    大概就这样.详细的自己补全吧.不过速度比较慢,也可以自己写读位图的程序,windows游戏编程大师这本书上有写这种自己写的读位图程序.自己去看吧.
      

  2.   

    我试了,,  但是不好用啊,,    还是开始创建的那个黑屏,  在就什么也没有了!!          怎么办?      用DDReLoadBitmap
          然后lpDD->Bit();也不好用,,  是怎么回事?
      

  3.   

    rect.left = 0;
    rect.top = 0;
    rect.right = GetSystemMetrics(SM_CXSCREEN);
    rect.bottom = GetSystemMetrics(SM_CYSCREEN);
    lpDD->CreateSurface(&ddsd, &lpDDSPrimary, NULL);
    DDReLoadBitmap(lpDDSPrimary, "test.bmp");
    lpDDSPrimary->Blt(&rect, lpDDSPrimary, NULL,  DDBLT_WAIT|DDBLT_KEYSRC ,NULL);
        有什么问题吗?   为什么屏幕一闪就没了?
      

  4.   

    怎么从lpddsprimary blit到 lpddsprimary?直接创建主页面,然后载入位图到主页面就行啦。
    DDSURFACEDESC2 ddsd;
    memset(&ddsd,0,sizeof(ddsd));
    ddsd.dwSize=sizeof(ddsd);
    ddsd.dwFlag=DDSD_CAPS;
    ddsd.ddscaps.dwCaps=DDSCAPS_PRIMARYSURFACE;
    lpDD->CreateSurface(&ddsd,&lpPrimarySurface,NULL);
    DDReLoadBitmap(lpPrimarySurface,"test.bmp");
    如果要载入到后备缓冲页面,先创建后备缓冲页面,然后载入到后备缓冲页面,道理同上。只是把blt函数放在主循环里。