JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

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

2 Probleme

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Marius
Mini JLI'ler



Anmeldedatum: 15.04.2003
Beiträge: 19
Wohnort: Küssaberg-Rheinheim
Medaillen: Keine

BeitragVerfasst am: 15.04.2003, 12:47    Titel: 2 Probleme Antworten mit Zitat

Hi!

Ich hab 2 Probleme:
1. Ich hab das DDFenster aus Kapitel 17 ausprobiert. Das kompilieren funktioniert einwandfrei, doch das Fenster kann nicht erzeugt werden.

2. Wenn ich Code eingebe listet C++ die Elemente von DDObjekten nicht auf.

Danke im Vorraus
Marius
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Hasenfuß
Senior JLI'ler


Alter: 37
Anmeldedatum: 20.08.2002
Beiträge: 291

Medaillen: Keine

BeitragVerfasst am: 15.04.2003, 12:58    Titel: Antworten mit Zitat

Hi!

1.: Ohne Code wird man dir da schwer helfen können.

2.: Ich nehme an du meinst, dass beim angeben von zB. lpDDPrimary->... nicht die funktionen aufgelistet werden. Das ist aber normal bei DirectX Objekten (jedenfalls isses bei mir auch so Wink )
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Kampfhund
Super JLI'ler


Alter: 42
Anmeldedatum: 20.07.2002
Beiträge: 408

Medaillen: Keine

BeitragVerfasst am: 15.04.2003, 13:07    Titel: Antworten mit Zitat

zu 2.:

du kannst dem projekt die dx header hinzufügen (projekt->dem projekt hinzufügen), dann müsste diese auswahlliste kommen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Marius
Mini JLI'ler



Anmeldedatum: 15.04.2003
Beiträge: 19
Wohnort: Küssaberg-Rheinheim
Medaillen: Keine

BeitragVerfasst am: 15.04.2003, 13:08    Titel: Antworten mit Zitat

Hier ist der Code:
Code:

#include <ddraw.h>
#include <windows.h>

HWND CreateMainWindow(HINSTANCE hInstance);

LRESULT CALLBACK WindowFunc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);

BOOL InitDirectDraw(HWND hWnd);

void CleanUpDirectDraw(void);

void Render(void);

BOOL Error (char* msg);

HWND hWnd;

LPDIRECTDRAW7         lpDD7 = NULL;
LPDIRECTDRAWCLIPPER   lpDDClipper = NULL;
LPDIRECTDRAWSURFACE7   lpDDSPrimary = NULL;
BOOL initDDSuccess = FALSE;


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpComdLine,
                   int nShowCmd)
{
   hWnd = CreateMainWindow(hInstance);

   if (hWnd == 0)
   {
 //Hier passiert bei mir ein Fehler:
      Error("Fehler beim Erzeugen des Fensters");
   }

   if (!InitDirectDraw(hWnd))
   {
      return FALSE;
   }

   MSG msg;

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

   return 0;
}



HWND CreateMainWindow(HINSTANCE hInstance)
{
   WNDCLASSEX wndClass;

   wndClass.cbSize         = sizeof(WNDCLASSEX);
   wndClass.style            = CS_DBLCLKS | CS_OWNDC |
                             CS_HREDRAW | CS_VREDRAW;
   wndClass.lpfnWndProc      = WindowFunc;

   wndClass.cbClsExtra      = 0;
   wndClass.cbWndExtra      = 0;
   wndClass.hInstance      = hInstance;
   
   wndClass.hbrBackground   = (HBRUSH)GetStockObject(BLACK_BRUSH);
   wndClass.hCursor         = LoadCursor(NULL, IDC_ARROW);
   wndClass.lpszMenuName   = NULL;
   wndClass.lpszClassName   = "windowClass";
   wndClass.hIcon            = LoadIcon(NULL, IDI_WINLOGO);
   wndClass.hIconSm         = LoadIcon(NULL, IDI_WINLOGO);
   
   RegisterClassEx(&wndClass);

   return CreateWindowEx(NULL,
                        "WindowClass",
                        "DDFenster",   
                        WS_OVERLAPPEDWINDOW | WS_VISIBLE,
                        0, 0, 400, 300,
                        NULL,
                        NULL,
                        hInstance,
                        NULL);

}


