游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1394|回复: 1

关于双缓冲输出位图,但还是有轻微闪烁的问题

[复制链接]

23

主题

68

帖子

68

积分

注册会员

Rank: 2

积分
68
发表于 2007-5-21 10:47:00 | 显示全部楼层 |阅读模式
//***********************************
//            消息循环        
//***********************************
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)        
{   
   
       
        HDC    hdc,hdc2;
    static HINSTANCE  hInstance ;

        
    PAINTSTRUCT ps ;      
   
    int  iLength ;
  
    //static HDC hdcMem,hdcMemBuf ;
    static HBITMAP hBitmap;//,hbitmap2 ;
        
    static int cxClient, cyClient, cxSource, cySource ,x=0,y=0;
        
    BITMAP bitmap ;




    TCHAR szAppName[] = TEXT("you are better man") ;
        TCHAR name3[] = TEXT("xman") ;
       
        TCHAR szBuffer[40];
   
        switch (message)      
    {      
      
                case WM_CREATE:
            hInstance = ((LPCREATESTRUCT) lParam)->hInstance ;                           
            hBitmap = LoadBitmap (hInstance, MAKEINTRESOURCE(IDB_BITMAP1)) ;


                        return 0;
               
        //刷屏消息
                case WM_PAINT:        
         
                           //刷新屏幕方法1:
                           //hdc = GetDC(hwnd);
                           hdc = BeginPaint (hwnd, &ps) ;                     

                           Draw(hdc,hwnd,hBitmap,&x,&y);
                           EndPaint (hwnd, &ps) ;

                          return 0;
        
            //按键消息
        case WM_KEYDOWN:
                                
                          switch(wParam)
                          {
                 
                 case VK_UP:                       
                                           y-=5;
                                           pkey = TEXT("上");

                                           InvalidateRect (hwnd,NULL,FALSE) ;
                                           break;
                  
                                 case VK_DOWN:
                                           y+=5;
                       pkey = TEXT("下");

                                           InvalidateRect (hwnd,NULL,FALSE) ;
                       break;
                                          
                 case VK_RIGHT:
                       x+=5;
                                           pkey = TEXT("左");
                                           InvalidateRect (hwnd,NULL,FALSE) ;
                                           break;
                  
                                 case VK_LEFT:
                                           x-=5;
                       pkey = TEXT("右");

                                           InvalidateRect (hwnd,NULL,FALSE) ;
                       break;
                          
                          }           
              return 0;

                case WM_DESTROY:

               DeleteObject (hBitmap) ;

                          
           

                           PostQuitMessage (0) ;
                           return 0 ;
        
    }
        
  return DefWindowProc (hwnd, message, wParam, lParam) ;
}

void Draw(HDC hdc,HWND hwnd,HBITMAP hBitmap,int* x,int* y)
{
               
               static HDC hdcMem,hdcMemBuf ;
               static HBITMAP hbitmap2 ;
                           static RECT   rect ;
                                         
               //建立内存兼容设备1
               hdcMem = CreateCompatibleDC (hdc) ;
                           //内存兼容背景位图,位图大小与客户区域大小相同
                           hbitmap2 = CreateCompatibleBitmap(hdc, 550, 550 );                                                     
               //建立内存设备兼容2
                           hdcMemBuf = CreateCompatibleDC( NULL );
                           //将内存兼容背景位图选入内存设备兼容1
               SelectObject( hdcMem, hbitmap2 );   
               
                           //用背景色刷一下内存兼容设备1
               GetClientRect(hwnd, &rect );
               FillRect(hdcMem, &rect, NULL );
               
               //将要贴上去的图内存设备兼容2
               SelectObject(hdcMemBuf, hBitmap);
               //将第二个内存DC上的贴图画到第一内存DC上的内存背景上
               BitBlt (hdcMem, *x, *y, 550, 550, hdcMemBuf, 0, 0, SRCCOPY) ;
               //最后画到目的 DC 上
                           BitBlt( hdc, 0, 0, 550, 550, hdcMem, 0, 0, SRCCOPY );      
                          
                           DeleteDC( hdcMemBuf );
                           DeleteObject (hbitmap2) ;
                           DeleteDC (hdcMem) ;
                          
}

帮忙看下感激不禁

6

主题

99

帖子

99

积分

注册会员

Rank: 2

积分
99
发表于 2007-5-26 10:15:00 | 显示全部楼层

Re:关于双缓冲输出位图,但还是有轻微闪烁的问题

刚好我也遇过这种问题。
是 WM_ERASEBKGND 搞的鬼,每次 WM_PAINT 之前都要先处理它,而它使用刷子(创建窗体时会传入,默认为白色)把窗体刷为白色。
所以是 图-〉白色-〉图 的显示顺序,当然感觉到闪烁啦。
解决:
case WM_ERASEBKGND:
     return 1;
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-26 08:06

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表