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