HolyChen
HolyChen

Reputation: 29

SetPixelFormat return false when using pixel format gotten from wglChoosePixelFormatARB

When I using SetPixelFormat to set pixel format for hDC, it returns false. I used GetLastError(), I get a error code 2000 (means invalid pixel format).

The code as follow:

// Set pixel format attributes
int pixelAttributes[] = {
    WGL_DRAW_TO_WINDOW_ARB, GL_TRUE,
    WGL_SUPPORT_OPENGL_ARB, GL_TRUE,
    WGL_DOUBLE_BUFFER_ARB, GL_TRUE,
    WGL_PIXEL_TYPE_ARB, WGL_TYPE_RGBA_ARB,
    WGL_COLOR_BITS_ARB, bits,
    WGL_DEPTH_BITS_ARB, 24,
    WGL_STENCIL_BITS_ARB, 8,
    WGL_SAMPLE_BUFFERS_ARB, 1,      
    WGL_SAMPLES_ARB, 4,             
    0
};

int pixelFormat;
UINT numFormat;

// using wgl ext get valid pixel format number.
if (!wglChoosePixelFormatARB(hDC, pixelAttributes, NULL, 1, &pixelFormat, &numFormat)) {
    KillGLWindow();     
    MessageBox(NULL, L"Get pixel format failed", L"Error", MB_OK | MB_ICONEXCLAMATION);
    return FALSE;
}

if (!SetPixelFormat(hDC, pixelFormat, &pfd))        // try to set pixel format
{
    auto x = GetLastError();
    KillGLWindow();                             // close

    MessageBox(NULL, L"Unable to set pixel format.", L"Error", MB_OK | MB_ICONEXCLAMATION);
    return FALSE;
}

These code is after create and active a FALSE openGL contextCreate WGL.

Upvotes: 0

Views: 3985

Answers (1)

datenwolf
datenwolf

Reputation: 162164

SetPixelFormat is kind of picky in what it wants to see in the PIXELFORMATDESCRIPTOR structure. To satisfy it, the best way is to initialize pfd using DescribePixelFormat:

INT iPF;
UINT num_formats_choosen;
if( !ChoosePixelFormatARB(
        hDC, 
        pPFAttribs, 
        NULL,
        1,
        &iPF,
        &num_formats_choosen)
 || !num_formats_choosen ) {
    goto fail_choose_pf;
}

PIXELFORMATDESCRIPTOR pfd;
memset(&pfd, 0, sizeof(pfd));
/* now this is a kludge; we need to pass something in the
 * PIXELFORMATDESCRIPTOR to SetPixelFormat; it will be ignored,
 * mostly. OTOH we want to send something sane, we're nice
 * people after all - it doesn't hurt if this fails. */
DescribePixelFormat(hDC, iPF, sizeof(pfd), &pfd);

if( !SetPixelFormat(hDC, iPF, &pfd) ) {
    goto fail_set_pf;
}

Upvotes: 4

Related Questions