JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

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

Probleme mit StretchRect
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Fruchteis
Mini JLI'ler



Anmeldedatum: 15.09.2007
Beiträge: 27
Wohnort: Heidelberg
Medaillen: Keine

BeitragVerfasst am: 03.02.2008, 23:39    Titel: Probleme mit StretchRect Antworten mit Zitat

Habe die Klasse "CDirect3D" aus dem Buch um einiges erweitert und "verbessert". Dies bezieht sich auf die Unabhängigkeit der einzelnen Komponenten und deren Funktionalität.
Die Klasse, als auch ihre Methoden, haben auch soweit funktioniert - sie funktioniert ja immernoch -, nur möchte anscheinend die neu implementierte StretchRect-Methode nicht mitmachen. Da ich nun lange genug verzweifelt habe, wende ich mich nun an euch.
Hier der Quelltext:

CPP:
/*Modulname: CDirect3D_Deklaration           */
/*Funktion : Deklariet die Klasse "CDirect3D"*/

#include <d3d9.h>
#include <d3dx9.h>
#include "Constant.hpp"

/*Klassenname: CDirect3D                               */
/*Funktion   : Vereint die Funktionalität von Direct3D9*/
class CDirect3D
{
public:

   /*Konstruktoren*/
   CDirect3D(void);
   /*Destruktoren*/
   virtual ~CDirect3D();

   /*Methoden*/
   BOOL BackBufferColor(D3DCOLOR BackBufferColor)            ;  /*Farbe für den Backbuffer                       */
   BOOL BeginScene(void)                                     ;  /*Der Anfang des Renderings                      */
   BOOL EndScene(void)                                       ;  /*Beendet das Rendern und stellt die Szene dar   */
   BOOL ClearBackBuffer(D3DCOLOR ClearColor)                 ;  /*Löscht den Backbuffer mit der übergebenen Farbe*/
   BOOL CreateFont9(LPCTSTR lpFontName = "Arial")            ;  /*Erstellt ein Direct3DXFont9_Objekt             */
   BOOL CreateOffscreenSurface(DWORD dwWidth, DWORD dwHeight);  /*Erstellt eine Offscreen_Surface                */
   BOOL GetInfoOfSurface(void)                               ;  /*Zum Abfragen der Eigenschaften einer Surface   */
   BOOL GetBackBuffer(void)                                  ;  /*Holt einen Zeiger auf den Backbuffer           */
   BOOL LoadSurfaceFromFile(LPCTSTR SrcFile)                 ;  /*Zum laden einer Grafik in eine Surface         */
   BOOL StretchOffscreenSurface(RECT rs, RECT rb)            ;  /*Zeigt den Inhalt der Offscreen_Surface an      */
   BOOL InitDirect3D9(DWORD dwWIDTH, DWORD dwHEIGHT,            /*Initialisiert Direct3D9                        */
                     HWND hWnd, BOOL bWindowed = FALSE);
   BOOL ColorFillSurface(D3DCOLOR SurfaceColor, RECT r)      ;  /*Farbe für die Offscreen_Surface                */
   BOOL DrawText(LPCTSTR lpText, D3DCOLOR TextColor,            /*Gibt Text anhand der übergebenen Werte aus     */
                RECT r, int nCount = -1)                    ;

protected:

   /*Attribute*/
   LPDIRECT3D9            m_lpD3D9          ; /*Direct3D9_Interfacezeiger         */
   LPDIRECT3DDEVICE9      m_lpD3DDevice9    ; /*Direct3DDevice9_Interfacezeiger   */
   D3DPRESENT_PARAMETERS  m_PParams         ; /*PresentParameter_Struktur         */
   LPD3DXFONT             m_lpD3DXFont9     ; /*Direct3DXFont9_Interfacezeiger    */
   D3DXFONT_DESC          m_FontDesc9       ; /*D3DXFontDesc_Struktur             */
   LPDIRECT3DSURFACE9     m_lpD3DSurface9   ; /*Direct3DSurface9_Interfacezeiger  */
   LPDIRECT3DSURFACE9     m_lpD3DBackBuffer9; /*Direct3DBackBuffer_Interfacezeiger*/
   D3DSURFACE_DESC        m_SurfaceDesc     ; /*Surface_Desc_Struktur             */

   /*Methoden*/
   BOOL CleanUpDirect3D9(void)      ; /*Gibt alle Direct3D9_Objekte frei*/
};


/*Modulname: CDirect3D_Definition                             */
/*Funktion : Implementiert die Methoden der Klasse "CDirect3D"*/

#include "CDirect3D_Deklaration.hpp"
#include <d3d9.h>
#include <d3dx9.h>
#include <cstring>

