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
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 |