|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Fruchteis Mini JLI'ler
Anmeldedatum: 15.09.2007 Beiträge: 27 Wohnort: Heidelberg Medaillen: Keine
|
Verfasst am: 03.02.2008, 23:39 Titel: Probleme mit StretchRect |
|
|
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 |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 04.02.2008, 01:06 Titel: Re: Probleme mit StretchRect |
|
|
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 |
|
|
Fruchteis Mini JLI'ler
Anmeldedatum: 15.09.2007 Beiträge: 27 Wohnort: Heidelberg Medaillen: Keine
|
Verfasst am: 04.02.2008, 14:53 Titel: |
|
|
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 |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 04.02.2008, 19:06 Titel: |
|
|
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 |
|
|
Fruchteis Mini JLI'ler
Anmeldedatum: 15.09.2007 Beiträge: 27 Wohnort: Heidelberg Medaillen: Keine
|
Verfasst am: 04.02.2008, 20:06 Titel: |
|
|
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 |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 04.02.2008, 20:41 Titel: |
|
|
Nein, die Option die ich meine gehört klar zu DirectInput, immerhin liegt der Fehler klar bein der Eingabe
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 |
|
|
Fruchteis Mini JLI'ler
Anmeldedatum: 15.09.2007 Beiträge: 27 Wohnort: Heidelberg Medaillen: Keine
|
Verfasst am: 04.02.2008, 21:02 Titel: |
|
|
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 |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 04.02.2008, 21:17 Titel: |
|
|
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 |
|
|
Fruchteis Mini JLI'ler
Anmeldedatum: 15.09.2007 Beiträge: 27 Wohnort: Heidelberg Medaillen: Keine
|
Verfasst am: 04.02.2008, 21:54 Titel: |
|
|
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 |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 04.02.2008, 22:16 Titel: |
|
|
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 |
|
|
Fruchteis Mini JLI'ler
Anmeldedatum: 15.09.2007 Beiträge: 27 Wohnort: Heidelberg Medaillen: Keine
|
Verfasst am: 05.02.2008, 12:23 Titel: |
|
|
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 |
|
|
Fruchteis Mini JLI'ler
Anmeldedatum: 15.09.2007 Beiträge: 27 Wohnort: Heidelberg Medaillen: Keine
|
Verfasst am: 05.02.2008, 21:03 Titel: |
|
|
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 |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 05.02.2008, 21:26 Titel: |
|
|
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 |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 05.02.2008, 21:33 Titel: |
|
|
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 |
|
|
Fruchteis Mini JLI'ler
Anmeldedatum: 15.09.2007 Beiträge: 27 Wohnort: Heidelberg Medaillen: Keine
|
Verfasst am: 05.02.2008, 22:22 Titel: |
|
|
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 |
|
|
|
|
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
|