/*Methodenname: Standard_Konstruktor                            */
/*Funktion    : Initialisiert alle Member mit einem Standardwert*/
CDirect3D::CDirect3D(void): m_lpD3D9(0), m_lpD3DDevice9(0) , m_lpD3DXFont9(0),
                            m_lpD3DSurface9(0), m_lpD3DBackBuffer9(0)
{
   /*PresentParameter_Struktur "m_PParams" mit 0 initialisieren  */
   ZeroMemory(&m_PParams, sizeof(m_PParams));
   /*D3DXFontDesc_Struktur "m_FontDesc9" mit 0 initialisieren    */
   ZeroMemory(&m_FontDesc9, sizeof(m_FontDesc9));
   /*D3DSurfaceDesc_Struktur "m_SurfaceDesc" mit 0 initialisieren*/
   ZeroMemory(&m_SurfaceDesc, sizeof(m_SurfaceDesc));
}/*Standard_Konstruktor*/

/*Methodenname: Destruktor                                    */
/*Funktion    : Gibt mithilfe der Methode "CleanUpDirect3D"   */
/*              alle Direct3D9_Objekte frei                   */
CDirect3D::~CDirect3D()
{
   /*Aufruf der Methode "CleanUpDirect3D" um D3D_Objekte freizugeben*/
   CleanUpDirect3D9();
}/*Destruktor*/

/*Methodenname: InitDirect3D9*/
/*Funktion    : Legt ein Direct3D9_Objekt an und initialisiert dieses*/
BOOL CDirect3D::InitDirect3D9(DWORD dwWIDTH, DWORD dwHEIGHT,
                       HWND hWnd, BOOL bWindowed)
{
   /*Prüfen, ob bereits ein Direct3D9_Objekt existiert, wenn nicht,*/
   /*so wird es angelegt                                           */
   if(m_lpD3D9)
   {
      /*Fehler_Meldung*/
      /*Programm_Beenden*/
      return(FALSE);
   }

   /*Direct3D9_Objekt anlegen*/
   if(!(m_lpD3D9 = Direct3DCreate9(D3D_SDK_VERSION)))
   {
      /*Fehler_Meldung*/
      MessageBox(NULL, "Direct3D9 konnte nicht initialisiert werden",
                "Direct3D9_Initialisierung_Fehler_InitDirect3D9", MB_OK);
      /*Programm_Beenden*/
      return(FALSE);
   }

   /*"m_PParams" initialisieren um die Ausgabe zu ermöglichen*/
   m_PParams.BackBufferFormat = D3DFMT_A8R8G8B8      ;
   m_PParams.BackBufferWidth  = dwWIDTH              ;
   m_PParams.BackBufferHeight = dwHEIGHT             ;
   m_PParams.hDeviceWindow    = hWnd                 ;
   m_PParams.SwapEffect       = D3DSWAPEFFECT_DISCARD;
   m_PParams.Windowed         = bWindowed            ;

   /*Direct3D_Gerät anlegen*/
   if(FAILED(m_lpD3D9->CreateDevice(D3DADAPTER_DEFAULT          ,  /*Primäre_Grafikkarte                        */
                            D3DDEVTYPE_HAL                     ,  /*Hardware_Unterstützung                     */
                       hWnd                               ,  /*Ziel_Fenster                               */
                       D3DCREATE_HARDWARE_VERTEXPROCESSING,  /*Hardwareunterstützung_Geometrieverarbeitung*/
                       &m_PParams                         ,  /*PresentParameter_Struktur_Zeiger           */
                       &m_lpD3DDevice9)))                    /*Direct3DDevice_Interfacezeiger             */
   {
      /*Fehler_Meldung*/
      MessageBox(NULL, "Direct3DDevice9 konnte nicht erstellt werden",
                "Direct3DDevice9_Fehler_InitDirect3D9", MB_OK);
      /*Programm_Beenden*/
      return(FALSE);
   }

   /*Programm_Beenden*/
   return(TRUE);
}/*InitDirect3D9_Methode*/

/*Methodenname: BeginScene*/
/*Funktion    : Leitet das Rendern der Szene ein*/
BOOL CDirect3D::BeginScene(void)
{
   /*Rendern_Einleiten*/
   if(FAILED(m_lpD3DDevice9->BeginScene()))
   {
      /*Fehler_Meldung*/
      /*Programm_Beenden*/
      return(FALSE);
   }
   /*Programm_Beenden*/
   return(TRUE);
}/*BeginScene_Methode*/

/*Methodenname: EndScene*/
/*Funktion    : Beendet das Rendern der Szene und zeigt diese an*/
BOOL CDirect3D::EndScene(void)
{
   /*Rendern_Beenden*/
   if(FAILED(m_lpD3DDevice9->EndScene()))
   {
      /*Fehler_Meldung*/
      /*Programm_Beenden*/
      return(FALSE);
   }

   /*Szene_Anzeigen*/
   if(FAILED(m_lpD3DDevice9->Present(0, 0, 0, 0)))
   {
      /*Fehler_Meldung*/
      /*Programm_Beenden*/
      return(FALSE);
   }
   /*Programm_Beenden*/
   return(TRUE);
}/*EndScene_Methode*/


