Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

The result of CreateCompatibleDC only has two colors

Tags:

c++

gdi

In the following code, anytime CreateCompatibleDC is called, the resulting device context only has two colors: black and white.

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) returns 0. Same for hdc, so I can't change the palette manually. The color depth for both device contexts is 32 bits. GetLastError is 0 immediately after CreateCompatibleDC. GetNearestColor(memdc,RGB(any color)) is either black or white. After calling CreateCompatiobleDC on any device context (not just hdc), the same problem occurs.

Any ideas?

like image 750
Erik Wyatt Avatar asked Aug 20 '11 20:08

Erik Wyatt


1 Answers

Change this:

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

To this:

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

When you create a compatible DC, it's created with a bitmap--but that bitmap is always a 1x1 monochrome bitmap (i.e., a single pixel that's either black or white), regardless of what sort of DC it's compatible with.

As a result, if you create a bitmap compatible with that DC, you'll get a larger monochrome bitmap.

If, however, you create a bitmap compatible with the original DC, then you'll get a bitmap of the requested size and the color depth of the original DC.

like image 195
Jerry Coffin Avatar answered Oct 14 '22 01:10

Jerry Coffin