Jump to content
  • Advertisement

Archived

This topic is now archived and is closed to further replies.

hoo_ven

OpenGL Please Help!! I am new to OpenGL and cant get my Win32 code working

This topic is 5917 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

When I run the program the window displays but there is no OpenGL (Graphics displayed in the window). I have spent hours on this code and cant figure it out if someone could help that would be great! THX ---------------------------WinMain.cpp-------------------------- #define WIN32_MEAN_AND_LEAN #define WIN32_EXTRA_LEAN #include "CWindow.h" int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmndLine, int nShowCmd) { MSG msg; CWindow window; window.SetupWindow(hInstance); msg = window.EnterMessageLoop(); return msg.wParam; } ------------------------CWindow.h------------------------------ #ifndef CWINDOW_H #define CWINDOW_H #define WIN32_MEAN_AND_LEAN #define WIN32_EXTRA_LEAN #include <windows.h> #include <gl\gl.h> #include <gl\glu.h> class CWindow { protected: HWND hWnd; HDC hDC; HGLRC hRC; MSG msg; private: public: bool done; friend LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); void SetupWindow(HINSTANCE Instance); void Create(); void Destroy(); void Paint(); void SetupPixelFormat(); MSG EnterMessageLoop(); }; #endif ----------------------------CWindow.cpp------------------------- #define WIN32_MEAN_AND_LEAN #define WIN32_EXTRA_LEAN #include <windows.h> #include "CWindow.h" LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { CWindow window; switch (msg) { case WM_CREATE: { window.Create(); return 0; break; } case WM_CLOSE: { window.Destroy(); return 0; break; } case WM_SIZE: { int height = HIWORD(lParam); int width = LOWORD(lParam); if (height==0) { height=1; } glViewport(0, 0, width, height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0,(GLfloat)width/(GLfloat)height,1.0,1000.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); return 0; break; } default: break; } return DefWindowProc(hWnd, msg, wParam, lParam); } void CWindow::SetupWindow(HINSTANCE Instance) { WNDCLASSEX windowClass; windowClass.cbSize = sizeof(WNDCLASSEX); windowClass.lpfnWndProc = (WNDPROC)WndProc; windowClass.style = CS_VREDRAW | CS_HREDRAW; windowClass.hCursor = LoadCursor(NULL, IDC_ARROW); windowClass.cbClsExtra = 0; windowClass.cbWndExtra = 0; windowClass.hInstance = Instance; windowClass.hIcon = NULL; windowClass.hbrBackground = NULL; windowClass.lpszMenuName = NULL; windowClass.lpszClassName = "windowClass"; windowClass.hIconSm = NULL; RegisterClassEx(&windowClass); hWnd = CreateWindowEx(NULL, "windowClass", "Application", WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_SYSMENU | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, 100, 100, 800, 600, NULL, NULL, Instance, NULL); ShowWindow(hWnd, SW_SHOW); UpdateWindow(hWnd); } MSG CWindow::EnterMessageLoop() { done = false; while(!done) { PeekMessage(&msg, hWnd, NULL, NULL, PM_REMOVE); if (msg.message == WM_QUIT) { done = true; } else { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glBegin (GL_TRIANGLES); glColor3f(1, 0, 0); glVertex3f(0, 1, 0); glColor3f(0, 1, 0); glVertex3f(-1, 0, 0); glColor3f(0, 0, 1); glVertex3f(1, 0, 0); glEnd(); SwapBuffers(hDC); TranslateMessage(&msg); DispatchMessage(&msg); } } return msg; } void CWindow::Destroy() { wglMakeCurrent(hDC, NULL); wglDeleteContext(hRC); PostQuitMessage(0); } void CWindow::SetupPixelFormat() { int PixelFormat; 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 }; PixelFormat = ChoosePixelFormat(hDC, &pfd); SetPixelFormat(hDC, PixelFormat, &pfd); } void CWindow::Create() { hDC = GetDC(hWnd); SetupPixelFormat(); hRC = wglCreateContext(hDC); wglMakeCurrent(hDC, hRC); }

