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

Anmelden zum Antworten