Функция d3ddev-> Present() не работает, когда я копирую фоновый буфер на экран

#c #direct3d

#c #direct3d

Вопрос:

Когда я использую d3ddev->Present() для копирования обратного буфера на экран, ничего не произошло (возвращаемое значение равно D3D_OK ). Когда я создаю окно без заголовка, например WS_POPUP , оно работает. Есть ли кто-нибудь, кто может сказать мне, почему? Спасибо. и извините за плохой английский.

win10, Direct3D9

окно без заголовка

окно с заголовком

 //Game update function

void Game_Run(HWND hwnd)
{
    //make sure the Direct3D device is valid
    if (!d3ddev) return;
    //start rendering
    if (SUCCEEDED(d3ddev->BeginScene())) {
        //fill the surface with random color
        int r = rand() % 255;
        int g = rand() % 255;
        int b = rand() % 255;
        d3ddev->ColorFill(surface, NULL, D3DCOLOR_XRGB(r, g, b));
        //copy the surface to the backbuffer
        RECT rect;
        rect.left = rand() % SCREENW / 2;
        rect.right = rect.left   rand() % SCREENW / 2;
        rect.top = rand() % SCREENH / 2;
        rect.bottom = rect.top   rand() % SCREENH / 2;
        d3ddev->StretchRect(surface, NULL, backbuffer, amp;rect, D3DTEXF_NONE);
        //stop rendering
        d3ddev->EndScene();
        //copy the back buffer to the screen
        d3ddev->Present(NULL, NULL, NULL, NULL);
    }
    //check for escape key
    if (KEY_DOWN(VK_ESCAPE))
        PostMessage(hwnd, WM_DESTROY, 0, 0);
}
...
//create a new window
HWND hwnd = CreateWindow(
    "MainWindowClass",
    APPTITLE.c_str(),
    WS_POPUP,                   //it works
    //WS_OVERLAPPEDWINDOW,        it doesn't work
    CW_USEDEFAULT, CW_USEDEFAULT,
    SCREENW, SCREENH,
    NULL, NULL, hInstance, NULL);
  

Комментарии:

1. Не уверен, почему вы вообще используете устаревший Direct3D9, но вы можете найти несколько рабочих «базовых циклов рендеринга» для DirectX 11 здесь .

2. Спасибо за ваш ответ. Я прочитаю несколько книг о DirectX 11.@ChuckWalbourn