JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=be0ef2ad297d830305c66af9ba8a6d82Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Ein *.bmp Bild Fullscreen anzeigen!Bildschirm bleibt schwarz

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
ChrLE20
Mini JLI'ler



Anmeldedatum: 03.11.2009
Beiträge: 1

Medaillen: Keine

BeitragVerfasst am: 03.11.2009, 19:10    Titel: Ein *.bmp Bild Fullscreen anzeigen!Bildschirm bleibt schwarz Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
User_User
JLI'ler



Anmeldedatum: 05.08.2004
Beiträge: 137

Medaillen: Keine

BeitragVerfasst am: 07.11.2009, 16:03    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Robin
Junior JLI'ler


Alter: 30
Anmeldedatum: 29.10.2008
Beiträge: 73
Wohnort: Inneringen
Medaillen: Keine

BeitragVerfasst am: 07.11.2009, 22:48    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Cyianor
Super JLI'ler



Anmeldedatum: 23.12.2002
Beiträge: 452

Medaillen: Keine

BeitragVerfasst am: 14.12.2009, 13:15    Titel: Re: Ein *.bmp Bild Fullscreen anzeigen!Bildschirm bleibt sch Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Robin
Junior JLI'ler


Alter: 30
Anmeldedatum: 29.10.2008
Beiträge: 73
Wohnort: Inneringen
Medaillen: Keine

BeitragVerfasst am: 21.12.2009, 21:12    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
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

Impressum