/*Methodenname: CleanUpDirect3D                                 */
/*Funktion    : Wird im Destruktor aufgerufen und sorgt für die */
/*              korrekte freigabe aller D3D_Objekte             */
BOOL CDirect3D::CleanUpDirect3D9(void)
{
   /*Zuerst prüfen ob die Interface_Zeiger gültig sind, und dann*/
   /*die Objekte freigeben*/
   /*Direct3DBackbuffer_Interfacezeiger*/
   if(!(NULL == m_lpD3DBackBuffer9))
   {
      m_lpD3DBackBuffer9->Release();
      m_lpD3DBackBuffer9 = NULL    ;
   }
   /*Direct3DSurface_Interfacezeiger*/
   if(!(NULL == m_lpD3DSurface9))
   {
      m_lpD3DSurface9->Release();
      m_lpD3DSurface9 = NULL    ;
   }
   /*Direct3DXFont_Interfacezeiger*/
   if(!(NULL == m_lpD3DXFont9))
   {
      m_lpD3DXFont9->Release();
      m_lpD3DXFont9 = NULL;
   }
   /*Direct3DDevice_Interfacezeiger*/
   if(!(NULL == m_lpD3DDevice9))
   {
      m_lpD3DDevice9->Release();
      m_lpD3DDevice9 = NULL    ;
   }
   /*Direct3D_Interfacezeiger*/
    if(!(NULL == m_lpD3D9))
   {
      m_lpD3D9->Release();
      m_lpD3D9 = NULL    ;
   }
   /*Programm_Beenden*/
   return(TRUE);

}/*CleanUpDirect3D_Methode*/

/*Methodenname: ClearBackBuffer*/
/*Funktion    : Löscht den Backbuffer mit der übergebenen Farbe*/
BOOL CDirect3D::ClearBackBuffer(D3DCOLOR ClearColor)
{
   /*Backbuffer_Löschen*/
   if(FAILED(m_lpD3DDevice9->Clear(0              ,
                                  0              ,
                           D3DCLEAR_TARGET,
                           ClearColor     ,
                           0              ,
                           0)))
   {
      /*Fehler_Meldung*/
      /*Programm_Beenden*/
      return(FALSE);
   }
   /*Programm_Beenden*/
   return(TRUE);
}/*ClearBackBuffer_Methode*/

/*Methodenname: CreateFont9                                   */
/*Funktion    : Erstellt und initialisiert ein D3DXFont_Objekt*/
BOOL CDirect3D::CreateFont9(LPCTSTR lpFontName)
{
   /*Prüfen, ob bereits ein D3DXFont_Objekt existiert, wenn nicht*/
   /*so wird eins angelegt                                       */
   if(m_lpD3DXFont9)
   {
      /*Fehler_Meldung*/
      /*Programm_Beenden*/
      return(FALSE);
   }
   /*Schriftart_Festlegen*/
   strcpy(m_FontDesc9.FaceName, lpFontName);
   /*D3DXFont_Objekt anlegen*/
   if(FAILED(D3DXCreateFontIndirect(m_lpD3DDevice9,
                            &m_FontDesc9  ,
                       &m_lpD3DXFont9)))
   {
      /*Fehler_Meldung*/
      /*Programm_Beenden*/
      return(FALSE);
   }
   
   /*Programm_Beenden*/
   return(TRUE);
}/*CreateFont9_Methode*/

/*Methodenname: DrawText                                            */
/*Funktion    : Gibt einen Text mit der gewünschten Formatierung aus*/
BOOL CDirect3D::DrawText(LPCTSTR lpText, D3DCOLOR TextColor,
                   RECT r, int nCount)
{
   /*Ausgaberechteck_Berechnen*/
   if(!(NULL == m_lpD3DXFont9))
   {
      m_lpD3DXFont9->DrawTextA(NULL   ,
                              lpText     ,
                         nCount     ,
                         &r         ,
                         DT_CALCRECT,
                         TextColor) ;
      /*Text_Ausgeben*/
      m_lpD3DXFont9->DrawTextA(NULL     ,
                             lpText    ,
                         nCount    ,
                         &r        ,
                         DT_CENTER ,
                         TextColor);
      /*Programm_Beenden*/
      return(TRUE);
   }
   /*Fehler_Meldung*/
   /*Programm_Beenden*/
   return(FALSE);
}/*DrawText_Methode*/

/*Methodenname: CreateOffscreenSurface         */
/*Funktion    : Erstellt eine Offscreen_Surface*/
BOOL CDirect3D::CreateOffscreenSurface(DWORD dwHeight, DWORD dwWidth)
{
   /*Prüfen, ob bereits ein gültiges D3DDevice_Objekt vorhanden ist*/
   if(m_lpD3DDevice9)
   {
      /*Surface_Erzeugen*/
      if(FAILED(m_lpD3DDevice9->CreateOffscreenPlainSurface(dwWidth         ,
                                                           dwHeight        ,
                                               D3DFMT_A8R8G8B8 ,
                                               D3DPOOL_DEFAULT ,
                                               &m_lpD3DSurface9,
                                               NULL)))
      {
         /*Fehler_Meldung*/
         MessageBox(NULL, "Fehler beim Anlegen einer Offscreen_Surface",
                   "Direct3D9_OffscreenSurface_Initialisierung_Fehler", MB_OK);
         /*Programm_Beenden*/
         return(FALSE);
      }
      /*Programm_Beenden*/
      return(TRUE);
   }
   /*Fehler_Meldung*/
   MessageBox(NULL, "Es existiert noch kein gültiger D3DDevice_Interfacezeiger",
             "Direct3D9_PlainSurface_D3DDevice_Interfacezeiger_Fehler", MB_OK);
   /*Programm_Beenden*/
   return(FALSE);
}/*CreateOffscreenSurface_Methode*/

