PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C++/MFC] 2 OpenGL Views in einer Anwendung


WhiteVelvet
2006-07-24, 18:17:09
Es hörte sich hier heute so an, als wenn das kein Problem sei. Ich habe eine Anwendung mit einem TabCtrl und 2 Tabs mit jeweils einem CStatic, auf das das OpenGL gezeichnet werden soll. Zudem habe ich eine Klasse, die alle OpenGL Befehle kapselt. Es wird immer nur ein OpenGL View angezeigt, je nachdem auf welches Tab man geklickt hat. Bisher erstellt ein Tab eine Instanz der OpenGLCtrl Klasse und nachdem der RenderTimer aktiviert wurde, wird gezeichnet. Aber wie wechsle ich nun den RenderContext zum anderen Tab? Und vorallem wo mache ich das? Ich weiss bisher nur, dass ich irgendwo wglMakeCurrent benutzen soll, aber wo? Ich würde ja gerne das Tutorial verlinken, nach dem ich das alles programmiert habe, aber leider ist es offline.
Es geht erstmal nur um die Struktur, wo würdet Ihr was hinschreiben (Create, Instanziierung, wglMakeCurrent)?

Coda
2006-07-24, 18:21:16
Na wenn du den Tab wechselst natürlich.

WhiteVelvet
2006-07-24, 18:26:36
@Coda: Ach, wirklich? Gut aufgepasst!

Ich probiers mal eindeutiger: Dieses Tutorial ist so sehr ähnlich wie mein Code:

http://steinsoft.net/index.php?site=Programming/Tutorials/opengl_dialog&printable=1

Einfache Frage: an welcher Stelle würdet Ihr den Code ändern, damit man das Zielfenster wechseln kann? Ich sehe da nur ein *parent (mein Zielfenster) in ::Create, aber ich create ja nur einmal. Also wie wechsle ich das Zielfenster?

zeckensack
2006-07-29, 07:18:03
wglMakeCurrent wenn der Focus auf das andere Fenster wechselt (WM_ACTIVATE abfangen). Das Fenster dass den Focus verliert sollte den Kontext freigeben, das Fenster das den Focus erhält kann ihn dann übernehmen. Kreuze die Finger dass dir Windows die Nachrichten in der richtigen Reihenfolge schickt. OpenGL ist nämlich nicht nur strikt spezifiziert sondern auch thread-safe ...

Eigentlich solltest du getrennte GL-Kontexte erstellen, einen für jedes Fenster. Es kann auch so funktionieren, da ja beide Fenster normalerweise auf dem gleichen Desktop mit der gleichen Farbtiefe rennen, aber es ist und bleibt riskant, und wenn du's irgendwie hinbekommst dann mach es bitte separat.

WhiteVelvet
2006-07-29, 10:30:19
Danke für die Antwort, aber es läuft schon seit 3 Tagen, Gott sei Dank ;) Die OpenGL Instanz kann zum Glück öfters existieren. Ich habe also meine Klasse komplett neugeschrieben mit dem Code von dem hier genannten Tutorial, weggelassen habe ich aber die Threadgeschichte und ich habe einen Timer hinzugefügt. Beim Wechsel der Tabs muss ich nur den Rendertimer des anderen beenden und den eigenen starten. Das wars schon. Beim Wechsel sieht man noch ganz kurz die Kameraeinstellung des anderen Fensters im neuen Fenster, aber das ist egal.