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

Permite que o DXGI monitore a fila de mensagens de um aplicativo para a sequência de chaves alt-enter (o que faz com que o aplicativo mude de janela para tela inteira ou vice-versa).

Sintaxe

HRESULT MakeWindowAssociation(
  HWND WindowHandle,
  UINT Flags
);

Parâmetros

WindowHandle

Tipo: HWND

O identificador da janela que deve ser monitorada. Esse parâmetro pode ser NULL; mas somente se Flags também for 0.

Flags

Tipo: UINT

Um ou mais dos valores a seguir.

  • DXGI_MWA_NO_WINDOW_CHANGES – impedir que o DXGI monitore uma fila de mensagens de aplicativos; isso torna o DXGI incapaz de responder às alterações de modo.
  • DXGI_MWA_NO_ALT_ENTER – impedir que o DXGI responda a uma sequência alt-enter.
  • DXGI_MWA_NO_PRINT_SCREEN – impedir que o DXGI responda a uma chave de tela de impressão.

Valor retornado

Tipo: HRESULT

DXGI_ERROR_INVALID_CALL se WindowHandle for inválido ou E_OUTOFMEMORY.

Comentários

Nota Se você chamar essa API em um processo de Sessão 0, ela retornará DXGI_ERROR_NOT_CURRENTLY_AVAILABLE.
 
A combinação de WindowHandle e Flags informa o DXGI para interromper o monitoramento de mensagens da janela para a janela associada anteriormente.

Se o aplicativo mudar para o modo de tela inteira, o DXGI escolherá uma resolução de tela inteira para ser a menor resolução com suporte maior ou do mesmo tamanho que o tamanho atual do buffer traseiro.

Os aplicativos podem fazer algumas alterações para tornar a transição de janelas para tela inteira mais eficiente. Por exemplo, em uma mensagem WM_SIZE, o aplicativo deve liberar quaisquer buffers de back de cadeia de troca pendentes, chamar IDXGISwapChain::ResizeBuffers e, em seguida, adquirir novamente os buffers de back da(s) cadeia(s) de troca. Isso dá às cadeias de troca a oportunidade de redimensionar os buffers traseiros e/ou recriá-los para habilitar a operação de inversão de tela inteira. Se o aplicativo não executar essa sequência, o DXGI ainda fará a transição de tela inteira/janelas, mas poderá ser forçado a usar uma operação de alongamento (já que os buffers traseiros podem não ser o tamanho correto), o que pode ser menos eficiente. Mesmo que um alongamento não seja necessário, a apresentação pode não ser ideal porque os buffers traseiros podem não ser diretamente intercambiáveis com o buffer frontal. Portanto, uma chamada para ResizeBuffers no WM_SIZE é sempre recomendada, pois WM_SIZE sempre é enviado durante uma transição de tela inteira.

Enquanto em janelas, o aplicativo pode, se escolher, restringir o tamanho da área de cliente de sua janela a tamanhos aos quais ele é confortável de renderização. Um aplicativo totalmente flexível não tornaria essa restrição, mas elementos de interface do usuário ou outras considerações de design podem, naturalmente, tornar essa flexibilidade insustentável. Se o aplicativo optar ainda por restringir a área do cliente de sua janela apenas àqueles que correspondem a resoluções de tela inteira compatíveis, o aplicativo poderá WM_SIZING de campo e, em seguida, marcar em IDXGIOutput::FindClosestMatchingMode. Se um modo de correspondência for encontrado, permita o redimensionamento. (O IDXGIOutput pode ser recuperado de IDXGISwapChain::GetContainingOutput. Sem alterações subsequentes na topologia da área de trabalho, essa será a mesma saída que será escolhida quando alt-enter estiver em campo e o modo de tela inteira for iniciado para essa cadeia de troca.)

Os aplicativos que desejam lidar com alterações de modo ou Alt+Enter devem chamar MakeWindowAssociation com o sinalizador DXGI_MWA_NO_WINDOW_CHANGES após a criação da cadeia de troca. O argumento WindowHandle , se não FOR NULL, especifica que as filas de mensagens do aplicativo não serão tratadas pelo runtime DXGI para todas as cadeias de troca de um HWND de destino específico. Chamar MakeWindowAssociation com o sinalizador DXGI_MWA_NO_WINDOW_CHANGES após a criação da cadeia de troca garante que o DXGI não interfira no tratamento do aplicativo de alterações no modo de janela ou Alt+Enter.

Você deve chamar o método MakeWindowAssociation no objeto de fábrica associado à cadeia de troca HWND de destino. Você pode garantir isso chamando o método IDXGIObject::GetParent nas cadeias de troca para localizar a fábrica. Aqui está um exemplo de código de fazer isso.

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

Anotações para aplicativos da Windows Store

Se um aplicativo da Windows Store chamar MakeWindowAssociation, ele falhará com DXGI_ERROR_NOT_CURRENTLY_AVAILABLE.

Um aplicativo Microsoft Win32 pode usar MakeWindowAssociation para controlar transições em tela inteira por meio da combinação de teclas Alt+Enter e do comportamento da tela de impressão para tela inteira. Para aplicativos da Windows Store, como o DXGI não pode executar transições de tela inteira, um aplicativo da Windows Store não tem como controlar transições de tela inteira.

Requisitos

   
Plataforma de Destino Windows
Cabeçalho dxgi.h
Biblioteca DXGI.lib

Confira também

Interfaces DXGI

IDXGIFactory