/*Methodenname: ColorFillSurface                                         */
/*Funktion    : Füllt die Offscreen_Surface mittels der übergebenen Farbe*/
BOOL CDirect3D::ColorFillSurface(D3DCOLOR SurfaceColor, RECT r)
{
   /*Prüfen, ob eine Surface und ein D3DDevice_Interfacezeiger existieren*/
   if(m_lpD3DSurface9 && m_lpD3DDevice9)
   {
      /*Surface_Einfärben*/
      if(FAILED(m_lpD3DDevice9->ColorFill(m_lpD3DSurface9,
                                         NULL           ,
                                    SurfaceColor)))
      {
         /*Fehler_Meldung*/
         MessageBox(NULL, "Fehler beim Färben der Offscreen_Surface",
                   "Direct3D9_OffscreenSurface_ColorFillSurface_Fehler", MB_OK);
         /*Programm_Beenden*/
         return(FALSE);
      }
      /*Programm_Beenden*/
      return(TRUE);
   }
   /*Fehler_Meldung*/
   MessageBox(NULL, "Surface kann nicht gefärbt werden, da Komponenten fehlen",
             "Direct3D9_OffscreenSurface_ColorFillSurface_Fehler", MB_OK);
   /*Programm_Beenden*/
   return(FALSE);
}/*ColorFillSurface_Methode*/

/*Methodenname: GetInfoOfSurface*/
/*Funktion    : Zum Abfragen der Eigenschaften einer Surface*/
BOOL CDirect3D::GetInfoOfSurface(void)
{
   /*Prüfen, ob Surface existiert*/
   if(m_lpD3DSurface9)
   {
      /*Eigenschaften_Abfragen*/
      if(FAILED(m_lpD3DSurface9->GetDesc(&m_SurfaceDesc)))
      {
         /*Fehler_Meldung*/
         /*Programm_Beenden*/
         return(FALSE);
      }
      /*Programm_Beenden*/
      return(TRUE);
   }
   /*Fehler_Meldung*/

   /*Programm_Beenden*/
   return(FALSE);
}/*GetInfoOfSurface_Methode*/

/*Methodenname: GetBackBuffer*/
/*Funktion    : Holt einen Zeiger auf den Backbuffer*/
BOOL CDirect3D::GetBackBuffer(void)
{
   /*Prüfen, ob ein Direct3DDevice_Objekt und ein Zeiger auf den Backbuffer existieren*/
   if(m_lpD3DDevice9 && (!(m_lpD3DBackBuffer9)))
   {
      if(FAILED(m_lpD3DDevice9->GetBackBuffer(0                      ,
                                             0                      ,
                                    D3DBACKBUFFER_TYPE_MONO,
                                    &m_lpD3DBackBuffer9)))
      {
         /*Fehler_Meldung*/
         MessageBox(NULL, "Fehler beim Erhalt des Backbuffer_Zeigers",
                   "Direct3D9_Backbufferzeiger_GetBackBuffer_Fehler", MB_OK);
         /*Programm_Beenden*/
         return(FALSE);
      }
   }
   /*Programm_Beenden*/
   return(TRUE);
}/*GetBackBuffer_Methode*/

/*Methodenname: StretchOffscreenSurface       */
/*Funktion    : Zeigt die Offscreen_Surface an*/
BOOL CDirect3D::StretchOffscreenSurface(RECT rs, RECT rb)
{
   /*Prüfen, ob die Surface und ob ein D3DDevice_Objekt exisiteren*/
   if(m_lpD3DSurface9 && m_lpD3DDevice9)
   {
      /*Prüfen, ob ein Zeiger auf den Backbuffer vorhanden ist*/
      if(NULL == m_lpD3DBackBuffer9)
      {
         /*Backbufferzeiger_Holen*/
         if(!(GetBackBuffer()))
         {
            /*Fehler_Meldung*/
            MessageBox(NULL, "Fehler beim Zuweisen des Backbuffer_Zeigers",
                      "Direct3D9_Backbufferzeiger_StretchOffscreenSurface_Fehler", MB_OK);
            /*Programm_Beenden*/
            return(FALSE);
         }
      }
      /*Backbufferzeiger_Existiert*/
      if(m_lpD3DBackBuffer9)
      {
         /*Surface_Anzeigen*/
         if(FAILED(m_lpD3DDevice9->StretchRect(m_lpD3DSurface9   ,
                                              NULL              ,
                                      m_lpD3DBackBuffer9,
                                      &rb               ,
                                      D3DTEXF_NONE)))
         {
            /*Fehler_Meldung*/
            MessageBox(NULL, "Fehler beim Anzeigen der Offscreen_Surface",
                      "Direct3D9_OffscreenSurface_StretchOffscreenSurface_Fehler", MB_OK);
            /*Programm_Beenden*/
            return(FALSE);
         }
      }
      /*Programm_Beenden*/
      return(TRUE);
   }
   /*Fehler_Meldung*/
   MessageBox(NULL, "Fehlende Komponenten beim Anzeiger der Offscreen_Surface",
            "Direct3D9_OffscreenSurface_StretchOffscreenSurface_Fehler", MB_OK);
   /*Programm_Beenden*/
   return(FALSE);
}/*StretchOffscreenSurface_Methode*/

