DirectDraw-Probleme beim Borland C++ Compiler 5.5



  • Hallo Leute,

    ich habe folgenden Code erfolgreich compiliert und gelinkt:

    #include <windows.h>
    #include <ddraw.h>
    
    LPDIRECTDRAW7 lpDD=0;
    LPDIRECTDRAWSURFACE7 lpDDSPrimary=0;
    LPDIRECTDRAWSURFACE7 lpDDSBack=0;
    
    int Reihe=1;
    
    LRESULT CALLBACK WndProc(HWND,unsigned,WPARAM,LPARAM);
    
    int APIENTRY WinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR     lpCmdLine,
                         int       nCmdShow )
    {
        WNDCLASS wc;
        wc.cbClsExtra=0;
        wc.cbWndExtra=sizeof(DWORD);
        wc.hbrBackground=(HBRUSH) GetStockObject(BLACK_BRUSH);
        wc.hCursor=LoadCursor(0,IDC_ARROW);
        wc.hIcon=0;
        wc.hInstance=hInstance;
        wc.lpfnWndProc=(WNDPROC) WndProc;
        wc.lpszClassName="WinProg";
        wc.lpszMenuName=0;
        wc.style=CS_HREDRAW|CS_VREDRAW;
    
        RegisterClass(&wc);
    
        HWND hWindow;
        hWindow=CreateWindow("WinProg","DirectX-Anwendung",WS_POPUP,100,100,600,400,0,0,hInstance,0);
    
        ShowWindow(hWindow,nCmdShow);
        UpdateWindow(hWindow);
        ShowCursor(false);
        DirectDrawCreateEx(0,(void**)&lpDD,IID_IDirectDraw7,0);
        lpDD->SetCooperativeLevel(hWindow,DDSCL_EXCLUSIVE|DDSCL_FULLSCREEN);
        lpDD->SetDisplayMode(640,480,16,0,0);
        DDSURFACEDESC2 ddsd;
        ZeroMemory(&ddsd,sizeof(ddsd));
        ddsd.dwSize=sizeof(ddsd);
        ddsd.dwFlags=DDSD_CAPS|DDSD_BACKBUFFERCOUNT;
        ddsd.ddsCaps.dwCaps=DDSCAPS_PRIMARYSURFACE|
                            DDSCAPS_FLIP|
                            DDSCAPS_COMPLEX;
        ddsd.dwBackBufferCount=1;
        lpDD->CreateSurface(&ddsd,&lpDDSPrimary,0);
        DDSCAPS2 ddscaps;
        ZeroMemory(&ddscaps,sizeof(ddscaps));
        ddscaps.dwCaps=DDSCAPS_BACKBUFFER;
        lpDDSPrimary->GetAttachedSurface(&ddscaps,&lpDDSBack);
            HDC hdc;
            lpDDSBack->GetDC(&hdc);
            TextOut(hdc,10,10,"Primary Buffer",lstrlen("Primary Buffer"));
            lpDDSBack->ReleaseDC(hdc);
            Reihe=2;
            lpDDSPrimary->Flip(0,DDFLIP_WAIT);
        MSG msg;
        while(GetMessage(&msg,0,0,0))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        lpDDSBack->Release();
        lpDDSPrimary->Release();
        lpDD->Release();
        ShowCursor(true);
    
        return msg.wParam;
    }
    LRESULT CALLBACK WndProc(HWND hWnd,unsigned uMsg,WPARAM wParam,LPARAM lParam)
    {
        switch(uMsg)
        {
        case WM_KEYDOWN:
            DestroyWindow(hWnd);
            return 0;
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProc(hWnd,uMsg,wParam,lParam);
        }
        return 0;
    }
    

    Wenn ich das ganze ausführe, erscheint zwar der gewünschte Text "Primary Buffer", jedoch erscheinen auch noch irgendwelche sinnlosen Zusammensetzungen von Streifen und verzerrten Symbolleisten. Weiß jemand, woran das liegt und wie ich es beseitigen kann?

    Danke schon mal im voraus!



  • Das ist kein Borland-Spezifisches Problem. 🙂

    Schau dir mal deine Surface an. Du erstellst sie. Dann schreibst du den Text drauf. Aber was war vorher drauf? Du darfst nicht davon ausgehen, dass windows das schon weiß, schwarz, blau oder wie auch immer einfärbt.
    Du musst also einfach bevor du den Text draufschreibst beide Surfaces mit einer einheitlichen Farbe füllen.


Anmelden zum Antworten