Mam program, który został utworzony w VS2008 z MFC. Teraz zmodyfikowałem go tak, aby był "Per Monitor DPI-Aware" i prawie się skończył. Zmodyfikowałem manifest i obsłużyłem wiadomość WM_DPICHANGE. Ale jest jeszcze jeden problem:Tworzenie wspólnych okien dialogowych "Monitorowanie DPI" na poziomie
użyłem CFileDialog pokazać klasę Open/Save dialogi i wykorzystywane SHBrowseForFolder funkcję, aby wyświetlić okno wyboru folderu. Ale wszystkie te dialogi są "Per Monitor DPI-Aware", nie będą dostosowywać swojego interfejsu użytkownika, gdy przeniesiesz je pomiędzy monitorami o różnych ustawieniach DPI.
Używam spy ++ do monitorowania wiadomości z tych okien dialogowych, stwierdzam, że mogą odbierać wiadomość WM_DPICHANGED, ale po prostu jej nie obsługują.
I testowałem otwarte okno dialogowe w notepad.exe na Windows 10, działało idealnie.
Czy ktoś wie, w jaki sposób mogę utworzyć te okna dialogowe "Per Monitor DPI-Aware"?
-------- EDIT --------
Są tam jeszcze dwa problemy:
- Kiedy przenieść okno do monitora z różnymi DPI, okno zmienia rozmiar, ale wysokość paska tytułu i tytuł rozmiaru czcionki nie są zmieniane.
- Pole wyboru kontrolek "rozmiar skrzynki również się nie zmienia.
Uważam, że te problemy mogą mieć jakieś powiązania, ale nie mogę tego rozgryźć.
-------- smutna wiadomość --------
Skompilowałem "DPI Tutorial próbka" Microsoft z VS2013 i ma ten sam problem.
https://code.msdn.microsoft.com/DPI-Tutorial-sample-64134744
Cóż, normalnie byś tego nie zrobił. Te okna dialogowe, których używasz, są przestarzałe. W Open/Save/Browse for Folder użyjesz teraz [Common Item Dialog] (https://msdn.microsoft.com/en-us/library/windows/desktop/bb776913%28v=vs.85%29. aspx? f = 255 & MSPPError = -2147217396), w szczególności 'IFileOpenDialog'. Są one dostępne w systemie Windows Vista lub nowszym i powinny już być świadome DPI. Wróć do starszych okien dialogowych na niższym poziomie systemów operacyjnych. –
BTW od VS2012 (lub VS2010 nie do końca pewny), CFileDialog automatycznie korzysta z okna Common Item Dialog bez dodatkowej pracy. –
@Cody Gray Sprawdziłem kod w "mfc \ dlgfile.cpp", i stwierdziłem, że CFileDialog Calss użył IFileDialog, aby wyświetlić okno dialogowe. 'if (m_bVistaStyle == TRUE) { ApplyOFNToShellDialog(); HRESULT hr = (static_cast (m_pIFileDialog)) -> Show (m_ofn.hwndOwner); nResult = (hr == S_OK)? IDOK: IDCANCEL; } ' –