Compartir a través de


Método IDXGIFactory::MakeWindowAssociation (dxgi.h)

Permite a DXGI supervisar la cola de mensajes de una aplicación para la secuencia de teclas alt-entrar (lo que hace que la aplicación cambie de ventana a pantalla completa o viceversa).

Sintaxis

HRESULT MakeWindowAssociation(
  HWND WindowHandle,
  UINT Flags
);

Parámetros

WindowHandle

Tipo: HWND

Identificador de la ventana que se va a supervisar. Este parámetro puede ser NULL; pero solo si Flags es también 0.

Flags

Tipo: UINT

Uno o varios de los valores siguientes.

  • DXGI_MWA_NO_WINDOW_CHANGES: impedir que DXGI supervise una cola de mensajes de aplicaciones; esto hace que DXGI no pueda responder a los cambios en el modo.
  • DXGI_MWA_NO_ALT_ENTER: impide que DXGI responda a una secuencia alt-enter.
  • DXGI_MWA_NO_PRINT_SCREEN: impide que DXGI responda a una tecla de pantalla de impresión.

Valor devuelto

Tipo: HRESULT

DXGI_ERROR_INVALID_CALL si WindowHandle no es válido o E_OUTOFMEMORY.

Comentarios

Nota Si llama a esta API en un proceso de sesión 0, devuelve DXGI_ERROR_NOT_CURRENTLY_AVAILABLE.
 
La combinación de WindowHandle y Flags informa a DXGI de detener la supervisión de mensajes de ventana para la ventana asociada anteriormente.

Si la aplicación cambia al modo de pantalla completa, DXGI elegirá una resolución de pantalla completa para ser la resolución compatible más pequeña que sea mayor o el mismo tamaño que el tamaño actual del búfer de reserva.

Las aplicaciones pueden realizar algunos cambios para hacer que la transición de ventanas a pantalla completa sea más eficaz. Por ejemplo, en un mensaje de WM_SIZE, la aplicación debe liberar los búferes pendientes de la cadena de intercambio, llamar a IDXGISwapChain::ResizeBuffers y, a continuación, volver a adquirir los búferes de reserva de las cadenas de intercambio. Esto proporciona a las cadenas de intercambio una oportunidad para cambiar el tamaño de los búferes de reserva o volver a crearlos para habilitar la operación de volteo de pantalla completa. Si la aplicación no realiza esta secuencia, DXGI seguirá realizando la transición de pantalla completa o ventana, pero puede verse obligado a usar una operación de extensión (ya que es posible que los búferes de reserva no sean el tamaño correcto), lo que puede ser menos eficaz. Incluso si no se requiere una extensión, es posible que la presentación no sea óptima porque es posible que los búferes de reserva no sean intercambiables directamente con el búfer frontal. Por lo tanto, siempre se recomienda una llamada a ResizeBuffers en WM_SIZE, ya que siempre se envía WM_SIZE durante una transición de pantalla completa.

Mientras está ventanada, la aplicación puede, si lo elige, restringir el tamaño del área cliente de su ventana a tamaños a los que es cómodo representar. Una aplicación totalmente flexible no haría ninguna restricción de este tipo, pero los elementos de la interfaz de usuario u otras consideraciones de diseño pueden, por supuesto, hacer que esta flexibilidad sea intensable. Si la aplicación decide restringir aún más el área de cliente de su ventana a solo aquellas que coincidan con las resoluciones de pantalla completa admitidas, la aplicación puede usar WM_SIZING y, a continuación, comprobar con IDXGIOutput::FindClosestMatchingMode. Si se encuentra un modo coincidente, permita el cambio de tamaño. (IdXGIOutput se puede recuperar de IDXGISwapChain::GetContainingOutput. Si no hay cambios posteriores en la topología de escritorio, será la misma salida que se elegirá cuando alt-entrar se fielde y se inicie el modo de pantalla completa para esa cadena de intercambio).

Las aplicaciones que quieran controlar los cambios en el modo o Alt+Entrar deben llamar a MakeWindowAssociation con la marca DXGI_MWA_NO_WINDOW_CHANGES después de la creación de la cadena de intercambio. El argumento WindowHandle , si no es NULL, especifica que el tiempo de ejecución de DXGI no controlará las colas de mensajes de la aplicación para todas las cadenas de intercambio de un HWND de destino determinado. Llamar a MakeWindowAssociation con la marca DXGI_MWA_NO_WINDOW_CHANGES después de la creación de la cadena de intercambio garantiza que DXGI no interferirá con el control de los cambios en el modo de ventana de la aplicación o Alt+Entrar.

Debe llamar al método MakeWindowAssociation en el objeto de fábrica asociado a las cadenas de intercambio HWND de destino. Puede garantizar que llamando al método IDXGIObject::GetParent en las cadenas de intercambio para localizar el generador. Este es un ejemplo de código de hacerlo.

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);
}

Notas de las aplicaciones de la Tienda Windows

Si una aplicación de la Tienda Windows llama a MakeWindowAssociation, se produce un error con DXGI_ERROR_NOT_CURRENTLY_AVAILABLE.

Una aplicación De Microsoft Win32 puede usar MakeWindowAssociation para controlar las transiciones de pantalla completa a través de la combinación de teclas Alt+Entrar y el comportamiento de la pantalla de impresión para pantalla completa. En el caso de las aplicaciones de la Tienda Windows, dado que DXGI no puede realizar transiciones de pantalla completa, una aplicación de la Tienda Windows no tiene forma de controlar las transiciones de pantalla completa.

Requisitos

   
Plataforma de destino Windows
Encabezado dxgi.h
Library DXGI.lib

Consulte también

Interfaces DXGI

IDXGIFactory