mit OGL/SDL in Windows-Fenster zeichen
-
Hi,
ist es mit OGL/SDL möglich in Fenster zu zeichnen (also die die einen HWND haben)? Wenn ja, dann könnt ihr mir es erklären wie das geht? Oder wie macht ihr es wenn ihr euere Leveleditoren erstellt?
-
eigentlich zeichnet man doch immer in ein Fenster
- nicht nur bei einem Leveleditor
-
Ja, aber z.B. bei SDL wird ein neues Fenster erstellt. Ich möchte aber das man auf einen von mir festgelegten Fenster zeichnet. Also in einem Leveleditor, das man dann auf eine Image-Komponente (von C++Builder) zeichnet. Ist es irgendwie möglich?
-
nein, mit SDL wirst du das nicht hinbekommen!
das muss mit purer winapi und opengl gemacht werden..
-
beim dev-cpp wird folgendes template mitgeliefert:
// Includes #include <windows.h> #include <gl/gl.h> // Function Declarations LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ); VOID EnableOpenGL( HWND hWnd, HDC * hDC, HGLRC * hRC ); VOID DisableOpenGL( HWND hWnd, HDC hDC, HGLRC hRC ); // WinMain int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iCmdShow ) { WNDCLASS wc; HWND hWnd; HDC hDC; HGLRC hRC; MSG msg; BOOL bQuit = FALSE; float theta = 0.0f; // register window class wc.style = CS_OWNDC; wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon( NULL, IDI_APPLICATION ); wc.hCursor = LoadCursor( NULL, IDC_ARROW ); wc.hbrBackground = (HBRUSH)GetStockObject( BLACK_BRUSH ); wc.lpszMenuName = NULL; wc.lpszClassName = "GLSample"; RegisterClass( &wc ); // create main window hWnd = CreateWindow( "GLSample", "OpenGL Sample", WS_CAPTION | WS_POPUPWINDOW | WS_VISIBLE, 0, 0, 256, 256, NULL, NULL, hInstance, NULL ); // enable OpenGL for the window EnableOpenGL( hWnd, &hDC, &hRC ); // program main loop while ( !bQuit ) { // check for messages if ( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) ) { // handle or dispatch messages if ( msg.message == WM_QUIT ) { bQuit = TRUE; } else { TranslateMessage( &msg ); DispatchMessage( &msg ); } } else { // OpenGL animation code goes here } } // shutdown OpenGL DisableOpenGL( hWnd, hDC, hRC ); // destroy the window explicitly DestroyWindow( hWnd ); return msg.wParam; } // Window Procedure LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) { switch ( message ) { case WM_CREATE: return 0; case WM_CLOSE: PostQuitMessage( 0 ); return 0; case WM_DESTROY: return 0; case WM_KEYDOWN: switch ( wParam ) { case VK_ESCAPE: PostQuitMessage( 0 ); return 0; } return 0; default: return DefWindowProc( hWnd, message, wParam, lParam ); } } // Enable OpenGL VOID EnableOpenGL( HWND hWnd, HDC * hDC, HGLRC * hRC ) { PIXELFORMATDESCRIPTOR pfd; int iFormat; // get the device context (DC) *hDC = GetDC( hWnd ); // set the pixel format for the DC ZeroMemory( &pfd, sizeof( pfd ) ); pfd.nSize = sizeof( pfd ); pfd.nVersion = 1; pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; pfd.iPixelType = PFD_TYPE_RGBA; pfd.cColorBits = 24; pfd.cDepthBits = 16; pfd.iLayerType = PFD_MAIN_PLANE; iFormat = ChoosePixelFormat( *hDC, &pfd ); SetPixelFormat( *hDC, iFormat, &pfd ); // create and enable the render context (RC) *hRC = wglCreateContext( *hDC ); wglMakeCurrent( *hDC, *hRC ); } // Disable OpenGL VOID DisableOpenGL( HWND hWnd, HDC hDC, HGLRC hRC ) { wglMakeCurrent( NULL, NULL ); wglDeleteContext( hRC ); ReleaseDC( hWnd, hDC ); }
der rest ist nur noch abändern...
-
Danke erstmal, den Code werde später dann ausprobieren.