Sourcecodes - Das erste Direct3D Programm

Sprachenübersicht/C / C++/ C#/Spieleprogrammierung/DirectX

Das erste Direct3D Programm

Diese Seite wurde 5729 mal aufgerufen.

Dieser Artikel wurde in einem Wikiweb System geschrieben, das heißt, Sie können die Artikel jederzeit editieren, wenn Sie einen Fehler gefunden haben, oder etwas hinzufügen wollen.

Editieren Versionen Linkpartnerschaft Bottom Printversion

Keywords: D3D, DirectX, Direct3D

Mit diesem Code erstellt man eine DirectX9 D3D Anwendung

Code:


// Headerdatei
#include <windows.h>
#include <d3d9.h>
#include <d3dx9.h>

HWND hWnd = 0;

// Anwendungsfenster erzeugen
HWND CreateMainWindow(HINSTANCE hInstance);

// Callback Funktion zur Nachrichtenbehandlung
LRESULT CALLBACK MessageHandler(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);

LPDIRECT3D9 g_pD3D =NULL;
LPDIRECT3DDEVICE9 pDevice = NULL;

// Windows main-Funktion
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;
    }

    // Struktur, in der Informationen zur Nachricht gespeichert werden
    MSG msg;
    
    if(!(g_pD3D =Direct3DCreate9(D3D_SDK_VERSION)))
    {
        MessageBox(0,"Fehler beim erzeugen eines D3D Objekts","Fehler beim Initialisieren von Direct3D",MB_OK);
    }

     D3DPRESENT_PARAMETERS PParams;
    ZeroMemory(&PParams,sizeof(PParams));

    PParams.SwapEffect=D3DSWAPEFFECT_DISCARD;
    PParams.hDeviceWindow=hWnd;
    PParams.Windowed =FALSE;

    PParams.BackBufferWidth=800;
    PParams.BackBufferHeight=600;

    PParams.BackBufferFormat = D3DFMT_X8R8G8B8;
    PParams.Flags            = D3DPRESENTFLAG_LOCKABLE_BACKBUFFER;

    if(FAILED(g_pD3D ->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,
                hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&PParams,& pDevice)))
    {
        MessageBox(hWnd,"Fehler beim anlegen des Geräts","Fehler beim Initialisieren von Direct3D",MB_OK);
    }

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

    if(NULL !=g_pD3D)
    {
        g_pD3D->Release();
        g_pD3D=NULL;
    }

    if(NULL !=pDevice)
    {
        pDevice->Release();
        pDevice=NULL;
    }

    return 0;
}

// Fenster erzeugen
HWND CreateMainWindow(HINSTANCE hInstance)
{
    WNDCLASSEX wndClass = 
    { 
        sizeof(WNDCLASSEX),                                 // Größe angeben
        CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW,    // Standardstile        
        MessageHandler,                                     // Callback-Funktion
        0,                                                  // Zusätzliche Angaben
        0,                                                  // nicht benötigt
        hInstance,                                          // Anwendungsinstanz
        LoadIcon(NULL, IDI_WINLOGO),                        // Windows-Logo
        LoadCursor(NULL, IDC_ARROW),                        // Normaler Cursor
        (HBRUSH)GetStockObject(WHITE_BRUSH),                // Weißer Pinsel
        NULL,                                               // kein Menü
        "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_OVERLAPPEDWINDOW |   // Fenster
                          WS_VISIBLE,             // Eigenschaften
                          100, 100, 400, 300,     // Anfangsposition und Größe
                          NULL,                   // Handle des Elternfensters
                          NULL,                   // Handle des Menüs
                          hInstance,              // Anwendungsinstanz
                          NULL);                  // wird nicht benötigt
}


LRESULT CALLBACK MessageHandler(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
        case WM_DESTROY:
                    PostQuitMessage(0);
                    return 0;
                break;   
        case WM_PAINT:

                pDevice->Clear(0,0,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0xFF),0,0);
                pDevice->BeginScene();

                LPDIRECT3DSURFACE9 lpBackBuffer;
                HDC hDC;

                pDevice->GetBackBuffer(0,0, D3DBACKBUFFER_TYPE_MONO,&lpBackBuffer);

                if(FAILED(lpBackBuffer->GetDC(&hDC)))
                {
                    MessageBox(hwnd,"Fehler","Fehler beim Abfragen von DC handle",MB_OK);
                }

                TextOut(hDC,10,30,"Hallo Direct3D",14);
                    
                lpBackBuffer->ReleaseDC(hDC);


                pDevice->EndScene();
                pDevice->Present(0,0,0,0);
            return 0;
        break;
    }

    return DefWindowProc(hwnd, msg, wParam, lParam);
}

Gibt es noch irgendwelche Fragen, oder wollen Sie über den Artikel diskutieren?

Editieren Versionen Linkpartnerschaft Top Printversion

Haben Sie einen Fehler gefunden? Dann klicken Sie doch auf Editieren, und beheben den Fehler, keine Angst, Sie können nichts zerstören, der Artikel kann wiederhergestellt werden.

Sprachenübersicht/C / C++/ C#/Spieleprogrammierung/DirectX/Das erste Direct3D Programm