Share this post


Link to post
Share on other sites
Advertisement
I am far from an expert, but I suggest you review your code structure and where you place certain things in what functions. I would take a guess that your not passing open gl properly to the window but gee - how general is that lol

http://nehe.gamedev.net

check out lessons 1 or 2''s code to see something similar to what you are trying to do.

As far as my own code is concerned, I always use an initGL function and a DrawMyScene() function, both which I presume to be of importance to the open gl interpreter. Plus my pixel format descripter sits inside a createGLwindow function

someone may advise me as well on how this properly works

Share this post


Link to post
Share on other sites
i think that''s a good idea to start from scratch.. try to locate you error in nehe.gamedev.net. and learn about calling function when using windows API..
hope that would help..

Share this post


Link to post
Share on other sites
I don't see any glaring errors, except that you don't do any error checking to see if everything worked. ie. did you really get a HDC? did SetPixelFormat work? Here's how NeHe set it up:

    
if (!(hDC=GetDC(hWnd))) // Did We Get A Device Context?

{
KillGLWindow(); // Reset The Display

MessageBox(NULL,"Can't Create A GL Device Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
return FALSE; // Return FALSE

}

if (!(PixelFormat=ChoosePixelFormat(hDC,&pfd))) // Did Windows Find A Matching Pixel Format?

{
KillGLWindow(); // Reset The Display

MessageBox(NULL,"Can't Find A Suitable PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION);
return FALSE; // Return FALSE

}

if(!SetPixelFormat(hDC,PixelFormat,&pfd)) // Are We Able To Set The Pixel Format?

{
KillGLWindow(); // Reset The Display

MessageBox(NULL,"Can't Set The PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION);
return FALSE; // Return FALSE

}

if (!(hRC=wglCreateContext(hDC))) // Are We Able To Get A Rendering Context?

{
KillGLWindow(); // Reset The Display

MessageBox(NULL,"Can't Create A GL Rendering Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
return FALSE; // Return FALSE

}

if(!wglMakeCurrent(hDC,hRC)) // Try To Activate The Rendering Context

{
KillGLWindow(); // Reset The Display

MessageBox(NULL,"Can't Activate The GL Rendering Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
return FALSE; // Return FALSE

}


---
Make it work.
Make it fast.

"Commmmpuuuuterrrr.." --Scotty Star Trek IV:The Voyage Home

[edited by - CaptainJester on June 5, 2002 7:56:15 AM]

Share this post


Link to post
Share on other sites
If you are new to opengl don''t try to make classes at first.. use one source and that''s all... somehow i used on my program

int Format = ChoosePixelFormat(*hDC,&pfd);
SetPixelFomart(*hDC,Format,&pfd);

Share this post


Link to post
Share on other sites
try to call in winmain to your functions:

void Create();
void Destroy();
void Paint();
void SetupPixelFormat();

and not only call to setupwindow and entermessageloop

O_o

Share this post


Link to post
Share on other sites
This one wasn''t easy, but I got it:

In your WndProc, you called the Create function of a LOCAL instance of the CWindow class, NOT the one from WinMain.cpp

What you need to do, is save a pointer to the instance of CWindow using SetWindowLong and use GetWindowLong to call a local WndProc inside the class, like this:

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
LPCREATESTRUCT cs;

if (msg == WM_CREATE)
{
cs = (LPCREATESTRUCT) lParam;
SetWindowLong(hWnd, GWL_USERDATA, (LONG) cs->lpCreateParams);
}

CWindow *window = (CWindow *) GetWindowLong(hWnd, GWL_USERDATA);
return window->LocalWndProc(hWnd, msg, wParam, lParam);


}

Also, you must send the this-pointer to the WM_CREATE using:

hWnd = CreateWindowEx(NULL, "windowClass", "Application", WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_SYSMENU | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, 100, 100, 800, 600, NULL, NULL, Instance, this);

You must also call the Create() function at the end of SetupWindow, followed by a call to the resizing function.

Share this post


Link to post
Share on other sites

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!