#include <d3d9.h> #include <d3dx9.h> HWND CreateMainWindow(HINSTANCE hInstance); LRESULT CALLBACK MessageH



  • Guten Abend,

    ich möchte einfach nur ein Bild Fullscreen auf den Bildschirm zaubern. Leider sehe ich nicht mehr als einen komplett weißen Bildschirm. Von der Grafik ist keine Spur zu sehen. Ich hatte es schonmal so hinbekommen, dass die Grafik angezeigt wurde, jedoch nur bis zu einer bestimmten Größe (im Sinne von Auflösung) und nicht Fullscreen. Nun sehe ich aber, nach einigen Versuchen es zu ändern, nur noch einen weißen Bildschirm. Das Ganze soll mit DirectX funktionieren.

    Wäre für Tips sehr dankbar.

    ciao Christoph

    #include <d3d9.h>
    #include <d3dx9.h>
    
    HWND CreateMainWindow(HINSTANCE hInstance);
    
    LRESULT CALLBACK MessageHandler(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);
    
    HWND hWnd = 0;
    LPDIRECT3D9         lpD3D      = NULL;
    LPDIRECT3DDEVICE9   lpD3DDevice = NULL;
    LPDIRECT3DDEVICE9   m_lpD3DDevice = NULL;
    LPDIRECT3DSURFACE9   m_lpBackBuffer;
    LPDIRECT3DSURFACE9   m_lpSurface;
    D3DXIMAGE_INFO m_SrcInfo;
    
    const char* FILE_NAME  = "F:/test.bmp";
    
    BOOL InitDirect3D(HWND hWnd);
    
    int WINAPI WinMain(HINSTANCE hInstance,      // Handle der Programminstanz
                       HINSTANCE hPrevInstance,  // Handle der letzten Instanz
                       LPSTR lpCmdLine,          // Kommandozeile
                       int nCmdShow)             // Art wie das Fenster angezeigt werden soll
    {
        hWnd = CreateMainWindow(hInstance);
    
        if(0 == hWnd)
        {
            MessageBox(0, "Fenster konnte nicht erzeugt werden", "Fehler", MB_OK);
            return 0;
        }
    
       MSG msg;
    
       BOOL InitDirect3D(HWND hWnd);
    
        while(GetMessage(&msg, NULL, 0, 0))
       {
            // Nachricht an die Callbackfunktion senden
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    
        return 0;
    }
    
    HWND CreateMainWindow(HINSTANCE hInstance)
    {
        WNDCLASSEX wndClass =
        {
            sizeof(WNDCLASSEX),                                 // Groesse angeben
            CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW,    // Standardstile
            MessageHandler,                                     // Callback-Funktion
            0,                                                  // Zusaetzliche Angaben
            0,                                                  // nicht benoetigt
            hInstance,                                          // Anwendungsinstanz
            LoadIcon(NULL, IDI_WINLOGO),                        // Windows-Logo
            LoadCursor(NULL, IDC_ARROW),                        // Normaler Cursor
            (HBRUSH)GetStockObject(WHITE_BRUSH),                // Weisser Pinsel
            NULL,                                               // kein Menue
            "WindowClass",                                      // Der Name der Klasse
            LoadIcon(NULL, IDI_WINLOGO)                         // Windows Logo
        };
    
        RegisterClassEx(&wndClass);
    
        return CreateWindowEx(NULL,                   // Keine erweiterten Stile nutzen
                              "WindowClass",          // Klassenname
                              "Hello Windows",        // Fenstertitel
                              WS_POPUP |   // Fenster
                              WS_VISIBLE,             // Eigenschaften
                              0, 0, 1920, 1200,       // Anfangsposition und Groesse
                              NULL,                   // Handle des Elternfensters
                              NULL,                   // Handle des Menues
                              hInstance,              // Anwendungsinstanz
                              NULL);                  // wird nicht benoetigt
    }
    
    LRESULT CALLBACK MessageHandler(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
        switch(msg)
        {
            // wenn das Fenster geschlossen wird, eine Nachricht senden,
            // die das Programm beendet
            case WM_DESTROY:
                        PostQuitMessage(0);
                        return 0;
                    break;
    
          case WM_PAINT:
                   m_lpD3DDevice->Clear(0, 0,
                               D3DCLEAR_TARGET,
                               D3DCOLOR_XRGB(0, 0, 0),
                               0, 0);
    
                   m_lpD3DDevice->BeginScene();
    
                   RECT r = { 100, 100, 100 + m_SrcInfo.Width, 100 + m_SrcInfo.Height };
    
                   // Offscreen-Surface kopieren
                   m_lpD3DDevice->StretchRect(m_lpSurface,
                                          NULL,
                                        m_lpBackBuffer,
                                        &r,
                                        D3DTEXF_NONE);
    
                   m_lpD3DDevice->EndScene();
    
                   m_lpD3DDevice->Present(0, 0, 0, 0);
    
        }
    
        return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    
    BOOL InitDirect3D(HWND hWnd)
       {
          lpD3D = Direct3DCreate9(D3D_SDK_VERSION);
    
          if(NULL == lpD3D)
          {
             return FALSE;
          }
    
          D3DPRESENT_PARAMETERS PParams;
          ZeroMemory(&PParams,sizeof(PParams));
    
          PParams.SwapEffect         = D3DSWAPEFFECT_DISCARD;
          PParams.hDeviceWindow      = hWnd;
          PParams.Windowed         = FALSE;
    
          PParams.BackBufferWidth      = 1920;
          PParams.BackBufferHeight   = 1200;
          PParams.BackBufferFormat   = D3DFMT_A8R8G8B8;
    
          HRESULT hr;
    
          if(FAILED(lpD3D -> CreateDevice(
             D3DADAPTER_DEFAULT,
             D3DDEVTYPE_HAL,
             hWnd,
             D3DCREATE_HARDWARE_VERTEXPROCESSING,
             &PParams,
             &lpD3DDevice)))
          {
             return FALSE;
          }
    
          hr = D3DXGetImageInfoFromFile(FILE_NAME, &m_SrcInfo);
    
        // Offscreen-Surface anlegen
        m_lpD3DDevice->CreateOffscreenPlainSurface(
                                            m_SrcInfo.Width,   // Breite der Oberflaeche
                                            m_SrcInfo.Height,  // Hoehe  der Oberflaeche
                                            D3DFMT_A8R8G8B8,   // Format
                                            D3DPOOL_DEFAULT,   // Pool
                                            &m_lpSurface,      // Zeiger auf die Oberflaeche
                                            0);                // Handle muss 0 sein
    
        D3DXLoadSurfaceFromFile(m_lpSurface,      // Oberflaeche in die die Grafik geladen werden soll
                                NULL,             // Palette
                                NULL,             // Zielrechteck
                                FILE_NAME,        // Dateiname der Grafik
                                NULL,             // Quellrechteck
                                D3DX_FILTER_NONE, // Filter
                                0,                // Colorkey
                                NULL);
    
        // Zeiger auf dem Hintergrundpuffer holen
        m_lpD3DDevice->GetBackBuffer(0, 0,
                                     D3DBACKBUFFER_TYPE_MONO,
                                     &m_lpBackBuffer);
    
       return TRUE;
    
       }
    

Anmelden zum Antworten