Fehler mit einem Fenster



  • Gut ich habe mir auch die Tutorials von NeHe durchgelesen, und versucht es auch zu programmieren, aber leicht modifiziert.
    Problem ist, dass sich das Fenster nach dem öffnen soffort wieder schließt, ich weiß nicht wo der Fehler liegt, stell daher denn Code zur Verfügung

    #include <windows.h>
    #include <gl\gl.h>
    #include <gl\glu.h>
    
    HGLRC hglrc=NULL;
    HDC hdc=NULL;
    HWND hwnd=NULL;
    HINSTANCE hInstance;
    
    bool keys[256];
    bool active = TRUE;
    bool fullscreen = TRUE;
    
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    
    GLvoid ReSizeGLScene(GLsizei width, GLsizei height)
    {
    	if (height == 0)
    		height = 1;
    	glViewport(0,0,width, height);
    	glMatrixMode(GL_PROJECTION);
    	glLoadIdentity();
    	gluPerspective(45.0F, (GLfloat)width/(GLfloat)height, 0.1F, 100.0F);
    	glMatrixMode(GL_MODELVIEW);
    	glLoadIdentity();
    }
    
    int InitGL()
    {
    	glShadeModel(GL_SMOOTH);
    	glClearColor(0.0F, 0.0F, 0.0F, 0.0F);
    	glClearDepth(1.0F);
    	glEnable(GL_DEPTH_TEST);
    	glDepthFunc(GL_LEQUAL);
    	glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
    	return TRUE;
    }
    
    int DrawGLScene()
    {
    	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    	glLoadIdentity();
    	return TRUE;
    }
    
    GLvoid KillGLWindow()
    {
    	if(fullscreen)
    	{
    		ChangeDisplaySettings(NULL, 0);
    		ShowCursor(TRUE);
    	}
    	if(hglrc)
    	{
    		wglMakeCurrent(NULL, NULL);
    		wglDeleteContext(hglrc);
    	}
    	if(hdc && !ReleaseDC(hwnd, hdc))
    	{
    		hdc = NULL;
    	}
    	if(hwnd && !DestroyWindow(hwnd))
    		hwnd = NULL;
    	if(!UnregisterClass("OpenGL", hInstance))
    		hInstance = NULL;
    }
    
    bool CreateGLWindow(char* title, int width, int height, int bits, bool fullscreenflag)
    {
    	GLuint PixelFormat;
    	WNDCLASS wc;
    	DWORD dwExStyle;
    	DWORD dwStyle;
    	RECT WindowsRect;
    	WindowsRect.left=(long)0;
    	WindowsRect.right = (long)width;
    	WindowsRect.top = (long)0;
    	WindowsRect.bottom = (long)height;
    	fullscreen = fullscreenflag;
    	hInstance = GetModuleHandle(NULL);
    	//wc deklarationen: merken!!!
    	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 = "OpenGL";
    	//geschafft!!
    	RegisterClass(&wc);
    
    	if(fullscreen)
    	{
    		DEVMODE dmScreenSettings;
    		memset(&dmScreenSettings, 0, sizeof(dmScreenSettings));
    		dmScreenSettings.dmSize = sizeof(dmScreenSettings);
    		dmScreenSettings.dmPelsWidth = width;
    		dmScreenSettings.dmPelsHeight = height;
    		dmScreenSettings.dmBitsPerPel = bits;
    		dmScreenSettings.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
    		if(ChangeDisplaySettings(&dmScreenSettings, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL)
    		{
    			if (MessageBox(NULL, "Vollbildmodus wird nicht unterstützt im Fenstermodus umschalten?", "OpenGL", MB_YESNO|MB_ICONEXCLAMATION) == IDYES)
    				fullscreen = FALSE;
    			else
    				return FALSE;
    		}
    	}
    	if (fullscreen)
    	{
    		dwExStyle = WS_EX_APPWINDOW;
    		dwStyle = WS_POPUP;
    		ShowCursor(FALSE);
    	}
    	else
    	{
    		dwExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;
    		dwStyle = WS_OVERLAPPEDWINDOW;
    	}
    
    	AdjustWindowRectEx(&WindowsRect, dwStyle, FALSE, dwExStyle);
    
    	if (!(hwnd=CreateWindowEx(dwExStyle, "OpenGL", title, WS_CLIPSIBLINGS | WS_CLIPCHILDREN | dwStyle, NULL,NULL,
    		WindowsRect.right - WindowsRect.left, WindowsRect.bottom - WindowsRect.top, NULL, NULL, hInstance, NULL)))
    	{
    		KillGLWindow();
    		MessageBox(NULL, "Fenster konnte nicht erstellt werden", "Fehler", MB_OK | MB_ICONEXCLAMATION);
    		return FALSE;
    	}
    
    	PIXELFORMATDESCRIPTOR pfd = {
    		sizeof(PIXELFORMATDESCRIPTOR),
    		1,
    		PFD_DRAW_TO_WINDOW | PFD_DRAW_TO_BITMAP | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,
    		PFD_TYPE_RGBA,
    		bits,
    		0,0,0,0,0,0,0,0,0,0,0,0,0,
    		16,
    		0,0,
    		0,
    		0,0,0,0};
    	if(!(hdc = GetDC(hwnd))) 
    		MessageBox(NULL, "Fehler beim hdc = GetDC", "Fehler", MB_OK| MB_ICONINFORMATION);
    	PixelFormat = ChoosePixelFormat(hdc, &pfd);
    	SetPixelFormat(hdc, PixelFormat, &pfd);
    	hglrc = wglCreateContext(hdc);
    	wglMakeCurrent(hdc, hglrc);
    	ShowWindow(hwnd, SW_SHOW);
    	SetForegroundWindow(hwnd);
    	SetFocus(hwnd);
    	ReSizeGLScene(width, height);
    	InitGL();
    	return TRUE;
    }
    
    LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
    	switch(uMsg)
    	{
    	case WM_ACTIVATE:
    		{
    			if(!HIWORD(wParam))
    				active = TRUE;
    			else
    				active = FALSE;
    			return 0;
    		}
    	case WM_SYSCOMMAND:
    		{
    			switch(wParam)
    			{
    			case SC_SCREENSAVE:
    			case SC_MONITORPOWER:
    				return 0;
    			}
    			break;
    		}
    	case WM_CLOSE:
    		{
    			PostQuitMessage(0);
    			return 0;
    		}
    	case WM_KEYDOWN:
    		{
    			keys[wParam] = TRUE;
    			return 0;
    		}
    	case WM_KEYUP:
    		{
    			keys[wParam] = FALSE;
    			return 0;
    		}
    	case WM_SIZE:
    		{
    			ReSizeGLScene(LOWORD(lParam), HIWORD(wParam));
    			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(MessageBox(NULL, "Soll im Vollbildmodus gestartet werden?", "Vollbildmodus", MB_YESNO | MB_ICONQUESTION) == IDNO)
    		fullscreen = FALSE;
    	if(!(CreateGLWindow("Das Fenster", 640, 480, 32, fullscreen)))
    		return 0;
    
    	while (done)
    	{
    		if (PeekMessage(&msg, NULL, 0,0,PM_REMOVE))
    		{
    			if(msg.message==WM_QUIT)
    				done = TRUE;
    			else
    			{
    				TranslateMessage(&msg);
    				DispatchMessage(&msg);
    			}
    		}
    		else
    		{
    			if(active)
    			{
    				if(keys[VK_ESCAPE])
    					done = TRUE;
    				else
    				{
    					DrawGLScene();
    					SwapBuffers(hdc);
    				}
    			}
    			if(keys[VK_F1])
    			{
    				keys[VK_F1] = FALSE;
    				KillGLWindow();
    				fullscreen =! fullscreen;
    				if(!CreateGLWindow("Das Fenster", 640,480,32,fullscreen))
    					return 0;
    			}
    		}
    	}
    	KillGLWindow();
    	return (msg.wParam);
    }
    

    Ich bedanke mich für die, die sich diesen Quellcode durchgelesen haben. 🙂



  • Kleiner Tipp:
    Wie oft wird wohl eine while-Schleife durchlaufen, wenn die Bedingung von vornherein FALSE ist?



  • Klar das ! hat bei der while - Schleife gefehlt,
    peinlich einen solchen Fehler zu machen, aber danke.



  • hättest du dir das ganze mal mit einem Debugger angekuckt wäre das nicht passiert


Anmelden zum Antworten