2011-08-20 42 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