/*Methodenname: LoadSurfaceFromFile              */
/*Funktion    : Ladet eine Grafik in eine Surface*/
BOOL CDirect3D::LoadSurfaceFromFile(LPCTSTR SrcFile)
{
   /*Prüfen, ob Surface bereits exisitert*/
   if(m_lpD3DSurface9)
   {
      /*Grafik_Laden*/
      D3DXLoadSurfaceFromFile(m_lpD3DSurface9,
                             NULL           ,
                        NULL           ,
                        SrcFile        ,
                        NULL           ,
                        D3DX_DEFAULT   ,
                        NULL           ,
                        NULL          );

      /*Programm_Beenden*/
      return(TRUE);
   }
   /*Fehler_Meldung*/
   /*Programm_Beenden*/
   return(FALSE);
}/*LoadSurfaceFromFile_Methode*/

/*Programmname: CDirect3D_Ex                                                         */
/*Funktion    : Eine umfangreiche Klasse, die die Funktionalität von Direct3D kapselt*/

#include <d3d9.h>
#include <d3dx9.h>
#include "CDirect3D_Deklaration.hpp"

/*Funktions_Prototypen*/
/*Funktionsname: Callback_Funktion                             */
/*Funktion     : Kümmert sich um die Behandlung der Nachrichten*/
LRESULT CALLBACK MessageHandler(HWND hWnd, UINT msg,
                        WPARAM wParam, LPARAM lParam);

/*Funktionsname: CreateMainWindow                                       */
/*Funktion     : Erzeugt das Hauptfenster, und liefert das Handle zurück*/
HWND CreateMainWindow(HINSTANCE hInstance);

/*Globale_Variablen*/
static HWND hWnd;
CDirect3D Direct3D;


/*WinMain*/
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
               LPSTR lpCmdLine, int nShowCmd)
{
   /*Lokale_Variablen*/
   auto MSG msg;      /*Nachrichten_Struktur*/

   /*Das Hauptfenster erzeugen und das Handle speichern*/
   if(!(hWnd = CreateMainWindow(hInstance)))
   {
      /*Fehler_Meldung*/
      MessageBox(NULL, "Das Fenster konnte nicht erstellt werden",
                "Win_Hauptfenster_Fehler_WinMain", MB_OK);
      /*Programm_Beenden*/
      return(-1);
   }

   Direct3D.InitDirect3D9(dwWIDTH, dwHEIGHT, hWnd);
   Direct3D.CreateFont9();
   Direct3D.GetBackBuffer();
   Direct3D.CreateOffscreenSurface(320, 200);

   /*Message_Pump*/
   while(GetMessage(&msg, NULL, 0, 0))
   {
      DispatchMessage(&msg);
      TranslateMessage(&msg);
   }

   /*Programm_Beenden*/
   return(0);
}/*WinMain_Funktion*/

/*Funktions_Definition*/
/*Funktionsname: Callback                                      */
/*Funktion     : Kümmert sich um die Behandlung der Nachrichten*/
LRESULT CALLBACK MessageHandler(HWND hWnd, UINT msg,
                        WPARAM wParam, LPARAM lParam)
{
   /*Nachrichten_Bearbeiten*/
   switch(msg)
   {
      /*WM_DESTROY*/
   case(WM_DESTROY):
      {
         PostQuitMessage(WM_QUIT);
         return(0);
      }break;
      /*WM_KEYDOWN*/
   case(WM_KEYDOWN):
      {
         /*Tasten_Bearbeiten*/
         switch(wParam)
         {
            /*VK_ESCAPE*/
         case(VK_ESCAPE):
            {
               DestroyWindow(hWnd);
               return(0);
            }break;
         }
      }break;
      /*WM_PAINT*/
   case(WM_PAINT):
      {
         RECT r = {100, 100, 0, 0};
         RECT rs = {100, 100, 100, 100};
         RECT rb = {200, 300, 100, 100};

            Direct3D.ColorFillSurface(D3DCOLOR_XRGB(256, 0, 0), r);
         Direct3D.ClearBackBuffer(D3DCOLOR_XRGB(44, 90, 100));
         Direct3D.BeginScene();   
         Direct3D.DrawText("Hallo Christian", D3DCOLOR_ARGB(100, 255, 0, 0), r);
         Direct3D.LoadSurfaceFromFile("../bt.jpg");
         Direct3D.StretchOffscreenSurface(rs, rb);
         Direct3D.EndScene();
      }break;
   }
   
   /*Nachrichten, die nicht behandelt wurden zur Standardnachrichtenverarbeitung*/
   /*von Windows schicken                                                       */
   return(DefWindowProc(hWnd, msg, wParam, lParam));
}/*Callback_Funktion*/

