OpenGL im Childfenster - Größe läßt sich nicht anpassen
-
Hi,
ich habe folgendes Problem:
Wenn ich den Code (gekürzt, siehe Unten) compiliere und starte erscheint der Button in Parentfenster wie gewünscht, nur das OpenGL-Fenster will keine Größenwerte annehmen, sondern beansprucht den gesamten freien Platz im P-Fenster.Weiss jemand Rat?
Vielen Dank vorweg
globalplayer#include "stdafx.h" #include <windows.h> #include <gl\glu.h> // Damit kann Glu32 genutzt werden. #include <gl\gl.h> // Damit kann OpenGL32 genutzt werden. #include <gl\glaux.h> // Und das Gleiche nochmal für Glaux HGLRC hRC=NULL; // Der OpenGL Rendering Context HDC hDC=NULL; // Geschützter GDI Device Context bool active=TRUE; // Wenn active FALSE ist, wurde das // Fenster vom Benutzer minimiert. HWND hWnd; BOOL CreateGLWindow(char* title, int width, int height, int bits, bool fullscreenflag); int DrawGLScene(GLvoid); int InitGL(GLvoid); GL void KillGLWindow(GLvoid); GLvoid ReSizeGLScene(GLsizei width, GLsizei height); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK ChldProc(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK OpenGLProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { MSG msg; //HWND hWnd; WNDCLASS wc; const char szAppName[] = "Windows Buttons"; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hbrBackground = (HBRUSH) GetStockObject(LTGRAY_BRUSH); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hInstance = hInstance; wc.lpfnWndProc = WndProc; wc.lpszClassName = szAppName; wc.lpszMenuName = NULL; wc.style = CS_HREDRAW | CS_VREDRAW; RegisterClass(&wc); wc.hbrBackground =(HBRUSH) GetStockObject(WHITE_BRUSH); wc.hIcon = NULL; wc.style = CS_OWNDC ; wc.lpfnWndProc = OpenGLProc; wc.lpszClassName = "OpenGL"; // OpenGL wird der Name der Klasse if (!RegisterClass(&wc)) // Versuch die Klasse zu registrieren { MessageBox(NULL,"Konnte die Fensterklasse nicht registrieren.","ERROR",MB_OK|MB_ICONEXCLAMATION); return FALSE; // FALSE zurückgeben und beenden } hWnd = CreateWindow( szAppName, szAppName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); CreateGLWindow("Nur ein schwarzes Fenster",1,1,32,FALSE); ShowWindow(hWnd, iCmdShow); UpdateWindow(hWnd); /* +++++++++++++++ CODE... +++++++++++++++ */ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { static HWND hButton,hScreen1; switch (message) { case WM_CREATE: { hScreen1 = CreateWindow( "OpenGL", NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, // Wird auch von OpenGL benötigt 0, 30, 300, 300, hWnd, NULL, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); hButton = CreateWindow( "button", "ZOOM", WS_CHILD | WS_VISIBLE, 0,0, 50, 30, hWnd, NULL, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); return 0; } case WM_SIZE: { MoveWindow(hScreen1,0,30,500,300, TRUE); MoveWindow(hButton,0,0, 50, 30, TRUE); return 0; } //++++++++++++++++++++++ CODE... ++++++++++++++++++++ GLvoid ReSizeGLScene(GLsizei width, GLsizei height) // Initialisierung des OpenGL-Fensters { if (height==0) { height=1; } // height darf nicht 0 sein, damit es im späteren // Programmablauf nicht zu einer Division durch 0 kommt. glViewport(0, 0, width, height); // Hier wird der Mittelpunkt auf den die Perspektive zuläuft // zurückgesetzt. glMatrixMode(GL_PROJECTION); // Hier wird die Projektionsmatrix festgelegt glLoadIdentity(); // und angepasst gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f); // Hier wird die das Verhältnis der Höhe zur Breite übergeben // und der Verzerrungswinkel von 45 Grad übergeben glMatrixMode(GL_MODELVIEW); // Hier wird die sogenannte modelview-Matrix festgelegt glLoadIdentity(); // und angepasst. } int InitGL(GLvoid) { glShadeModel(GL_SMOOTH); // Das Smooth Shading wird aktiviert, das // sehr schöne Farbübergänge auf Körpern ermöglicht. glClearColor(10.0f, 10.0f, 0.0f, 0.0f); // In diesem Falle ein schwarzer Hintergrund glClearDepth(1.0f); // depht buffer zurückgesetzt glEnable(GL_DEPTH_TEST); // Aktivierung des depht Tests (dazu später mehr.) glDepthFunc(GL_LEQUAL); // Der Typ des Depht Tests wird festgelegt glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Perspektive wird festgelegt return TRUE; // Initialisierung scheint geklappt zu haben! } int DrawGLScene(GLvoid) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Die vorherige Szene wird vom Bildschirm gelöscht, // damit die neuen nicht einfach über die alten // Objekte gezeichnet werden glLoadIdentity(); // modelview-Matrix wird wieder einmal zurückgesetzt return TRUE; // Alles hat geklappt } BOOL CreateGLWindow(char* title, int width, int height, int bits, bool fullscreenflag) { GLuint PixelFormat; // Speichert das Pixelformat static PIXELFORMATDESCRIPTOR pfd= // pdf ist jetzt ein PIXELFORMATDESCRIPTOR { sizeof(PIXELFORMATDESCRIPTOR), // Die größe muss natürlich stimmen 1, // Versionsnummer PFD_DRAW_TO_WINDOW | // Das Format muss in Fenster sichtbar sein können PFD_SUPPORT_OPENGL | // OpenGL muss unterstützt werden PFD_DOUBLEBUFFER, // Double Buffering muss unterstützt werden PFD_TYPE_RGBA, // Das RGBA (Rot,Grün,Blau,Alpha(Transparenz)) // muss unterstützt werden bits, // Die Farbtiefe, die schon // übergeben wurde, wird hier benötigt 0, 0, 0, 0, 0, 0, // wird nicht benötigt 0, // kein Alpha Buffer 0, // Shift Bit ignoriert 0, // kein Accumulation Buffer 0, 0, 0, 0, // nicht benötigt 16, // 16Bit Z-Buffer (Depth Buffer) 0, // kein Stencil Buffer 0, // kein Auxiliary Buffer PFD_MAIN_PLANE, // Die Hauptebene auf die später gezeichnet wird 0, // unwichtig 0, 0, 0 // keine Ebenenmasken benötigt }; if (!(hDC=GetDC(hWnd))) // Versuch, den DC zu bekommen { KillGLWindow(); // Alles rückgängig machen MessageBox(NULL,"Konnte keinen DC erstellen.","ERROR",MB_OK|MB_ICONEXCLAMATION); return FALSE; // FALSE zurückgeben, beenden } if (!(PixelFormat=ChoosePixelFormat(hDC,&pfd))) // Kann Windows ein passendes finden? { // Falls keins gefunden werden kann: KillGLWindow(); // Alles zurücksetzen MessageBox(NULL,"Konnte kein passendes Pixelformat finden.","ERROR",MB_OK|MB_ICONEXCLAMATION); return FALSE; // FALSE zurück und Ende. } if(!SetPixelFormat(hDC,PixelFormat,&pfd)) // Kann das Pixelformat gesetzt werden? { KillGLWindow(); // Leider nicht, Fehlerpopup und raus MessageBox(NULL,"Konnte Pixelformat nicht setzen.","ERROR",MB_OK|MB_ICONEXCLAMATION); return FALSE; // FALSE zurück und raus } if (!(hRC=wglCreateContext(hDC))) // Versuch den RC zu bekommen { KillGLWindow(); // Alles rückgängig machen MessageBox(NULL,"Konnte keinen Rendering Context bekommen.","Fehler",MB_OK|MB_ICONEXCLAMATION); return FALSE; } if(!wglMakeCurrent(hDC,hRC)) // Versuch den RC zu aktivieren { KillGLWindow(); // hat nicht geklappt, also alles zurück MessageBox(NULL,"Konnte den Rendering Context nmicht aktivieren.","Fehler",MB_OK|MB_ICONEXCLAMATION); return FALSE; } ReSizeGLScene(width, height); // Die Perspektive wird aktiviert if (!InitGL()) // Initialisiere das OpenGL Fenster { KillGLWindow(); // Falls das nicht geklappt // haben sollte alles rückgängig machen MessageBox(NULL,"Initialisierung fehlgeschlagen.","Fehler",MB_OK|MB_ICONEXCLAMATION); return FALSE; // FALSE wird zurückgegeben } return TRUE; // Alles hat geklappt!!! }