Перейти в оконный режим в Direct3D 9 - PullRequest
2 голосов
/ 19 октября 2011

Я создаю приложение Direct3D, и я могу легко перейти из оконного в полноэкранный режим, используя IDirect3DDevice9::Reset с новыми параметрами презентации.Однако, когда я использую тот же трюк для перехода из полноэкранного в оконный режим, окно теперь теряет свои границы.

Если я попытаюсь сделать SetWindowLong, чтобы установить стиль окна на WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU (а затем SetWindowPos с SWP_FRAMECHANGED), окно теперь получает свою границу, но устройство direct3d больше не работает.Сброс устройства снова не работает, и вместо Reset(), выполнение Release(), затем SetWindowLong(), затем CreateDevice() снова, конечно, не удается, так как мои управляемые ресурсы зависят от моего устройства.

Каксделать IDirect3DDevice9::Reset для возврата в оконный режим при создании граничного окна?

1 Ответ

0 голосов
/ 10 декабря 2011

Сначала вам нужно изменить свойства окна:

SetWindowLongPtr(hWnd, GWL_STYLE, WS_OVERLAPPEDWINDOW);

if (new_pos_size)
{
    // if you want new position (pos_x, pos_y) and size (width, height)
    UINT flags = SWP_FRAMECHANGED | SWP_SHOWWINDOW;
    SetWindowPos(hWnd, HWND_NOTOPMOST, pos_x, pos_y, width, height, flags);
}
else
{
    UINT flags = SWP_NOMOVE | SWP_NOSIZE | SWP_FRAMECHANGED | SWP_SHOWWINDOW;
    SetWindowPos(hWnd, 0, 0, 0, 0, 0, flags);
}

Затем вы должны освободить все ресурсы, созданные в пуле по умолчанию - D3DPOOL_DEFAULT (лучше использовать D3DPOOL_MANAGED, если это возможно).Если вы этого не сделаете, IDirect3DDevice9::Reset потерпит неудачу.
Затем вы можете перезагрузить устройство и, при необходимости, воссоздать любые ресурсы.Убедитесь, что вы правильно настроили D3DPRESENT_PARAMETERS для IDirect3DDevice9::Reset.

...