我想做个简单的游戏,游戏中的人物都是加载位图,在更新游戏画面时,我用的办法是重绘屏幕..
先把位图加载到内存,然后用BitBlt函数,把内存中的位图覆盖显示器上的位图..
但每次都会出现闪屏..另外,有没有什么办法,让画图过程都在内存中,比如,现有一张前景和背景图片,用什么办法在内存中,让这两张图片重叠,再一次性的显示到屏幕,我想这样应该就不会出现闪屏了..请高手指教,谢谢!!

解决方案 »

  1.   

    思路你不都知道了么,就是双缓存
    新建一个memdc,先在memdc上画好了在pDC->bitblt(0,0,width,height,&memdc,0,0,SRCCOPY);
    显示出来就行了
      

  2.   

    这是我在OnDraw(CDC *pDC)中写的代码CDC MemDC;  //首先定义个显示设备对象
    CBitmap MemBitmap; //定义个位图对象
    MemDC.CreateCompatibleDC(pDC); //建立与屏幕显示设备兼容的内存显示设备MemBitmap.CreateCompatibleBitmap(pDC,1024,800); //建立与屏幕显示兼容的位图
    CBitmap *pOldBitmap=MemDC.SelectObject(&MemBitmap);  //将位图选入内存显示设备
    CBitmap BitmapBackground,BitmapSprite;  //定义两个位图,背景位图和精灵位图
    BitmapBackground.LoadBitmap(IDB_BACKGROUND);  //加载背景位图
    BitmapSprite.LoadBitmap(IDB_SPRITE);  //加载精灵位图
    MemDC.SelectObject(&BitmapBackground);  //将背景位图选入内存显示设备
    MemDC.SelectObject(&BitmapSprite);  //将精灵位图选入内存显示设备
    pDC->BitBlt(0,0,1024,800,&MemDC,0,0,SRCCOPY);   //将内存中的位图拷贝到屏幕上进行显示结果只显示了那张精灵位图,没有实现双缓存...我知道双缓存的原理,但具体该怎么实现啊..能说清楚点吗??
      

  3.   

    这是我在OnDraw(CDC *pDC)中写的代码CDC MemDC;  //首先定义个显示设备对象
    CBitmap MemBitmap; //定义个位图对象
    MemDC.CreateCompatibleDC(pDC); //建立与屏幕显示设备兼容的内存显示设备MemBitmap.CreateCompatibleBitmap(pDC,1024,800); //建立与屏幕显示兼容的位图
    CBitmap *pOldBitmap=MemDC.SelectObject(&MemBitmap);  //将位图选入内存显示设备
    CBitmap BitmapBackground,BitmapSprite;  //定义两个位图,背景位图和精灵位图
    BitmapBackground.LoadBitmap(IDB_BACKGROUND);  //加载背景位图
    BitmapSprite.LoadBitmap(IDB_SPRITE);  //加载精灵位图
    MemDC.SelectObject(&BitmapBackground);  //将背景位图选入内存显示设备
    MemDC.SelectObject(&BitmapSprite);  //将精灵位图选入内存显示设备
    pDC->BitBlt(0,0,1024,800,&MemDC,0,0,SRCCOPY);   //将内存中的位图拷贝到屏幕上进行显示结果只显示了那张精灵位图,没有实现双缓存...我知道双缓存的原理,但具体该怎么实现啊..能说清楚点吗??
      

  4.   

    这是我在OnDraw(CDC *pDC)中写的代码CDC MemDC;  //首先定义个显示设备对象
    CBitmap MemBitmap; //定义个位图对象
    MemDC.CreateCompatibleDC(pDC); //建立与屏幕显示设备兼容的内存显示设备MemBitmap.CreateCompatibleBitmap(pDC,1024,800); //建立与屏幕显示兼容的位图
    CBitmap *pOldBitmap=MemDC.SelectObject(&MemBitmap);  //将位图选入内存显示设备
    CBitmap BitmapBackground,BitmapSprite;  //定义两个位图,背景位图和精灵位图
    BitmapBackground.LoadBitmap(IDB_BACKGROUND);  //加载背景位图
    BitmapSprite.LoadBitmap(IDB_SPRITE);  //加载精灵位图
    MemDC.SelectObject(&BitmapBackground);  //将背景位图选入内存显示设备
    MemDC.SelectObject(&BitmapSprite);  //将精灵位图选入内存显示设备
    pDC->BitBlt(0,0,1024,800,&MemDC,0,0,SRCCOPY);   //将内存中的位图拷贝到屏幕上进行显示结果只显示了那张精灵位图,没有实现双缓存...我知道双缓存的原理,但具体该怎么实现啊..能说清楚点吗??
      

  5.   

    这是我在OnDraw(CDC *pDC)中写的代码CDC MemDC;  //首先定义个显示设备对象
    CBitmap MemBitmap; //定义个位图对象
    MemDC.CreateCompatibleDC(pDC); //建立与屏幕显示设备兼容的内存显示设备MemBitmap.CreateCompatibleBitmap(pDC,1024,800); //建立与屏幕显示兼容的位图
    CBitmap *pOldBitmap=MemDC.SelectObject(&MemBitmap);  //将位图选入内存显示设备
    CBitmap BitmapBackground,BitmapSprite;  //定义两个位图,背景位图和精灵位图
    BitmapBackground.LoadBitmap(IDB_BACKGROUND);  //加载背景位图
    BitmapSprite.LoadBitmap(IDB_SPRITE);  //加载精灵位图
    MemDC.SelectObject(&BitmapBackground);  //将背景位图选入内存显示设备
    MemDC.SelectObject(&BitmapSprite);  //将精灵位图选入内存显示设备
    pDC->BitBlt(0,0,1024,800,&MemDC,0,0,SRCCOPY);   //将内存中的位图拷贝到屏幕上进行显示结果只显示了那张精灵位图,没有实现双缓存...我知道双缓存的原理,但具体该怎么实现啊..能说清楚点吗??
      

  6.   

    这是我在OnDraw(CDC *pDC)中写的代码CDC MemDC;  //首先定义个显示设备对象
    CBitmap MemBitmap; //定义个位图对象
    MemDC.CreateCompatibleDC(pDC); //建立与屏幕显示设备兼容的内存显示设备MemBitmap.CreateCompatibleBitmap(pDC,1024,800); //建立与屏幕显示兼容的位图
    CBitmap *pOldBitmap=MemDC.SelectObject(&MemBitmap);  //将位图选入内存显示设备
    CBitmap BitmapBackground,BitmapSprite;  //定义两个位图,背景位图和精灵位图
    BitmapBackground.LoadBitmap(IDB_BACKGROUND);  //加载背景位图
    BitmapSprite.LoadBitmap(IDB_SPRITE);  //加载精灵位图
    MemDC.SelectObject(&BitmapBackground);  //将背景位图选入内存显示设备
    MemDC.SelectObject(&BitmapSprite);  //将精灵位图选入内存显示设备
    pDC->BitBlt(0,0,1024,800,&MemDC,0,0,SRCCOPY);   //将内存中的位图拷贝到屏幕上进行显示结果只显示了那张精灵位图,没有实现双缓存...我知道双缓存的原理,但具体该怎么实现啊..能说清楚点吗??
      

  7.   

    这是我在OnDraw(CDC *pDC)中写的代码CDC MemDC;  //首先定义个显示设备对象
    CBitmap MemBitmap; //定义个位图对象
    MemDC.CreateCompatibleDC(pDC); //建立与屏幕显示设备兼容的内存显示设备MemBitmap.CreateCompatibleBitmap(pDC,1024,800); //建立与屏幕显示兼容的位图
    CBitmap *pOldBitmap=MemDC.SelectObject(&MemBitmap);  //将位图选入内存显示设备
    CBitmap BitmapBackground,BitmapSprite;  //定义两个位图,背景位图和精灵位图
    BitmapBackground.LoadBitmap(IDB_BACKGROUND);  //加载背景位图
    BitmapSprite.LoadBitmap(IDB_SPRITE);  //加载精灵位图
    MemDC.SelectObject(&BitmapBackground);  //将背景位图选入内存显示设备
    MemDC.SelectObject(&BitmapSprite);  //将精灵位图选入内存显示设备
    pDC->BitBlt(0,0,1024,800,&MemDC,0,0,SRCCOPY);   //将内存中的位图拷贝到屏幕上进行显示结果只显示了那张精灵位图,没有实现双缓存...我知道双缓存的原理,但具体该怎么实现啊..能说清楚点吗??
      

  8.   

    这是我在OnDraw(CDC *pDC)中写的代码CDC MemDC;  //首先定义个显示设备对象
    CBitmap MemBitmap; //定义个位图对象
    MemDC.CreateCompatibleDC(pDC); //建立与屏幕显示设备兼容的内存显示设备MemBitmap.CreateCompatibleBitmap(pDC,1024,800); //建立与屏幕显示兼容的位图
    CBitmap *pOldBitmap=MemDC.SelectObject(&MemBitmap);  //将位图选入内存显示设备
    CBitmap BitmapBackground,BitmapSprite;  //定义两个位图,背景位图和精灵位图
    BitmapBackground.LoadBitmap(IDB_BACKGROUND);  //加载背景位图
    BitmapSprite.LoadBitmap(IDB_SPRITE);  //加载精灵位图
    MemDC.SelectObject(&BitmapBackground);  //将背景位图选入内存显示设备
    MemDC.SelectObject(&BitmapSprite);  //将精灵位图选入内存显示设备
    pDC->BitBlt(0,0,1024,800,&MemDC,0,0,SRCCOPY);   //将内存中的位图拷贝到屏幕上进行显示结果只显示了那张精灵位图,没有实现双缓存...我知道双缓存的原理,但具体该怎么实现啊..能说清楚点吗??
      

  9.   

    这是我在OnDraw(CDC *pDC)中写的代码CDC MemDC;  //首先定义个显示设备对象
    CBitmap MemBitmap; //定义个位图对象
    MemDC.CreateCompatibleDC(pDC); //建立与屏幕显示设备兼容的内存显示设备MemBitmap.CreateCompatibleBitmap(pDC,1024,800); //建立与屏幕显示兼容的位图
    CBitmap *pOldBitmap=MemDC.SelectObject(&MemBitmap);  //将位图选入内存显示设备
    CBitmap BitmapBackground,BitmapSprite;  //定义两个位图,背景位图和精灵位图
    BitmapBackground.LoadBitmap(IDB_BACKGROUND);  //加载背景位图
    BitmapSprite.LoadBitmap(IDB_SPRITE);  //加载精灵位图
    MemDC.SelectObject(&BitmapBackground);  //将背景位图选入内存显示设备
    MemDC.SelectObject(&BitmapSprite);  //将精灵位图选入内存显示设备
    pDC->BitBlt(0,0,1024,800,&MemDC,0,0,SRCCOPY);   //将内存中的位图拷贝到屏幕上进行显示结果只显示了那张精灵位图,没有实现双缓存...我知道双缓存的原理,但具体该怎么实现啊..能说清楚点吗??
      

  10.   

    使用双缓冲是个问题. 但LZ注意WM_ERASEBKGND消息的处理:默认的情况下WM_ERASEBKGND的处理是用白色刷新背景----这自然会造成屏幕的闪烁.设置WM_ERASEBKGND返回0(切记为0),及可解决问题
      

  11.   

    CDC memDC1,memDC2;
    memDC1.CreateCompatibleDC(pDC);
    memDC2.CreateCompatibleDC(pDC);
    CBitmap bitmap1,bitmap2,*oldmap;
    CBitmap memBitmap;
    memBitmap.CreateCompatibleBitmap(pDC,600,800);
    memDC1.SelectObject(&memBitmap);
    memDC1.FillSolidRect(0,0,600,800,RGB(255,255,255));

    bitmap1.LoadBitmap(IDB_BITMAP1);
    memDC2.SelectObject(&bitmap1);
    memDC1.BitBlt(0,0,600,800,&memDC2,0,0,SRCCOPY);

    bitmap2.LoadBitmap(IDB_BITMAP2);
    memDC2.SelectObject(&bitmap2);
            memDC1.BitBlt(0,0,600,800,&memDC2,0,0,SRCCOPY);
    pDC->BitBlt(0,0,600,800,&memDC1,0,0,SRCCOPY);
    你的情况应该是背景被覆盖掉了,略写了一段,你试试吧,背景图片要比前面的大才行啊!