Condividi tramite


Metodo IDXGIFactory::MakeWindowAssociation (dxgi.h)

Consente a DXGI di monitorare la coda di messaggi di un'applicazione per la sequenza di chiavi alt-enter( che causa il passaggio dall'applicazione a schermo intero o viceversa).

Sintassi

HRESULT MakeWindowAssociation(
  HWND WindowHandle,
  UINT Flags
);

Parametri

WindowHandle

Tipo: HWND

Handle della finestra da monitorare. Questo parametro può essere NULL; ma solo se flag è anche 0.

Flags

Tipo: UINT

Uno o più dei valori seguenti.

  • DXGI_MWA_NO_WINDOW_CHANGES - Impedire a DXGI di monitorare una coda di messaggi delle applicazioni; in questo modo DXGI non è in grado di rispondere alle modifiche della modalità.
  • DXGI_MWA_NO_ALT_ENTER : impedisce a DXGI di rispondere a una sequenza alt-enter.
  • DXGI_MWA_NO_PRINT_SCREEN - Impedisci a DXGI di rispondere a un tasto di stampa.

Valore restituito

Tipo: HRESULT

DXGI_ERROR_INVALID_CALL se WindowHandle non è valido o E_OUTOFMEMORY.

Commenti

Nota Se si chiama questa API in un processo sessione 0, restituisce DXGI_ERROR_NOT_CURRENTLY_AVAILABLE.
 
La combinazione di WindowHandle e Flag informa DXGI di arrestare i messaggi della finestra di monitoraggio per la finestra associata in precedenza.

Se l'applicazione passa alla modalità schermo intero, DXGI sceglierà una risoluzione a schermo intero per essere la risoluzione più piccola supportata che è maggiore o la stessa dimensione del buffer posteriore corrente.

Le applicazioni possono apportare alcune modifiche per apportare la transizione da finestra a schermo intero più efficiente. Ad esempio, in un messaggio di WM_SIZE, l'applicazione deve rilasciare eventuali buffer back della catena di scambio in sospeso, chiamare IDXGISwapChain::ResizeBuffers, quindi acquisire nuovamente i buffer back dalla catena di scambio. Ciò consente alle catene di scambio di ridimensionare i buffer indietro e/o ricrearli per abilitare l'operazione di scorrimento a schermo intero. Se l'applicazione non esegue questa sequenza, DXGI eseguirà comunque la transizione a schermo intero/finestra, ma potrebbe essere costretta a usare un'operazione di estensione (poiché i buffer indietro potrebbero non essere le dimensioni corrette), che potrebbero essere meno efficienti. Anche se un'estensione non è necessaria, la presentazione potrebbe non essere ottimale perché i buffer indietro potrebbero non essere direttamente intercambiabili con il buffer anteriore. Pertanto, una chiamata a ResizeBuffers in WM_SIZE è sempre consigliata, poiché WM_SIZE viene sempre inviata durante una transizione a schermo intero.

Durante la finestra, l'applicazione può, se sceglie, limitare le dimensioni dell'area client della finestra alle dimensioni a cui è comodo il rendering. Un'applicazione completamente flessibile non farebbe alcuna restrizione, ma gli elementi dell'interfaccia utente o altre considerazioni di progettazione possono, naturalmente, rendere questa flessibilità insostenibile. Se l'applicazione sceglie ulteriormente di limitare l'area client della finestra solo a quelle che corrispondono a risoluzioni a schermo intero supportate, l'applicazione può campiare WM_SIZING, quindi controllare l'IDXGIOutput::FindClosestMatchingMode. Se viene trovata una modalità corrispondente, consentire il ridimensionamento. (L'IDXGIOutput può essere recuperato da IDXGISwapChain::GetContainingOutput. Assenti le modifiche successive alla topologia desktop, questo sarà lo stesso output che verrà scelto quando alt-enter viene attivata e la modalità schermo intero viene avviata per tale catena di scambio.

Le applicazioni che vogliono gestire le modifiche in modalità o ALT+INVIO devono chiamare MakeWindowAssociation con il flag DXGI_MWA_NO_WINDOW_CHANGES dopo la creazione della catena di scambio. L'argomento WindowHandle , se non NULL, specifica che le code dei messaggi dell'applicazione non verranno gestite dal runtime DXGI per tutte le catene di scambio di un determinato HWND di destinazione. La chiamata a MakeWindowAssociation con il flag DXGI_MWA_NO_WINDOW_CHANGES dopo la creazione di swapchain garantisce che DXGI non interferisca con la gestione delle modifiche della modalità finestra o ALT+INVIO.

È necessario chiamare il metodo MakeWindowAssociation nell'oggetto factory associato alla catena di scambio HWND di destinazione. È possibile garantire che chiamando il metodo IDXGIObject::GetParent nella catena di scambio per individuare la factory. Ecco un esempio di codice per eseguire questa operazione.

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

Note per le app di Windows Store

Se un'app di Windows Store chiama MakeWindowAssociation, ha esito negativo con DXGI_ERROR_NOT_CURRENTLY_AVAILABLE.

Un'applicazione Microsoft Win32 può usare MakeWindowAssociation per controllare le transizioni a schermo intero tramite la combinazione di tasti ALT+INVIO e il comportamento dello schermo di stampa per lo schermo intero. Per le app di Windows Store, poiché DXGI non può eseguire transizioni a schermo intero, un'app di Windows Store non ha modo di controllare le transizioni a schermo intero.

Requisiti

   
Piattaforma di destinazione Windows
Intestazione dxgi.h
Libreria DXGI.lib

Vedi anche

Interfacce DXGI

IDXGIFactory