#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; }