LRESULT CALLBACK WindowFunc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
        case WM_KEYDOWN:
         switch(wParam)
         {
         case VK_ESCAPE:                     
            DestroyWindow(hWnd);
         break;
         }
        break;

        case WM_PAINT:
            PAINTSTRUCT ps;
            BeginPaint(hWnd,&ps);
           
            Render();

            EndPaint(hWnd,&ps);
        break;

        case WM_DESTROY:
            CleanUpDirectDraw();
         PostQuitMessage(0);
      break;
    }

    return (DefWindowProc(hWnd, msg, wParam, lParam));

}


BOOL InitDirectDraw(HWND hwnd)
{
   if(FAILED(DirectDrawCreateEx(NULL,(LPVOID*)&lpDD7, IID_IDirectDraw7, NULL)))
   {
      return (Error("Fehler beim Anlegen des DD-Objekts!"));
   }

   DDSURFACEDESC2 ddsd;

   ZeroMemory(&ddsd, sizeof(ddsd));
   ddsd.dwSize = sizeof(ddsd);

   ddsd.dwFlags = DDSD_CAPS;

   ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_VIDEOMEMORY;

    if(FAILED(lpDD7->CreateSurface(&ddsd,&lpDDSPrimary,NULL)))
    {
// Und hier passiert bei mir ein Fehler
        return Error("Fehler beim Anlegen der primären Oberfläche");
    }

    if(FAILED(lpDD7->CreateClipper(NULL,&lpDDClipper,NULL)))
    {
        return Error("Fehler beim anlegen des Clipper");
    }

    if(FAILED(lpDDClipper->SetHWnd(0,hWnd)))
    {
        return Error("Fehler bei SetHWnd");   
    }

    if(FAILED(lpDDSPrimary->SetClipper(lpDDClipper)))
    {
        return Error("Fehler beim Verbinden des Clippers");   
    }
 
    return TRUE;
}
void Render(void)
{

    DDBLTFX DDBltFX;

    ZeroMemory(&DDBltFX,sizeof(DDBltFX));
    DDBltFX.dwSize = sizeof(DDBltFX);
   
    RECT r;
    POINT p1, p2;

    p1.x =  50; p1.y =  50;
    p2.x = 100; p2.y = 100;

    ClientToScreen(hWnd,&p1);
    ClientToScreen(hWnd,&p2);

    r.left   = p1.x;
    r.top    = p1.y; 
    r.right  = p2.x;
    r.bottom = p2.y;

    for(int i=0;i<256;i++)
    {

        DDBltFX.dwFillColor = i*i*i;

        r.left++;  r.top++;
        r.right++; r.bottom++;

        if(FAILED(lpDDSPrimary->Blt(&r,NULL,NULL,DDBLT_COLORFILL | DDBLT_WAIT,&DDBltFX)))
        {
            Error("Blt ist fehlgeschlagen");
            return;
        }
    }
}



void CleanUpDirectDraw(void)
{

    if(NULL != lpDDSPrimary)
    {
        lpDDSPrimary->Release();
        lpDDSPrimary = NULL;
    }
    if(NULL != lpDDClipper)
    {
        lpDDClipper->Release();
        lpDDClipper = NULL;
    }
    if(NULL != lpDD7)
    {
        lpDD7->Release();
        lpDD7 = NULL;
    }
}

BOOL Error(char* msg)
{

    MessageBox(0,msg,"Error",MB_OK);
   
    OutputDebugString(msg);
    OutputDebugString("\n");
    return FALSE;
}


Falls das noch wichtig ist: Ich arbeite mit Win98 und VC++6 Professional.[/code]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Kampfhund
Super JLI'ler


Alter: 42
Anmeldedatum: 20.07.2002
Beiträge: 408

Medaillen: Keine

BeitragVerfasst am: 15.04.2003, 13:15    Titel: Antworten mit Zitat

hm, vileicht musst du das w bei "windowClass" großschreiben?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Marius
Mini JLI'ler



Anmeldedatum: 15.04.2003
Beiträge: 19
Wohnort: Küssaberg-Rheinheim
Medaillen: Keine

BeitragVerfasst am: 15.04.2003, 13:36    Titel: Antworten mit Zitat

Nee, das wars auch nicht
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Marius
Mini JLI'ler



