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.


Anmelden zum Antworten