У меня есть программа, которая была создана в VS2008 с MFC. Теперь я изменил его, чтобы сделать его «Per Monitor DPI-Aware», и это почти сделано. Я изменил манифест и обработал сообщение WM_DPICHANGE. Но есть еще одна проблема:Сделать общие диалоги Windows «За монитор DPI-Aware»
Я использовал CFileDialog класс, чтобы показать диалогах открытия/сохранения и используется SHBrowseForFolder функцию, чтобы показать диалоговое окно выбора папки. Но все эти диалоги NOT «На монитор DPI-Aware», они не будут настраивать свой интерфейс, когда вы перемещаете их между мониторами с разными настройками DPI.
Я использую spy ++ для мониторинга сообщений этих диалогов, я нахожу, что они могут получать сообщение WM_DPICHANGED, но они просто не обрабатывают его.
И я проверил диалоговое окно открытого файла в файле notepad.exe в Windows 10, он отлично работал.
Кто-нибудь знает, как я могу сделать эти диалоги «Per Monitor DPI-Aware»?
-------- EDIT --------
Там вы еще две проблемы:
- Когда я переместить окно на монитор с различными DPI, размер окна изменяется, но высота его заголовка и размер шрифта заголовка не изменяются.
- Размер поля флажка не изменяется.
Я чувствую, что эти проблемы могут иметь какие-то связи, но я не могу понять это.
-------- SAD НОВОСТИ --------
Я скомпилировал "DPI Учебник Sample" Microsoft с VS2013, и она имеет ту же проблему.
https://code.msdn.microsoft.com/DPI-Tutorial-sample-64134744
Ну, вы, как правило, не хотели. Те диалоги, которые вы используете, устарели. Для Open/Save/Browse for Folder вы теперь будете использовать диалоговое окно [Common Item Dialog] (https://msdn.microsoft.com/en-us/library/windows/desktop/bb776913%28v=vs.85%29. aspx? f = 255 & MSPPError = -2147217396), в частности 'IFileOpenDialog'. Они доступны в Windows Vista и более поздних версиях и уже должны быть осведомлены о DPI. Вернитесь к старым диалоговым окнам в операционных системах нижнего уровня. –
BTW от VS2012 (или VS2010 не совсем уверен), CFileDialog автоматически использует Диалог Обычный Элемент без дополнительной работы. –
@Cody Gray Я проверил код в «mfc \ dlgfile.cpp» и обнаружил, что CFileDialog calss использовали IFileDialog для отображения диалога. 'if (m_bVistaStyle == TRUE) { ApplyOFNToShellDialog(); HRESULT hr = (static_cast (m_pIFileDialog)) -> Показать (m_ofn.hwndOwner); nResult = (hr == S_OK)? IDOK: IDCANCEL; } ' –