Surface wird nicht korrekt dargestellt...warum?



  • Hi,
    ich ahbe folgendes kleines Programm zum üben geschrieben. Das Surface wird zwar angezeigt, allerdings nicht korrekt. Anstatt das Bild auf dem Surface auszugeben, wird jedoch etwas völlig verzertes (wahrscheinlich aus dem Grafikspeicher) angezeigt. Ich habe es auch schonmal mit FillColor probiert, anstatt eine Grafik zu laden, aber auch das lieferte leider das selbe Resultat. Villeicht könnte ihr mir ja helfen 🙂

    #include <d3d9.h>
    #include <d3dx9.h>
    
    HWND CreateMainWindow(HINSTANCE hInstance);
    
    LRESULT CALLBACK MessageHandler(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);
    
    BOOL InitDirect3D(HWND hWnd);
    
    void CleanUpDirect3D(void);
    
    void CreateD3DFont(void);
    
    LPDIRECT3D9       lpD3D       = NULL;
    
    LPDIRECT3DDEVICE9 lpD3DDevice = NULL;
    
    LPD3DXFONT		  lpD3DFont   = NULL;
    
    HWND hWnd = 0;
    
    int WINAPI WinMain(HINSTANCE hInstance,      
                       HINSTANCE hPrevInstance,  
                       LPSTR lpCmdLine,          
                       int nCmdShow)             
    {
        hWnd = CreateMainWindow(hInstance);
    
        if(0 == hWnd)
        {
            MessageBox(0,"Fenster konnte nicht erzeugt werden","Fehler",MB_OK);
            return -1;
        }
    
        if(!InitDirect3D(hWnd))
        {
    		return -1;
    	}
    
        MSG msg;
    
        while(GetMessage(&msg,NULL,0,0))
    	{
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    
        CleanUpDirect3D();
    
        return 0;
    }
    
    HWND CreateMainWindow(HINSTANCE hInstance)
    {
        WNDCLASSEX wndClass =
        {
            sizeof(WNDCLASSEX),                                 
            CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW,    
            MessageHandler,                                     
            0,                                                  
            0,                                                  
            hInstance,                                          
            LoadIcon(NULL, IDI_WINLOGO),                        
            LoadCursor(NULL, IDC_ARROW),                        
            (HBRUSH)GetStockObject(WHITE_BRUSH),                
            NULL,                                               
            "WindowClass",                                      
            LoadIcon(NULL, IDI_WINLOGO)                         
        };
    
        RegisterClassEx(&wndClass);
    
        return CreateWindowEx(NULL,                   
                              "WindowClass",          
                              "DirectX Graphics",     
                              WS_OVERLAPPEDWINDOW |   
                              WS_VISIBLE,             
                              0, 0, 1280, 720,         
                              NULL,                   
                              NULL,                   
                              hInstance,              
                              NULL);                  
    }
    
    LRESULT CALLBACK MessageHandler(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
    
        switch(msg)
        {
            case WM_DESTROY:
                    PostQuitMessage(0);
                    return 0;
                 break;
    
            case WM_KEYDOWN:
                   switch(wParam)
                   {
                     case VK_ESCAPE:
                             DestroyWindow(hWnd);
                          break;
                   }
                 break;
    
            case WM_PAINT:
    
    				D3DCOLOR ClearColor = D3DCOLOR_XRGB(0x00,0x00,0x00);
    				D3DCOLOR TextColor = D3DCOLOR_ARGB(0x00,0xFF,0xFF,0xFF);
    
                    lpD3DDevice->Clear(0,0,D3DCLEAR_TARGET, ClearColor, 0,0);
    
    				RECT r = { 100, 100, 0, 0 };
    				RECT sr_1 = { 640, 480, 0, 0 };
    
    				LPDIRECT3DSURFACE9 lpSurface = NULL;
    				LPDIRECT3DSURFACE9 lpBackBuffer = NULL;
    
    				lpD3DDevice->CreateOffscreenPlainSurface(640, 480, D3DFMT_X8R8G8B8, D3DPOOL_DEFAULT, &lpSurface, 0);
    
    				D3DXLoadSurfaceFromFile(lpSurface, 0, 0, "test.bmp", 0, D3DX_DEFAULT, 0, 0);
    
    				lpD3DDevice->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &lpBackBuffer);
    
    				lpD3DDevice->Clear(0,0,D3DCLEAR_TARGET,ClearColor,0,0);
    
    				lpD3DDevice->BeginScene();
    
    				RECT DestRect = { 100, 100, 640, 480 };
    
    				lpD3DDevice->StretchRect(lpSurface, NULL, lpBackBuffer, &DestRect, D3DTEXF_NONE);
    
                    lpD3DDevice->EndScene();
    
                    lpD3DDevice->Present(0,0,0,0);
    
                 break;
        }
    
        return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    
    BOOL InitDirect3D(HWND hWnd)
    {
        lpD3D = Direct3DCreate9(D3D_SDK_VERSION);
    
        if(NULL == lpD3D)
        {
         return FALSE;
        }
    
        D3DPRESENT_PARAMETERS PParams;
        ZeroMemory(&PParams,sizeof(PParams));
    
        PParams.SwapEffect     = D3DSWAPEFFECT_DISCARD;
        PParams.hDeviceWindow  = hWnd;
        PParams.Windowed       = TRUE;
    
        PParams.BackBufferWidth  = 1280;
        PParams.BackBufferHeight = 720;
        PParams.BackBufferFormat = D3DFMT_A8R8G8B8;
    
        if(FAILED(lpD3D->CreateDevice(
                                     D3DADAPTER_DEFAULT,
                                     D3DDEVTYPE_HAL,
                                     hWnd,
                                     D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                     &PParams,
                                     &lpD3DDevice)))
        {
            return FALSE;
        }
    
       return TRUE;
    }
    
    void CleanUpDirect3D(void)
    {
        if(NULL != lpD3DDevice)
        {
            lpD3DDevice->Release();
            lpD3DDevice = NULL;
        }
    
        if(NULL != lpD3D)
        {
            lpD3D->Release();
            lpD3D = NULL;
        }
    }
    
    void CreateD3DFont(void)
    {
        D3DXFONT_DESC    LogFont = { 0 };
    
        strcpy(LogFont.FaceName, "Arial");
    
        D3DXCreateFontIndirect(lpD3DDevice,
                               &LogFont,
                               &lpD3DFont);
    }
    

    Hier noch ein Screenshot, wie die Fehldarstellung ausieht:
    http://img107.imageshack.us/img107/5505/errordd5.jpg

    Als abschließende Info vielleicht noch eins. Ich benutze Visual Studio 2005 Professionel und die DirectX SDK April 2006.



  • Du überprüfst keinerlei Rückgabewerte der aufgerufenen Methoden.
    Mach das mal. Und stell Direct3D (in der Systemsteuerung) auf Debug, und lass das Programm im Debug-Modus laufen. Direct3D wird dir im Falle eines Fehlers Informationen in die Debug-Ausgabe schreiben.



  • Hi,
    hab es nun in der Sysmtessteuerung auf DEBUG gestellt, allerdings bekomme ich keine Fehlermeldungen oder ähnliches, wederim Debug Fenster von Visual Studio noch sonst wo.



  • sevobal schrieb:

    Hi,
    hab es nun in der Sysmtessteuerung auf DEBUG gestellt, allerdings bekomme ich keine Fehlermeldungen oder ähnliches, wederim Debug Fenster von Visual Studio noch sonst wo.

    Hast du denn dein Programm auch im Debug-Modus gestartet?
    Also oben als Konfiguration "Debug" (statt "Release") gewählt und das Programm mit F5 gestartet (statt mit Strg+F5)?



  • Ja, ich startet meine Programme immer im Debug Modus so lange ich noch an ihnen arbeite...aber leider keine Meldung.


Anmelden zum Antworten