/*Funktionsname: CreateMainWindow                                       */
/*Funktion     : Erstellt das Hauptfenster und liefert das Handle zurück*/
HWND CreateMainWindow(HINSTANCE hInstance)
{
   /*Lokale_Variablen*/
   register  LPCTSTR CLASS_NAME = "Class_Name"        ;
   register  LPCTSTR WIN_NAME   = "Direct3D_Anwendung";

   /*Fensterklasse_Festlegen*/
   WNDCLASSEX wndclass = {
             sizeof(wndclass)                            , /*Klassen_Größe        */
            CS_DBLCLKS | CS_OWNDC |
            CS_HREDRAW | CS_VREDRAW                     , /*Fenster_Eigenschaften*/
            MessageHandler                              , /*Callback_Funktion    */
            0                                           , /*Klassen_Speicher     */
            0                                           , /*Fenster_Speicher     */
            hInstance                                   , /*Anwendungs_Instanz   */
            LoadIcon(NULL, IDI_WINLOGO)                 , /*Icon_Art             */
            LoadCursor(NULL, IDC_HAND)                  , /*Cursor_Art           */
            (HBRUSH)GetStockObject(WHITE_BRUSH)         , /*Hintergrund_Farbe    */
            NULL                                        , /*Menü_Name            */
            CLASS_NAME                                  , /*Klassen_Name         */
            LoadIcon(NULL, IDI_WINLOGO)};                 /*Icon_Art             */

   /*Fensterklasse_Registrieren*/
   RegisterClassEx(&wndclass);

   /*Fensterklasse_Erzeugen*/
   return(CreateWindowEx(NULL                              , /*Zusätzliche_Eigenschaften*/
                        CLASS_NAME                        , /*Klassen_Name             */
                   WIN_NAME                          , /*Fenster_Name             */
                   WS_OVERLAPPEDWINDOW | WS_VISIBLE  , /*Fenster_Art              */
                   0, 0                              , /*Fenster_Koordinaten      */
                   dwWIDTH, dwHEIGHT                 , /*Fenster_Größe            */
                   NULL                              , /*Parent_Handle            */
                   NULL                              , /*Menü_Handle              */
                   hInstance                         , /*Anwendungs_Instanz       */
                   NULL));                             /*MDI_Anwendung            */
}/*CreateMainWindow_Funktion*/


/*Modulname: Konstanten                    */
/*Funktion : Definiert benötigte Konstanten*/

#include <windows.h>

const DWORD dwWIDTH  = 800;
const DWORD dwHEIGHT = 600;


CPP-Tags by AFE-GmdG
_________________
Ein Beweis für Programmierer:
Jedes Programm läßt sich um mindestens eine Anweisung kürzen.
Jedes Programm hat mindestens einen Fehler.
Durch Induktion können wir schließen:
Jedes Programm ist reduzierbar auf eine Anweisung, die nicht funktioniert...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 04.02.2008, 01:06    Titel: Re: Probleme mit StretchRect Antworten mit Zitat

Zuerst mal: benutze bitte c++-Tags, Code-Tags kann man bei sowas nicht mehr lesen
Code:
[cpp]c++-code...[/cpp]


Ok, du nimmst in deiner Methode ein RECT rs und ein RECT rb an, aber rs nutzt du gar nicht, ist das gewollt?
Nagut sonst klär erstmal folgende Grundfragen:

Wird dir irgendein Fehler gezeigt?
Hast du das mal debuggt?
Woran siehst du dass es nicht funktioniert?
Was gibt dir die D3D-Debug Ausgabe aus?

Gruß DXer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Fruchteis
Mini JLI'ler



Anmeldedatum: 15.09.2007
Beiträge: 27
Wohnort: Heidelberg
Medaillen: Keine

BeitragVerfasst am: 04.02.2008, 14:53    Titel: Antworten mit Zitat

Wegen der RECT_Struktur "rs", das ist vorerst gewollt.
Das Programm lässt sich kompilieren und auch problemlos ausführen. Nur die Offscreen_Surface wird nicht angezeigt.
Der Fehler, soweit ich das beurteilen kann, muss in der Methode "StretchOffscreenSurface" liegen, da ich beim Ausführen meines Programms, die MessageBox der Methode StretchOffScreenSurface erhalte und zwar diese, die angezeigt wird, wenn m_lpD3DDevice9-StretchRect fehlschlägt.

