2016-02-17 14 views
7

Ho un programma creato in VS2008 con MFC. Ora l'ho modificato per renderlo "Per Monitor DPI-Aware", ed è quasi finito. Ho modificato il manifest e gestito il messaggio WM_DPICHANGE. Ma c'è ancora un problema:Crea finestre di dialogo comuni "Per monitor DPI-aware"

ho usato CFileDialog classe per mostrare aprire/salvare le finestre di dialogo, e utilizzati SHBrowseForFolder funzione per mostrare finestra di selezione delle cartelle. Ma tutte queste finestre di dialogo sono NOT "Per monitor DPI-Aware", non modificheranno l'interfaccia utente quando le sposti tra monitor con impostazioni DPI diverse.

Io uso spy ++ per monitorare i messaggi di queste finestre di dialogo, trovo che possono ricevere il messaggio WM_DPICHANGED ma semplicemente non lo gestiscono.

E ho provato la finestra di dialogo del file aperto in notepad.exe su Windows 10, ha funzionato perfettamente.

Qualcuno sa come posso rendere queste finestre di dialogo "Per Monitor DPI-Aware"?

-------- -------- EDIT

Ci sono altri due problemi:

  1. Quando sposto una finestra su un monitor con diversa DPI, la finestra si ridimensiona, ma l'altezza della barra del titolo e la dimensione del font del titolo non vengono cambiate.
  2. La casella di controllo controlla la dimensione della casella non è stata modificata.

Ritengo che questi problemi possano avere qualche tipo di connessioni, ma non riesco a capirlo.

-------- triste notizia --------

ho compilato "DPI Tutorial campione" di Microsoft con VS2013, e ha lo stesso problema.

https://code.msdn.microsoft.com/DPI-Tutorial-sample-64134744

+1

Beh, di solito non lo faresti. Quelle finestre di dialogo che stai usando sono obsolete. Per Apri/Salva/Sfoglia per cartella, ora si utilizzerà il [Common Item Dialog] (https://msdn.microsoft.com/en-us/library/windows/desktop/bb776913%28v=vs.85%29. aspx? f = 255 & MSPPError = -2147217396), in particolare 'IFileOpenDialog'. Questi sono disponibili su Windows Vista e successivi e dovrebbero essere già a conoscenza DPI. Tornare alle vecchie finestre di dialogo su sistemi operativi di livello inferiore. –

+0

BTW da VS2012 (o VS2010 non proprio sicuro), CFileDialog utilizza automaticamente la finestra di dialogo Common Item senza alcun lavoro aggiuntivo. –

+0

@Cody Gray Ho controllato il codice in "mfc \ dlgfile.cpp", e ho trovato che CFileDialog calss ha usato IFileDialog per mostrare la finestra di dialogo. 'if (m_bVistaStyle == TRUE) { ApplyOFNToShellDialog(); HRESULT hr = (static_cast (m_pIFileDialog)) -> Mostra (m_ofn.hwndOwner); nResult = (hr == S_OK)? IDOK: IDCANCEL; } ' –

risposta

0

Secondo MSDN finestra che elabora WM_DPICHANGED messaggio dovrebbe restituire 0. Tuttavia, qualsiasi finestra MFC o il controllo di inviare WM_DPICHANGED restituirà 0, dal momento che thay chiamata la routine di finestra predefinita per i messaggi di sconosciuti.

Pertanto, a giudicare se una finestra elabora il messaggio WM_DPICHANGED testando il suo valore di ritorno LRESULT sullo zero non è accurato.

La barra del titolo della finestra di un'applicazione DPI sensibile per monitor non viene scalata quando si sposta su diversi monitor DPI come documentato su MSDN. Sfortunatamente, l'area non client della finestra non regola mai il DPI.

Calcolatrice e altre app native per DPI monitorate per Windows hanno il disegno della barra del titolo personalizzato, come descritto in here.

1

La barra del titolo (barra dei sottotitoli) può essere ridimensionata chiamando EnableNonClientDpiScaling disponibile nelle versioni di Windows> = Windows 10 Anniversary Update (1607).

Se si desidera dpi in scala di un dialogo più vecchio che non supporta per-monitor di DPI ridimensionamento è possibile utilizzare SetThreadDpiAwarenessContext (con DPI_AWARENESS_CONTEXT_SYSTEM_AWARE o DPI_AWARENESS_CONTEXT_UNAWARE) di avere le finestre di primo livello della finestra di scala da Windows. La finestra di dialogo potrebbe essere sfocata, ma verrà almeno ridimensionata correttamente (disponibile anche su> = 1607 build di Windows 10). Lo schema di utilizzo è chiamare questa API prima di aprire la finestra di dialogo e quindi ripristinare il precedente contesto DPI immediatamente dopo aver chiamato l'API.

Problemi correlati