PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [MFC/OpenGL] OpenGL in ein MFC-Control setzen


WhiteVelvet
2006-05-23, 15:06:14
Ich surfe nun seit einiger Zeit durch das Web auf der Suche nach einem einfachen Tutorial, wie ich in mein Programm ein OpenGL-Fenster eingebaut bekomme. Allerdings benutzen alle Tuts die ich gefunden habe das gesamte Fenster als OpenGL-Umgebung, ich möchte aber nur eine GroupBox.

Hier zum Beispiel: http://www.codeworx.org/opengl_tut2.php

Wo setze ich da die GroupBox ein? Soweit ich mich erinnern kann hat es etwas mit dem Darstellungskontext zutun, reicht es vielleicht

HGLRC hRC=NULL;

durch

HGLRC hRC=IDC_GROUPBOX;

zu ersetzen?

EDIT: Diese Website bringt mich nächsten an mein Ziel: http://www.3dsource.de/faq/mswindows.htm#mswi0160
Bloss ist der Link zu dem Beispiel down :(

Gast
2006-05-23, 20:04:02
WhiteVelvet[/POST]']Ich surfe nun seit einiger Zeit durch das Web auf der Suche nach einem einfachen Tutorial, wie ich in mein Programm ein OpenGL-Fenster eingebaut bekomme. Allerdings benutzen alle Tuts die ich gefunden habe das gesamte Fenster als OpenGL-Umgebung, ich möchte aber nur eine GroupBox.

Hier zum Beispiel: http://www.codeworx.org/opengl_tut2.php

Wo setze ich da die GroupBox ein? Soweit ich mich erinnern kann hat es etwas mit dem Darstellungskontext zutun, reicht es vielleicht

HGLRC hRC=NULL;

durch

HGLRC hRC=IDC_GROUPBOX;

zu ersetzen?äääähm... nein. Reicht nicht :)

Warum das so ist, sollte dir auffallen, wenn du dir die Tuts mal etwas genauer durchliest. Dann solltest du feststellen, daß hRC nicht auf NULL stehenbleibt (damit wird es nur initialisiert), sondern mittels der Funktionen wglCreateContext() und wglMakeCurrent() mit dem Gerätekontext (hDC) des Ausgabefensters verknüpft wird. Üblicherweise geschieht dies in einer Funktion EnableOpenGL() (sie kann aber auch ganz anders genannt werden):

void EnableOpenGL (HWND hWnd, HDC *phDC, HGLRC *phRC)
{
/* get the device context (DC) */
*phDC = GetDC (hWnd);

/* create and enable the render context (RC) */
*phRC = wglCreateContext( *phDC );
wglMakeCurrent( *phDC, *phRC );
}

hWnd ist der Window-Handle des Ausgabefensters, für den du mit GetDC() einen Gerätekontext anforderst, auf den phDC zeigt.

In der MFC-Version hast du zunächst kein HWND und HDC, dafür die Klassen CWnd und CDC. Das könnte dann z.B. so aussehen:

void EnableOpenGL_MFC (const CWnd &cWnd, CDC **ppcDC, HGLRC *phRC)
{
/* get the device context (DC) */
*ppcDC = cWnd.GetDC ();

/* get DC handle from CDC instance */
HDC hDC = ppcDC->GetSafeHandle();

/* create and enable the render context (RC) */
*phRC = wglCreateContext( hDC );
wglMakeCurrent( hDC, *phRC );
}

sieht ein bißchen kompliziert aus, hängt aber damit zusammen, daß die wgl-Funktionen (OpenGL-Funktionen speziell für Windows) auf der Win32-API basieren und daher Handles benötigen, die MFC die Win32-API aber in einem Klassensystem kapselt, aus dem du die Handles erst einmal herausholen mußt.

Um jetzt deine Groupbox als Ausgabefenster zu benutzen, müßtest du jetzt einfach als Parameter an EnableOpenGL_MFC() eine Referenz auf die CWnd-Instanz der Groupbox übergeben.

WhiteVelvet
2006-05-23, 23:09:51
Danke für die ausführliche Antwort, ich schau mir das mal genauer an :)

WhiteVelvet
2006-05-24, 17:13:12
So, habe das nun mal ausprobiert... die Zeile

*ppcDC = cWnd.GetDC ();

liefert den Fehler

'GetDC' : cannot convert 'this' pointer from 'const class CWnd' to 'class CWnd &'

Zweitens, wie sieht der Aufruf dieser Funktion aus? Sowas wie

EnableOpenGL_MFC(IDC_OPENGLWND)

Was passiert mit den anderen beiden Parameters? Danke für weitere Tips!

Gast
2006-05-29, 11:01:08
WhiteVelvet[/POST]']So, habe das nun mal ausprobiert... die Zeile

*ppcDC = cWnd.GetDC ();

liefert den Fehler

'GetDC' : cannot convert 'this' pointer from 'const class CWnd' to 'class CWnd &'hm, dann ist wohl GetDC() nicht als const deklariert, d.h. es ist nicht sichergestellt, daß der Aufruf dieser Funktion die CWnd-Instanz unverändert läßt. Probier einfach mal in der Parameterliste von EnableOpenGL_MFC() CWnd& cWnd statt const CWnd& cWnd, dann sollte es gehen.

WhiteVelvet[/POST]']
Zweitens, wie sieht der Aufruf dieser Funktion aus? Sowas wie

EnableOpenGL_MFC(IDC_OPENGLWND)IDC_OPENGLWND ist vermutlich der Identifier des Ausgabefensters, der nützt dir hier nichts. Was du übergeben mußt, ist eine Referenz auf die CWnd-Instanz:

// das zu deiner Group Box gehörende Objekt
CGroupBox cGroupBox;

CDC *pcDC;
HGLRC hRC;

EnableOpenGL_MFC(cGroupBox, &pcDC, &hRC);

del_4901
2006-05-29, 12:30:45
es gibt noch den const_cast<> falls das weiterhilft ... da kenn nich niks^^

Chris Lux
2006-05-29, 13:10:27
http://nehe.gamedev.net/

schau mal an der linken seite unten bei OpenGL Basecode. dort ist auch ein mfc port. vielleicht hilft dir das. die nehe tutorials kann ich auch empfehlen als sehr gute opengl einstiege...

WhiteVelvet
2006-05-30, 01:06:51
Jepp, NeHe ist sehr gut, habe das Problem aber in der Zwischenzeit lösen können :)

Für alle, die ähnliche Probleme haben (werden) hier der goldene Link zum Tutorial, das mir geholfen hat:

http://www.bfowle.com/journal/modules/blog/index.php?post_id=4