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.