Вы должны смотреть на VS 2013 Win32 шаблона настольного приложения Direct3D Win32 Game, который обрабатывает изменения размера окна, хотя он не поддерживает полноэкранные переходы исключающего режим ,
Основная обработка для изменения размера окна для Direct3D 11 в настольных приложениях Win32 - это обновить вашу процедуру Window для обработки WM_SIZE
, но вам нужно справиться с несколькими случаями.
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static bool s_in_sizemove = false;
static bool s_minimized = false;
switch (message)
{
...
case WM_SIZE:
if (wParam == SIZE_MINIMIZED)
{
// The window was minimized (you should probably suspend the application)
if (!s_minimized)
{
s_minimized = true;
}
}
else if (s_minimized)
{
// The window was minimized and is now restored (resume from suspend)
s_minimized = false;
}
else if (!s_in_sizemove)
{
// Here is where you handle the swapchain resize for maximize or unmaximize
}
break;
case WM_ENTERSIZEMOVE:
// We want to avoid trying to resizing the swapchain as the user does the 'rubber band' resize
s_in_sizemove = true;
break;
case WM_EXITSIZEMOVE:
s_in_sizemove = false;
// Here is the other place where you handle the swapchain resize after the user stops using the 'rubber-band'
break;
case WM_GETMINMAXINFO:
{
// We want to prevent the window from being set too tiny
auto info = reinterpret_cast<MINMAXINFO*>(lParam);
info->ptMinTrackSize.x = 320;
info->ptMinTrackSize.y = 200;
}
break;
...
Чтобы сделать Direct3D swapchain изменить размер:
- вызова
ID3D11DeviceContext::OMSetRenderTargets
с нулями, чтобы отвязать цель визуализации и любой глубина/буфер трафарета.
- Отпустите свой целевой вид рендеринга и глубину/трафарет, а также любые другие ссылки на исходный буфер или буфер глубины/трафарета.
- Позвоните
D3D11DeviceContext::Flush
, чтобы эти изменения закончили
- Позвоните
IDXGISwapChain::ResizeBuffers
, чтобы изменить размер буфера до нового размера. Не забудьте ответить на ошибки DXGI_ERROR_DEVICE_REMOVED
и DXGI_ERROR_DEVICE_RESET
.
- Повторите ту же настройку, что и первоначальный размер для нового размера: создайте целевой вид рендеринга для нового заднего буфера, создайте новый вид трафарета глубины для буфера глубины/трафарета, который соответствует новому размеру буфера (необязательно) , и сбросьте размер видового экрана.
Поскольку эта процедура делает некоторые предположения о приложении, она была опущена в учебнике для рабочего стола Win32 для простоты. Этот случай обрабатывается для шаблона игры Direct3D Win32, шаблона приложения Windows Store DirectX и шаблона приложения Windows Direct DirectX.
Нет такой вещи, как «полноэкранный эксклюзивный режим» для приложений Windows Store или приложений для телефонов Windows, поэтому эти шаблоны не реализуют его. Для рабочего стола учебника Win32 и Win32 шаблона Direct3D игр, я использую следующее гарантировать, что я не справиться с этим:
dxgiFactory->MakeWindowAssociation(hwnd, DXGI_MWA_NO_ALT_ENTER);
Я надеюсь вернуться, как расширить шаблон Direct3D Win32 игры для поддержки полным -экранный эксклюзивный режим, но я еще не дошел до него.
Я не думаю, что ResizeBuffers изменят размер окна? Шаблон в вашей ссылке не содержит шейдерного кода, и мне нужен эксклюзивный полноэкранный режим.На самом деле я просто хочу создать окно в фиксированном размере, и если это произойдет, чтобы охватить весь экран, мне нужно быть эксклюзивным полноэкранным. – user1161656
Существует три варианта: (1) Сделать окно полноэкранным с фиксированным размером и не включать элементы управления для перемещения/изменения размера, (2) сделать окно полноэкранным с фиксированным размером и не включать никаких элементов управления или (иногда известный как «поддельный полноэкранный режим»), (3) на самом деле использовать DXGI, чтобы принудительно включить его в эксклюзивный полноэкранный режим. –