Ein Bild (*.bmp) mit DirectX im Vollbildmodus anzeigen lassen!?



  • Hallo,

    mein Programm soll einfach nur ein x-beliebiges Bild anzeigen (Vollbild). Mein Bildschirm hat eine Auflösung von 1920x1200. Das Bild, was angezeigt werden soll ebenfalls.

    Starte ich das Programm wird der komplette Bildschirm weiß. Ich war schonmal soweit, dass wenn ich das Bild in eine kleinere Auflösung konvertiert habe, er es dann angezeigt hat, aber ebend nicht Vollbild.

    Visual gibt auch ganz viele solcher Meldungen aus:

    Eine Ausnahme (erste Chance) bei 0x013f17cf in GraphicsX.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000000.
    Eine Ausnahme (erste Chance) bei 0x013f17cf in GraphicsX.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000000.
    Eine Ausnahme (erste Chance) bei 0x013f17cf in GraphicsX.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000000.
    Eine Ausnahme (erste Chance) bei 0x013f17cf in GraphicsX.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000000.
    Das Programm "[1580] GraphicsX.exe: Systemeigen" wurde mit Code 0 (0x0) beendet.

    Vielen Dank...

    ciao Peter

    #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:/test2.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_KEYDOWN:
                   switch(wParam)
                   {
                     // Wenn ESC gedrueckt, Anwendung beenden
                     case VK_ESCAPE:
                             DestroyWindow(hWnd);
                          break;
                   }
                 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);
    				break;
        }
    
        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_SOFTWARE_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;
    
    	}
    


  • Bau doch mal paar asserts ein für Nullzeiger, dann kriegst du es vielleicht raus.


Anmelden zum Antworten