views:

471

answers:

2

Hello

I've just started with opengl but I ran into some strange behaviour.

Below I posted code that runs well in xp but on vista it renders just black screen.

Sorry for posting unusally (as for this board) long code.

Is there something very specific to open gl in vista? Thanks.

#include<windows.h>
#include<gl\gl.h>
#include<gl\glu.h>
#pragma comment(lib, "opengl32.lib")
#pragma comment(lib, "glu32.lib")

void InitGL(void)
{
glClearColor(1,0.3f,0.3f,0.3f);
}

void DrawGLScene(void)
{
/* code removed */
}

HGLRC hRC = NULL;
HDC hDC = NULL;
HWND hWnd = NULL;
HINSTANCE hInstance = NULL;
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

bool CreateGLWindow(char* title, int width, int height)
{
GLuint PixelFormat;
WNDCLASS wc;
RECT WindowRect;
WindowRect.left = (long)0;
WindowRect.right = (long)width;
WindowRect.top = (long)0;
WindowRect.bottom = (long)height;
LPCSTR nazwa = TEXT("Start");

hInstance = GetModuleHandle(NULL);
wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
wc.lpfnWndProc = (WNDPROC)WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_WINLOGO);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = NULL;
wc.lpszMenuName = NULL;
wc.lpszClassName = nazwa;

RegisterClass(&wc);

hWnd = CreateWindowEx(WS_EX_APPWINDOW | WS_EX_WINDOWEDGE, nazwa,
       nazwa,
       WS_SYSMENU |
       WS_CLIPSIBLINGS |
       WS_CLIPCHILDREN,
       0,0,
       width,
       height,
       NULL,
       NULL,
       hInstance,
       NULL);

static PIXELFORMATDESCRIPTOR pfd = 
{
 sizeof(PIXELFORMATDESCRIPTOR),
 1,
 PFD_DRAW_TO_WINDOW |
 PFD_SUPPORT_OPENGL |
 PFD_DOUBLEBUFFER,
 PFD_TYPE_RGBA,
 32,
 0,0,0,0,0,0,
 0,
 0,
 0,
 0,0,0,0,
 16,
 0,
 0,
 PFD_MAIN_PLANE,
 0,
 0,0,0
};

hDC = GetDC(hWnd);
PixelFormat = ChoosePixelFormat(hDC, &pfd);
HRESULT rez = SetPixelFormat(hDC, PixelFormat, &pfd);
hRC = wglCreateContext(hDC);
wglMakeCurrent(hDC, hRC);
ShowWindow(hWnd, SW_SHOW);
InitGL();
return true;

}

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
case WM_ACTIVATE:
 {
  return 0;
 }
case WM_CLOSE:
 {
  PostQuitMessage(0);
  return 0;
 }
}

return DefWindowProc(hWnd, uMsg, wParam, lParam);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,
int nCmdShow)
{
MSG msg;
bool done = false;

if (!CreateGLWindow(NULL, 800,600))
{
 return 0;
}

while(!done)
{
 if (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
 {
  if (!GetMessage(&msg, 0, 0, 0)) done = true;
  else {
   TranslateMessage(&msg);
   DispatchMessage(&msg);
  }
 }
 else
 {
  DrawGLScene();
  SwapBuffers(hDC);
 }
}

return (msg.wParam);
}
A: 

Try PFD_SUPPORT_COMPOSITION.

If that fails, please post the result of DescribePixelFormat and glGetString(GL_RENDERER); to help diagnose the problem a bit more.

It was my mistake as pointed by Gerald. Thanks for your answer anyway.
kamilo
+1  A: 

What is it supposed to do? According to the code you posted there, it shouldn't do anything except show a black screen. What do you expect to happen?

The only thing I see is that you're setting glClearColor, but you're never calling glClear so that won't do anything.

Gerald
Sorry, that was my mistake. Thanks for pointing it out.
kamilo
@kamilo: Then how did it work fine on XP?
Rewriting it on vista I missed this one.I have to put spaces between lines so next time I won't omit something important.
kamilo
BTW, if Gerald answered your question then the nice thing to do is accept his answer.