PresentParameter.BackBufferWidth Zuweisung funkioniert nicht.



  • Hallo,
    Ich habe mir grade ein Tutorial zur DirectX-Programmierung angeschaut und dort kommt folgender code vor:

    #define SCREEN_WIDTH  = 800
    #define SCREEN_HEIGHT = 600
    D3D_PresParam.BackBufferWidth = SCREEN_WIDTH;
    D3D_PresParam.BackBufferHeight = SCREEN_HEIGHT;
    

    Wenn ich diesen jedoch compilen wll kommt ein Error:

    error C2059: Syntaxfehler: '='
    

    Außerdem kommt der Fehler nocheinmal bei

    D3DXMatrixPerspectiveFovLH(&matProjection, D3DXToRadian(45), (FLOAT)SCREEN_WIDTH / (FLOAT)SCREEN_HEIGHT, 1.0f, 100.0f);
    

    obwohl ich gar kein = verwende.
    Wiso kann ich der Backbufferhöhe/breite nichts zuweisen?
    Und warum kommt der Fehler in einer Zeile wo ich kein = verwende?

    MFG
    Neokil



  • Ein define definiert irgendetwas. Da gibst keine Zuweisung. Lass das = einfach weg.

    Aber ich würde so oder so eher zu Variablen raten! Kann ja durchaus sein, dass die Grösse erst zur Laufzeit angegeben werden kann.



  • also danke, jetzt funktioniert das.
    Jetzt habe ich noch einen Fehler:

    LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
    WNDCLASSEX wc;
    wc.lpfnWndProc = WindowProc; //FEHLER!!!
    

    Und der Fehler ist

    error C3867: "Game1::Window::WindowProc": Dem Funktionsaufruf fehlt die Argumentliste. Verwenden Sie "&Game1::Window::WindowProc", um einen Zeiger auf den Member zu erstellen.
    

    Warum funktioniert das nicht? In dem Tutorial stand das genau so da (hab es kopiert damit ich einen Tippfehler ausschließen kann). Was ist da los?

    MFG
    Neokil



  • Das liegt daran, dass deine WindowProc eine Memberfunktion der Klasse Game::Window ist.

    Du hast 2 Möglichkeiten, wie du das Problem löst:
    1. Die Einfachere: Mach deine WindowProc einfach zur globalen Funktion. Also raus damit aus deiner Klasse.

    2. Mittels einer Proxy-Funktion. Da übergibtst du anstatt der WindowProc eine Funktion wie WindowProcProxy. Beide sind Memberfunktionen, wobei die Proxy static deklariert wird. Die Proxy-Funktion ruft dann die richtige WindoeProc auf.

    Wenn Interesse besteht, hier sind ein paar Snippets:
    Deklaration im Header

    class GT_API VideoDevice
    {
    	//...
    
    	//WindowProc für das Fenster und passende Proxy
    	LPARAM WindowProc(HWND hWindow, UINT uMsg, WPARAM wParam, LPARAM lParam);
    	static LPARAM WINAPI WindowProcProxy(HWND hWindow, UINT uMsg, WPARAM wParam, LPARAM lParam);
    
        //...
    };
    

    Definition in Source

    //WindowProc für das Fenster und passende Proxy
    LPARAM VideoDevice::WindowProc(HWND hWindow, UINT uMessage, WPARAM wParam, LPARAM lParam)
    {
    	PAINTSTRUCT Paint;
    
    	switch(uMessage)
    	{
    	case WM_CREATE:
    		return(0);
    
    	case WM_PAINT:
    		//komplett schwarz füllen
    		BeginPaint(hWindow,&Paint);		
    		FillRect(Paint.hdc, &Paint.rcPaint, static_cast<HBRUSH>(GetStockObject(BLACK_BRUSH)) );
            EndPaint(hWindow,&Paint);
    		return(0);
    
    	case WM_DESTROY:
    		PostQuitMessage(0);
    		return(0);
    
    	default:
    		return( DefWindowProc(hWindow, uMessage, wParam, lParam) );
    	}
    
    	return(0);
    }
    LPARAM WINAPI VideoDevice::WindowProcProxy(HWND hWindow, UINT uMessage, WPARAM wParam, LPARAM lParam)
    {
    	static VideoDevice* pInstance= NULL; //Istanz des Fenstererstellers
    	//Wenn das Fenster erstellt wird, ist eine Instanz übergeben worden
    
    	if(uMessage == WM_CREATE)
    	{
    		LPCREATESTRUCT pCreateStruct( reinterpret_cast<LPCREATESTRUCT>(lParam) );
    		pInstance= reinterpret_cast<VideoDevice*>( pCreateStruct->lpCreateParams );
    	}
    
    	if(!pInstance) //Wenn pInstance noch nicht initialisiert wurde
    		return( DefWindowProc(hWindow, uMessage, wParam, lParam) );
    	else
    		return( pInstance->WindowProc(hWindow, uMessage, wParam, lParam) );
    }
    

    Und die Erstellung des Fensters:

    //Festerklasse erstellen und registrieren
    		WindowClass.style			= CS_HREDRAW|CS_VREDRAW;   
    		WindowClass.lpfnWndProc		= WindowProcProxy;
    		WindowClass.cbClsExtra		= 0;
    		WindowClass.cbWndExtra		= 0;
    		WindowClass.hInstance		= hInstance;
    		WindowClass.hIcon			= hIcon;
    		WindowClass.hCursor			= LoadCursor(NULL, IDC_ARROW); 
    		WindowClass.hbrBackground	= static_cast<HBRUSH>(GetStockObject(BLACK_BRUSH));
    		WindowClass.lpszMenuName	= NULL;
    		WindowClass.lpszClassName	= "GlowingThunder-Engine Window Class";
    
    		if( !RegisterClass(&WindowClass) )
    		{
    			//Fehler (sehr unwahrscheinlich!)
    			ExitWindow();
    			LOG_ERROR_AND_THROW("Register Window Class failed.");
    		}
    
    		//Fenster erzeugen
    		//erst später Größe anpassen und genau in die Mitte des Desktops setzen
    		//Instanz dieser Klasse mitgeben, um später über die Proxy die richtige WindowProc aufrufen zu können
    		hWindow= CreateWindow("GlowingThunder-Engine Window Class", StrWindowCaption.c_str(),
    							  WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX,
    							  0, 0, Settings.dwBBSizeX, Settings.dwBBSizeY,
    							  NULL, NULL, hInstance, this);
    		if(!hWindow)
    		{
    			//Fehler beim Erstellen!
    			ExitWindow();
    			LOG_ERROR_AND_THROW("Create Window failed.");
    		}
    

    An deiner Stelle würde ich 1) nehmen.



  • danke!!! (hab version 1 genommen :D)


Anmelden zum Antworten