2011-08-20 169 views
4

在以下代码中,任何时候调用CreateCompatibleDC时,生成的设备上下文只有两种颜色:黑色和白色。CreateCompatibleDC的结果只有两种颜色

case WM_PAINT: 
     { 
      PAINTSTRUCT ps; 
      ps.hdc=GetDC(g_CSkeletalViewerApp.m_hWnd); 
      ps.fErase=true; 
      RECT rc; 
      GetWindowRect(g_CSkeletalViewerApp.m_hWnd, &rc);  
      ps.rcPaint=rc; 
      int width = rc.right - rc.left; 
      int height = rc.bottom - rc.top; 
      HDC hdc=BeginPaint(hWnd,&ps); 

      HDC memdc=CreateCompatibleDC(hdc); 
      HBITMAP membm=CreateCompatibleBitmap(memdc,width,height); 
      SelectObject(memdc,membm); 
      for(int i=rc.left; i<rc.right; i++) { 
       for(int j=rc.top; j<rc.bottom; j++) 
        SetPixel(memdc,i,j,RGB((i+j)%255,(i+j)%255,(i+j)%255)); 
      } 
      BitBlt(hdc,0,0,width,height,memdc,0,0,SRCCOPY); 
      DeleteDC(memdc); 

      EndPaint(hWnd,&ps); 
     } 
     break; 

GetDeviceCaps(memdc,SIZEPALETTE)返回0同样为HDC,所以我不能手动更改调色板。两种设备上下文的颜色深度均为32位。在CreateCompatibleDC之后,GetLastError立即为0。 GetNearestColor(memdc,RGB(任何颜色))可以是黑色或白色。在任何设备上下文(不仅仅是hdc)上调用CreateCompatiobleDC之后,会出现同样的问题。

任何想法?

+2

自九十年代初以来,这个问题几乎吸引了每个GDI新手。 :) –

回答

8

更改此:

HBITMAP membm=CreateCompatibleBitmap(memdc,width,height); 

要这样:

HBITMAP membm=CreateCompatibleBitmap(hdc,width,height); 

当你创建一个兼容的DC,它与一个位图创建 - 但是,位图始终是一个1x1单色位图(即,一个像素是黑色还是白色),无论它与哪种DC兼容。

因此,如果您创建与该DC兼容的位图,则会获得较大的单色位图。

但是,如果你创建一个 DC兼容的位图,然后你会得到所要求的大小原DC的颜色深度的位图。

+5

如果你想知道*为什么*:http://msdn.microsoft.com/en-us/library/dd183488%28v=vs.85%29.aspx(注:“备注:”部分在备注中) – pezcode