|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
ChrLE20 Mini JLI'ler
Anmeldedatum: 03.11.2009 Beiträge: 1
Medaillen: Keine
|
Verfasst am: 03.11.2009, 19:10 Titel: Ein *.bmp Bild Fullscreen anzeigen!Bildschirm bleibt schwarz |
|
|
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.
Wäre für Tips sehr dankbar.
ciao Christoph
CPP: | #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;
}
|
Edit(Kampfhund): Code Tags durch cpp-Tags ersetzt. |
|
Nach oben |
|
|
User_User JLI'ler
Anmeldedatum: 05.08.2004 Beiträge: 137
Medaillen: Keine
|
Verfasst am: 07.11.2009, 16:03 Titel: |
|
|
Bei mir wird die Programmausführung unterbrochen. Die Variable m_lpD3DDevice in WM_PAINT ist NULL
Wenn du folgenden Code in WM_PAINT einfügst, sollte die Break-Anweisung nicht ausgeführt werden. Außer m_lpD3DDevice ist NULL. Wenn du den Ton hörst, hat dein Fehler eine andere Ursache als bei mir.
CPP: | if (m_lpD3DDevice == 0)
{ break;}
else
{ Beep(400,400);} |
Außerdem braucht man nur einen Device. Dein Code:
CPP: | LPDIRECT3DDEVICE9 lpD3DDevice = NULL;
LPDIRECT3DDEVICE9 m_lpD3DDevice = NULL; |
Den Fehler kann ich im Moment nicht finden. |
|
Nach oben |
|
|
Robin Junior JLI'ler
Alter: 30 Anmeldedatum: 29.10.2008 Beiträge: 73 Wohnort: Inneringen Medaillen: Keine
|
Verfasst am: 07.11.2009, 22:48 Titel: |
|
|
hey habs net hinbekommen ... hab darin aber ein paar fehler gefunden .. auf jeden fall hab ich des beispiel ein bisschen geändert, dass es jetzt so geht wie du es haben willst ... da musste warscheinlich noch die grafik und die auflösung ändern, aber das ist ja nicht schwer ... Hier der Link: .:DOWNLOADEN:.
Gruß Robin |
|
Nach oben |
|
|
Cyianor Super JLI'ler
Anmeldedatum: 23.12.2002 Beiträge: 452
Medaillen: Keine
|
Verfasst am: 14.12.2009, 13:15 Titel: Re: Ein *.bmp Bild Fullscreen anzeigen!Bildschirm bleibt sch |
|
|
Hey Christoph!
CPP: | 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;
// Vlt ist da ja das Problem
BOOL InitDirect3D(HWND hWnd);
while(GetMessage(&msg, NULL, 0, 0))
{
// Nachricht an die Callbackfunktion senden
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
} |
Ich weiß nicht ob die Frage noch aktuell ist, aber falls doch:
Dein Problem könnte evtl an einem (vermutlichen) Copy & Paste Fehler liegen. Und zwar wird bei dir Direct3D nicht initialisiert, da du anstatt die Funktion aufzurufen einfach nochmal den Funktionsprototyp in deine WinMain Funktion schreibst. Hab leider kein Windows da um auszuprobieren ob es dann geht, aber es wäre eine Möglichkeit, dass es daran liegt. Also einfach mal das BOOL weglassen.
Weiß müsste dein Bildschirm deswegen sein, da du bei der Erzeugung deines Windowsfensters einen White Brush verwendest und somit das Fenster mit weißen Hintergrund gezeichnet wird und da deine Clear Methode des Direct3D Devices niemals aufgerufen werden kann, da dein Direct3D Device ja auch nicht erzeugt wird, wirds nicht schwarz obwohl du da als Löschfarbe schwarz angegeben hast.
Schönen Gruß |
|
Nach oben |
|
|
Robin Junior JLI'ler
Alter: 30 Anmeldedatum: 29.10.2008 Beiträge: 73 Wohnort: Inneringen Medaillen: Keine
|
Verfasst am: 21.12.2009, 21:12 Titel: |
|
|
ich glaub der ChrLE20 is so einer der sich einmal anmeldet und sich dann nie wieder meldet (hat auch nur 1 beitrag)
GRuß Robin |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|