Und sorry, das ich das falsche Tag benutzt habe. Wie du sicherlich der Zeitangabe entnehmen kannst, war es nicht mehr die früheste Stunde.
_________________
Ein Beweis für Programmierer:
Jedes Programm läßt sich um mindestens eine Anweisung kürzen.
Jedes Programm hat mindestens einen Fehler.
Durch Induktion können wir schließen:
Jedes Programm ist reduzierbar auf eine Anweisung, die nicht funktioniert...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 04.02.2008, 19:06    Titel: Antworten mit Zitat

Schonmal versucht die Direct3D Debug Dlls zu verwenden, die sollten dir eigentlich sagen was schief läuft (im Ausgabe/Output Fenster).

Um die zu aktivieren gehe ins DXSDK Verzeichniss, dann Utilities und starte das DX steuerungsprogramm (dürfte dxcpl.exe oder so heissen).

Sollte das Programm nicht da sein dann gehe in Start->Systemsteuerung->Direx´ctX rein, dies ist das selbe. Dort aktivierst du dann die Debug Dlls.
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Fruchteis
Mini JLI'ler



Anmeldedatum: 15.09.2007
Beiträge: 27
Wohnort: Heidelberg
Medaillen: Keine

BeitragVerfasst am: 04.02.2008, 20:06    Titel: Antworten mit Zitat

Welche Option muss ich bestätigen? Use Debug Version of Direct3D9?!
_________________
Ein Beweis für Programmierer:
Jedes Programm läßt sich um mindestens eine Anweisung kürzen.
Jedes Programm hat mindestens einen Fehler.
Durch Induktion können wir schließen:
Jedes Programm ist reduzierbar auf eine Anweisung, die nicht funktioniert...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 04.02.2008, 20:41    Titel: Antworten mit Zitat

Nein, die Option die ich meine gehört klar zu DirectInput, immerhin liegt der Fehler klar bein der Eingabe Smile


Klar meine ich das.
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Fruchteis
Mini JLI'ler



Anmeldedatum: 15.09.2007
Beiträge: 27
Wohnort: Heidelberg
Medaillen: Keine

BeitragVerfasst am: 04.02.2008, 21:02    Titel: Antworten mit Zitat

Ich bin nun etwas verwirrt!
Aber was mich jetzt freut ist.........es funktioniert, aber..............unter einer Bedingung und zwar: Ich muss sowohl meiner Methode "ColorFillSurface" als auch "StretchOffscreenSurface" einen Zeiger auf eine RECT_Struktur übergeben - was ich zwar zuvor gemacht habe, nur eben habe ich die Rect_Struktur, die ich der Methode als Argument übergeben habe verwendet - die Lokal in der Methode deklariert wurde.
Berechtigt frage ich nun, weshalb? Warum ist es nicht zulässig die Rect_Struktur der Funktion StretchRect zu übergeben, die ich der Methode als Parameter übergeben habe, weshalb ist es lediglich zulässig eine lokal deklarierte RECT_Struktur zu übergeben?
_________________
Ein Beweis für Programmierer:
Jedes Programm läßt sich um mindestens eine Anweisung kürzen.
Jedes Programm hat mindestens einen Fehler.
Durch Induktion können wir schließen:
Jedes Programm ist reduzierbar auf eine Anweisung, die nicht funktioniert...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 04.02.2008, 21:17    Titel: Antworten mit Zitat

dazugegebener Senf hat Folgendes geschrieben:

Bitte vermeide /* */ Kommentare die nur über eine Zeile gehen. Wenn du irgendwann mal einen Codeblock auskommentieren willst, kriegst du dann nämlich richtig viel Spaß.
Für den Anfang ist es ja ok, bei fast jeder Zeile zu schreiben was sie macht, aber bitte immer nur mit //. Das geht schneller und sicherer (ok, heutzutage Zeigen IDE's ja Kommentare farbig an, aber schalte das mal aus, dann kriegst du mit deinen ganzen /**/ Kommentaren richtig Spaß!

_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Fruchteis
Mini JLI'ler



Anmeldedatum: 15.09.2007
Beiträge: 27
Wohnort: Heidelberg
Medaillen: Keine

BeitragVerfasst am: 04.02.2008, 21:54    Titel: Antworten mit Zitat

Ich weiß.
Der Grund aber ist, weshalb ich Kommentare mit /* einleite und auch, wenn sie nur eine Zeile einnehmen, wieder mit */ beende, das ich diese Art "schöner" finde.
_________________
Ein Beweis für Programmierer:
Jedes Programm läßt sich um mindestens eine Anweisung kürzen.
Jedes Programm hat mindestens einen Fehler.
Durch Induktion können wir schließen:
Jedes Programm ist reduzierbar auf eine Anweisung, die nicht funktioniert...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 04.02.2008, 22:16    Titel: Antworten mit Zitat

Fruchteis hat Folgendes geschrieben:
Berechtigt frage ich nun, weshalb? Warum ist es nicht zulässig die Rect_Struktur der Funktion StretchRect zu übergeben, die ich der Methode als Parameter übergeben habe, weshalb ist es lediglich zulässig eine lokal deklarierte RECT_Struktur zu übergeben?

