ich versuche momentan mir eigene Komponenten zu schreiben, die auf OpenGL basieren. Allerdings scheitert er bei mir bei der erzeugung vom OpenGL_Kontext. Bei den markierten Stellen hat er irgendwie Probleme. Ich verstehe den Grund aber noch nicht .
Also meines Wissens ist das Handle erst gülig, wenn das (windows)Fenster Diener Komponente erzeugt wurde. Kein Handle, kein DC. Mein Vorschlag wäre, Du baust den GLInit in die Methode CreateWnd und im DetroyWnd hauste den DC wieder platt.
_________________ Manchmal sehen Dinge, die wie Dinge aussehen wollen, mehr wie Dinge aus, als Dinge.
<Esmerelda Wetterwax>
Es kann vorkommen, dass die Nachkommen trotz Abkommen mit ihrem Einkommen nicht auskommen und umkommen.
Nein, weil wenn der Parent auch noch nicht sichtbar ist, und das isser nicht im FormCreate, dann ist das Child auch nicht sichtbar.
Das Handle ist wirklich erst dann gültig, wenn Windows das Fenster für die Komponente erzeugt hat und dieses wird erst dann erzeugt, wenn die Komponente wirklich sichtbar ist.
Abgesehen davon muss der Benutzer deiner Klasse ja nicht unbedingt wissen, dass ein eventueller Parent bereits sichtbar sein muss und spätestens dann hast Du ein Problem.
Ich hatte die selbe Situation wie Du mit einem eigenen GL-Panel und da hat nur die Erzeugung des DC im CreateWnd geholfen.
_________________ Manchmal sehen Dinge, die wie Dinge aussehen wollen, mehr wie Dinge aus, als Dinge.
<Esmerelda Wetterwax>
Es kann vorkommen, dass die Nachkommen trotz Abkommen mit ihrem Einkommen nicht auskommen und umkommen.
Nein, weil wenn der Parent auch noch nicht sichtbar ist, und das isser nicht im FormCreate, dann ist das Child auch nicht sichtbar.
Nun gut, dass hatte ich auch scon mal ausprobiert, also wenn man auf nen Button klickt, dass es dann erst frei gegeben wird. Aber das hat auch nichts gebracht, da GetDC trotzdem fehlschlug.
Sidorion hat geschrieben:
Ich hatte die selbe Situation wie Du mit einem eigenen GL-Panel und da hat nur die Erzeugung des DC im CreateWnd geholfen.
Wird CreateWnd immer dann aufgerufen, wenn die Komponente sichtbar wird?
Genaugenommen dann, wenn die Komponente ein gültiges Handle bekommt, was in der Regel der selbe Zeitpunkt ist. Du solltest allerdings hier trotzdem prüfen, ob die Komponente nicht zufällig grade zerstört wird, dann darfst Du keinen DC erzeugen.
_________________ Manchmal sehen Dinge, die wie Dinge aussehen wollen, mehr wie Dinge aus, als Dinge.
<Esmerelda Wetterwax>
Es kann vorkommen, dass die Nachkommen trotz Abkommen mit ihrem Einkommen nicht auskommen und umkommen.
Abfragen kannst Du das mit dem ComponentState. Wenn die Komponente gerade zerstört wird, ist csDestroying enthalten. Näheres siehe OH.
Fenster erhalten ein Handle, sobald Windows das für nötig hält. Bereits erzeugte Handles bleiben imho erhalten, wenn das Fenster usichtbar wird bzw. eine Ausdehnung von null hat.
Ich bekam damals ne Schutzverletzung, wenn ich den DC während des Destruierens erzeugen wollte.
_________________ Manchmal sehen Dinge, die wie Dinge aussehen wollen, mehr wie Dinge aus, als Dinge.
<Esmerelda Wetterwax>
Es kann vorkommen, dass die Nachkommen trotz Abkommen mit ihrem Einkommen nicht auskommen und umkommen.
Ich habs jetzte mal gerade umgesetzt. Ergebnis: Es besteht immer noch das gleiche Problem. Zwar wird GetDC jetzt erst aufgerufen, wenn CreateWnd aufgerufen wird, aber leider ändetr das nichts am Ergebnis :
Stimmt. Jetzt hängt er nicht mehr an GetDC (was auch einen vernünftigen Wert zurückliefert, also >0), aber er hängt jetzte an der darauf folgenden Zeile, also am wglCreateContext.
Das Pixelformat von dem DC muß auch noch OpenGL kompatibel gemacht werden. Vermute im Wiki oder bei CreateRenderingContext im Header ist ein Beispielquelltext dazu.
Ich habs . DescribePixelformat hat bei mir nicht, wie ich es nach MSDN erwartet hatte, das maximale Profil zurückgegeben. Ist es eiegtnlich möglich, sich irgendwie das aktuelle pfd von Win zurück geben zu lassen (DescribePixelformat machts ja schießlich doch nicht )?
Es ist ja schön, dass du dir das Pixelformat beschreiben lässt aber das von dir gewählte Pixelformat (aufruf von ChoosePixelFormat) ignorierst du bzw dessen Ergebniss davon. Du musst das Ergebniss speichern und dann später auch mit SetPixelFormat auf deinen DC zuweisen. Sonst bleibt alles beim Alten. Soll bedeuten es müsste eigentlich so aussehen.
Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.