Anmeldedatum: 15.04.2003
Beiträge: 19
Wohnort: Küssaberg-Rheinheim
Medaillen: Keine

BeitragVerfasst am: 15.04.2003, 13:43    Titel: Antworten mit Zitat

Ich blick's nicht mehr! Ich hab' den Code aus dem Beispielprojekt in meine CPP-Datei kopiert: Und siehe da, es funktioniert! Aber die Lösung ist das auch nicht.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Marius
Mini JLI'ler



Anmeldedatum: 15.04.2003
Beiträge: 19
Wohnort: Küssaberg-Rheinheim
Medaillen: Keine

BeitragVerfasst am: 15.04.2003, 13:56    Titel: Antworten mit Zitat

Hi!

Ich hab's hingekriegt. Ich hab Zeile für Zeile verglichen und es sind noch ein paar Fehler in der WinMain und in der InitDirectDraw aufgetaucht.

Danke für die schnellen Antworten
Marius
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Mr.X
Junior JLI'ler



Anmeldedatum: 15.04.2003
Beiträge: 88

Medaillen: Keine

BeitragVerfasst am: 15.04.2003, 20:20    Titel: ... Antworten mit Zitat

Hi, falls Dich die Ursachen für Deine Fehler interessieren:

Dein erster Fehler wird durch einen Schreibfehler in Deiner WindowFunc()-Funktion verursacht.
---> Am Ende der Funktion rufst Du für nicht behandelte Nachrichten die Windows-Standardfuntion DefWindowProc() auf und übergibts dieser als ersten Parameter die Variable hWnd !!! Lokal in dieser Funktion für das Fensterhandle ist jedoch die Variable hwnd. Beim Start Deines Programmes ist der Wert Deiner globalen Variable hWnd NULL. Wenn nun Dein Fenster erzeugt werden soll, so wird bereits bei diesem Erzeugen Dein neues Fenster "angesprochen" (in diesem Moment hat Windows bereits ein Handle erzeugt und Deiner Nachrichten-Behandlungsfunktion wird schon dieses richtige Handle durch die Variable hwnd übergeben). Da Du diese Nachricht aber durch Aufruf der Standardfunktion behandelst, welcher Du das immer noch ungültige Handle hWnd (= NULL) übergibst, kommt sozusagen die "Erzeuge Fenster zu diesem Handle"-Nachricht nicht beim richtigen Fensterhandle an!!! Du leitest sozusagen alle Nachrichten um (bzw. ins Leere), die für Dein Fenster(handle) bestimmt sind. Daher schlägt die Funktion CreateWindowEx() fehl, und sie liefert als Rückgabewert 0. Deiner globalen Variable hWnd weist Du erst jetzt am Ende (nachdem das Fenster erzeugt worden wäre) das gültige Fensterhandle zu, welches aber nun weiterhin bei 0 bleibt!!! Dadurch wird deine Error()-Funktion aufgerufen.

Dein zweiter Fehler beruht auf einem fehlendem Funktionsaufruf Deines DirectDraw-Objektes.
--->Nachdem Du es mit DirectDrawCreateEx() angelegt hast, must Du erst dessen Kooperationsebene festlegen, bevor Du eine entsprechende Oberfläche anlegen kannst. In Deinem Fall liefert der Aufruf der Funktion CreateSurface() DDERR_NOCOOPERATIVELEVELSET (HRESULT-Errorcode 212) zurück! In "ddraw.h" steht dazu:
/*
* Create function called without DirectDraw object method SetCooperativeLevel
* being called.
*/

Um diesen Fehler zu beheben musst Du als erstes die Methode SetCooperativeLevel() Deines DirectDraw-Objektes aufrufen. Beispiel:
Code:

if(FAILED(DirectDrawCreateEx(NULL,(LPVOID*)&lpDD7, IID_IDirectDraw7, NULL)))
   {
      return (Error("Fehler beim Anlegen des DD-Objekts!"));
   }

if(FAILED(lpDD7->SetCooperativeLevel(hWnd,DDSCL_NORMAL)))
    {
        return Error("Fehler beim Setzen der Kooperationsebene");   
    }




Fazit:
Lange Rede, kurzer Sinn. Confused

mfG
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 -> Fragen, Antworten und Kritik 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