G
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!!!
}