Das ist möglich und sollte genauso gut gehen. Schau nochmal genau nach ob du nicht was übersehen hast.

btw: Wieso includierst du windows.h am Ende der Datei? Da könntest du es auch genauso gut weglassen. Und die /**/ Kommentare kannst du ruhig beibehalten, aber ich denke dass du früher oder später die Konsequenzen siehst und dich an ihnen aufhältst, deswegen wäre es besser in manchen Teilen direkt // zu benutzen.

Gruß DXer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Fruchteis
Mini JLI'ler



Anmeldedatum: 15.09.2007
Beiträge: 27
Wohnort: Heidelberg
Medaillen: Keine

BeitragVerfasst am: 05.02.2008, 12:23    Titel: Antworten mit Zitat

Das ist eine separate Header_Datei, die Datentypen - DWORD- aus dem Windows_SDK benutzt.
_________________
Ein Beweis für Programmierer:
Jedes Programm läßt sich um mindestens eine Anweisung kürzen.
Jedes Programm hat mindestens einen Fehler.
Durch Induktion können wir schließen:
Jedes Programm ist reduzierbar auf eine Anweisung, die nicht funktioniert...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Fruchteis
Mini JLI'ler



Anmeldedatum: 15.09.2007
Beiträge: 27
Wohnort: Heidelberg
Medaillen: Keine

BeitragVerfasst am: 05.02.2008, 21:03    Titel: Antworten mit Zitat

Auch wenn es nicht wirklich etwas mit dem Thema zu tun hat - ausser das es wieder mich betrifft -, schiebe ich eine weitere Frage ein:
Weshalb liefert mir die Funktion rand() Werte zurück, die sich im Bereich des nachfolgenden mit Modulo verknüpften Wertes befinden?

Beispiel:
CPP:
// Ich initialisiere den Zufallsgenerator
srand(timeGetTime());

//rand() soll Werte im Bereich 0-50 zurückliefern
rand()%50;

_________________
Ein Beweis für Programmierer:
Jedes Programm läßt sich um mindestens eine Anweisung kürzen.
Jedes Programm hat mindestens einen Fehler.
Durch Induktion können wir schließen:
Jedes Programm ist reduzierbar auf eine Anweisung, die nicht funktioniert...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 05.02.2008, 21:26    Titel: Antworten mit Zitat

Die modulo /%) Operation gibt dir den Rest einer Division zurück, da dies bei dir nie mehr als 50 sein kann reicht das ganze also von 0 bis 49.
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 05.02.2008, 21:33    Titel: Antworten mit Zitat

Weil du diese Zeile nicht wirklich verstehst. Du weißt nur das jeder Mensch rand() immer so benutzt, also akzeptierst du das. Du hast auch als C++ Anfänger nicht geahnt, das cout ein Objekt und << ein Überladener Operator ist.

rand tut nichts anders als einen Wert zwischen 0 und RND_MAX zurück zugeben. (ich glaube das liegt so mindestens bei 32.000 aber hab ich vergessen^^).
Nur durch die Modulo Operation kürzt du diese eignetlich sehr große Zahl auf deinen Wertebereich zurück.
Probier es einfach mal aus und lass dir die Ausgabe von rand mal direkt anzeigen. Die speicherst du dir in ne Variable und wendest darauf mal die Modulo Operation an. Dann wirst du schnell verstehen, wie das funktioniert.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Fruchteis
Mini JLI'ler



Anmeldedatum: 15.09.2007
Beiträge: 27
Wohnort: Heidelberg
Medaillen: Keine

BeitragVerfasst am: 05.02.2008, 22:22    Titel: Antworten mit Zitat

Zitat:
Weil du diese Zeile nicht wirklich verstehst. Du weißt nur das jeder Mensch rand() immer so benutzt, also akzeptierst du das. Du hast auch als C++ Anfänger nicht geahnt, das cout ein Objekt und << ein Überladener Operator ist.
Galt das mir? Wenn ich über den Sachverhalt bescheid gewusst hätte, so hätte ich ja nicht danach gefragt.

Zitat:

rand tut nichts anders als einen Wert zwischen 0 und RND_MAX zurück zugeben. (ich glaube das liegt so mindestens bei 32.000 aber hab ich vergessen^^).
Nur durch die Modulo Operation kürzt du diese eignetlich sehr große Zahl auf deinen Wertebereich zurück.
Probier es einfach mal aus und lass dir die Ausgabe von rand mal direkt anzeigen. Die speicherst du dir in ne Variable und wendest darauf mal die Modulo Operation an. Dann wirst du schnell verstehen, wie das funktioniert.

So etwas Ähnliches dachte ich mir schon. Herzlichen Dank.
_________________
Ein Beweis für Programmierer:
Jedes Programm läßt sich um mindestens eine Anweisung kürzen.
Jedes Programm hat mindestens einen Fehler.
Durch Induktion können wir schließen:
Jedes Programm ist reduzierbar auf eine Anweisung, die nicht funktioniert...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL Alle Zeiten sind GMT
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
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