Поделиться через


Метод IDXGIFactory::MakeWindowAssociation (dxgi.h)

Позволяет DXGI отслеживать очередь сообщений приложения для последовательности клавиш alt-ввод (что приводит к переходу приложения с окон на полноэкранный режим или наоборот).

Синтаксис

HRESULT MakeWindowAssociation(
  HWND WindowHandle,
  UINT Flags
);

Параметры

WindowHandle

Тип: HWND

Дескриптор отслеживаемого окна. Этот параметр может иметь значение NULL; но только если флаги также равно 0.

Flags

Тип: UINT

Одно или несколько из следующих значений.

  • DXGI_MWA_NO_WINDOW_CHANGES — запрет DXGI отслеживать очередь сообщений приложений; это делает DXGI неспособным реагировать на изменения режима.
  • DXGI_MWA_NO_ALT_ENTER— запретить DXGI отвечать на последовательность alt-ввод.
  • DXGI_MWA_NO_PRINT_SCREEN — запрет dxgi на нажатие клавиши экрана.

Возвращаемое значение

Тип: HRESULT

DXGI_ERROR_INVALID_CALL , если аргумент WindowHandle недопустим или E_OUTOFMEMORY.

Комментарии

Примечание При вызове этого API в процессе сеанса 0 он возвращает DXGI_ERROR_NOT_CURRENTLY_AVAILABLE.
 
Сочетание WindowHandle и Flags сообщает DXGI о прекращении мониторинга сообщений окна для ранее связанного окна.

Если приложение переключится в полноэкранный режим, DXGI выберет разрешение в полноэкранном режиме, чтобы оно было наименьшим поддерживаемым разрешением, которое больше или равно текущему размеру буфера задней части.

Приложения могут вносить некоторые изменения, чтобы сделать переход с окон на полноэкранный режим более эффективным. Например, в сообщении WM_SIZE приложение должно освободить все незавершенные буферы обратной цепочки буферов, вызвать IDXGISwapChain::ResizeBuffers, а затем повторно получить задние буферы из цепочки буферов. Это дает цепочкам буферов возможность изменить размер задних буферов и (или) повторно создать их, чтобы включить полноэкранную операцию перелистывания. Если приложение не выполняет эту последовательность, DXGI по-прежнему будет выполнять полноэкранный/оконный переход, но может быть вынужден использовать операцию растяжения (так как задние буферы могут иметь неправильный размер), что может быть менее эффективным. Даже если растяжение не требуется, представление может быть неоптимальным, так как задние буферы не могут быть напрямую взаимозаменяемы с передним буфером. Таким образом, вызов ResizeBuffers в WM_SIZE всегда рекомендуется, так как WM_SIZE всегда отправляется во время полноэкранного перехода.

При наличии окон приложение может, если оно выберет, ограничить размер клиентской области своего окна размерами, до которых ему удобно отрисовывать. Полностью гибкое приложение не будет делать таких ограничений, но элементы пользовательского интерфейса или другие аспекты проектирования могут, конечно, сделать эту гибкость несостояемой. Если приложение решит ограничить клиентскую область своего окна только теми, которые соответствуют поддерживаемым разрешениям в полноэкранном режиме, приложение может WM_SIZING, а затем проверка для IDXGIOutput::FindClosestMatchingMode. Если найден соответствующий режим, разрешите изменение размера. (IDXGIOutput можно получить из IDXGISwapChain::GetContainingOutput. При отсутствии последующих изменений топологии рабочего стола это будет тот же результат, который будет выбран при вводе alt-ввод и запуске полноэкранного режима для этой цепочки буферов.)

Приложения, которые хотят обрабатывать изменения режима или ALT+ВВОД, должны вызывать MakeWindowAssociation с флагом DXGI_MWA_NO_WINDOW_CHANGES после создания цепочки буферов. Аргумент WindowHandle , если значение не равно NULL, указывает, что очереди сообщений приложения не будут обрабатываться средой выполнения DXGI для всех цепочек буферов определенного целевого HWND. Вызов MakeWindowAssociation с флагом DXGI_MWA_NO_WINDOW_CHANGES после создания цепочки буферов гарантирует, что DXGI не будет мешать обработке приложением изменений режима окна или ALT+ВВОД.

Необходимо вызвать метод MakeWindowAssociation для объекта фабрики, связанного с целевыми цепочками буферов HWND. Это можно гарантировать, вызвав метод IDXGIObject::GetParent в цепочках буферов, чтобы найти фабрику. Ниже приведен пример кода для этого.

void MakeWindowAssociationWithLocatedFactory(
    winrt::com_ptr<IDXGISwapChain> const& swapChain,
    HWND hWnd,
    UINT flags)
{
    winrt::com_ptr<IDXGIFactory1> factory;
    factory.capture(swapChain, &IDXGISwapChain::GetParent);
    factory->MakeWindowAssociation(hWnd, flags);
}

Заметки для приложений Магазина Windows

Если приложение Магазина Windows вызывает MakeWindowAssociation, оно завершается сбоем с DXGI_ERROR_NOT_CURRENTLY_AVAILABLE.

Приложение Microsoft Win32 может использовать MakeWindowAssociation для управления переходами в полноэкранном режиме с помощью сочетания клавиш ALT+ВВОД и поведения на экране печати для полноэкранного режима. Для приложений Магазина Windows, так как DXGI не может выполнять полноэкранные переходы, приложение Магазина Windows не может управлять переходами в полноэкранном режиме.

Требования

   
Целевая платформа Windows
Header dxgi.h
Библиотека DXGI.lib

См. также раздел

Интерфейсы DXGI

IDXGIFactory