OpenGL ft. WinApi- Über ChildWindow zeichen !?



  • Hi Leute,
    nach langen Versuchen frage ich nach, wie man mittels OpenGL/-WinApi über ein ChildWindow zeichnet. Später sollen in die Child's symetrische Objekte verschoben werde, aber da sist eine andere Sache...
    Immer wenn ich ein Objekt in das Child "hinein" verschieben möchte, überdeckt das Child meine Objekt. Möchte aber, das mein Objekt das Child überdeckt ! Hab bis jetzt fast alle befehle durchgeshclabbert und komme jetzt zu diesem Thread.

    Wen's interessiert, meine 4 Child's :

    case WM_CREATE:
    	{
    
             Child_top = CreateWindow(  "static",
                                      "",
                                      WS_CHILD | WS_VISIBLE | WS_BORDER,
                                      0, 0, 400, 400,
                                      hWnd,
                                      NULL,
                                      ((LPCREATESTRUCT) lParam) -> hInstance,
                                      NULL);
    
    		    Child_view_3D = CreateWindow(  "static",
                                      "",
                                      WS_CHILD | WS_VISIBLE | WS_BORDER | WS_THICKFRAME, 
                                      401, 0, 400, 400,
                                      hWnd,
                                      NULL,
                                      ((LPCREATESTRUCT) lParam) -> hInstance,
                                      NULL);
    
    			 Child_bottom = CreateWindow(  "static",
                                      "",
                                      WS_CHILD | WS_VISIBLE | WS_BORDER,
                                      0, 401, 400, 400,
                                      hWnd,
                                      NULL,
                                      ((LPCREATESTRUCT) lParam) -> hInstance,
                                      NULL);
    
    			  Child_right = CreateWindow(  "static",
                                      "",
                                      WS_CHILD | WS_VISIBLE | WS_BORDER,
                                      401, 401, 400, 400,
                                      hWnd,
                                      NULL,
                                      ((LPCREATESTRUCT) lParam) -> hInstance,
                                      NULL);
    
    ShowWindow(Child_top,SW_SHOW);
    SetFocus(Child_top);
    SetForegroundWindow(Child_top);
    
    ShowWindow(Child_view_3D,SW_SHOW);
    SetFocus(Child_view_3D);
    SetForegroundWindow(Child_view_3D);
    
    ShowWindow(Child_bottom,SW_SHOW);
    SetFocus(Child_bottom);
    SetForegroundWindow(Child_bottom);
    
    ShowWindow(Child_right,SW_SHOW);
    SetFocus(Child_right);
    SetForegroundWindow(Child_right);
    
    .....
    

    Danke im Voraus !



  • habe ich das richtig verstanden, dass du im parent fenster zeichnest, du die grafik-ausgabe aber in den child-fenstern haben willst?

    mit welchem zweck?

    schlechtes design? wie wärs, wenn du in den child fenstern zeichnest, da wo auch die objekte erscheinen sollen, und für diese eigene fensterklassen registrierst. andernfalls müsstest du die Statics schon subclassen, und ihnen zur abwechslung auch einen static style geben.

    Ist doch logisch, dass ein Child-Fenster deine OGL-Grafikausgabe überdeckt, wenn es über deinem, bzw in deinem Fenster liegt.

    also nochmal: mit welchem zweck?



  • Also die Sache ist so, das Programm soll ein kleiner 3D-"Editor" werden, deshalb hab ich für die verschiednen Blickwinkel 4 Child's erstellt, und darin sollen die Objekte dargestellt werden.



  • schlechtes design? wie wärs, wenn du in den child fenstern zeichnest, da wo auch die objekte erscheinen sollen, und für diese eigene fensterklassen registrierst. andernfalls müsstest du die Statics schon subclassen, und ihnen zur abwechslung auch einen static style geben.

    Ok, ich versuch's mal zu interpretieren, soweit ich des verstanden hab :

    (Child_view_3D=CreateWindowEx(WS_OVERLAPPEDWINDOW,
    NULL,
    "",
    WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_BORDER|
    dwStyle,
    401,0,
    400,400,
    NULL,
    NULL,
    hInstance,
    NULL))
    


  • Bei mir läuft es so:

    ViewWin[0].hWnd = CreateWindowEx( 
        WS_EX_CLIENTEDGE, (LPSTR) "View", ViewWin[0].szName,
        WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS,
        0, 0, 0, 0,            // x,y, Breite, Höhe
        hWndMain,              // übergeordnetes Fenster
        (HMENU) 10,            // wID bei WM_CHILD
        hInstance,             // Handle des Fenster-Vorkommens
        (LPSTR) NULL );        // Keine Parameter zur Übergabe
    

    Die Struktur VIEW ViewWin[4] beinhaltet alle notwendigen OGL Parameter, wie z.B. Kamera, Darstellungsvolumen, Matrizen etc.
    Die OGL Fenster haben eine eigene WNDPROC, in der ich bei WM_CREATE z.B. den wglContext erzeuge.
    Die Positionen setze ich beim WM_SIZE des Hauptfensters.

    Hope this helps,
    Frank.



  • Wie genau hast du ViewWin definiert ? Hast du das Child in ein eigenes ParentFenster mit Style eingebettet ?



  • pivke schrieb:

    Wie genau hast du ViewWin definiert ? Hast du das Child in ein eigenes ParentFenster mit Style eingebettet ?

    Sorry, habe die Frage erst jetzt gesehen.

    Es ist eine einfache Struktur, die schlichtweg nur das Erscheinungsbild, die Ausmaße und das darzustellende Volumen beinhaltet.
    Ohne Titelleiste kann ich es z.B. 4x innerhalb des Hauptfensters positionieren.
    Da in reinem C geschrieben, hat es natürlich keine wirkliche Objektorientierung.
    Die verwendeten Funktionen nutzen daher einfach globale Variablen auf die "Fensterobjekte".

    Edit:
    nach dem dritten Durchlesen vermute ich, dass Du ins Hauptfenster zeichnen willst und die Childwindows nur als Ansichtenrahmen dienen sollen...?!
    Macht für mich irgendwie keinen Sinn.
    Daher habe ich die 4 einzelnen Childwindows mit eigenem OGL Kontext und eigener (globaler) Wndproc.
    Würde es der glViewport Trickserei allemal vorziehen.


Log in to reply