2016-02-17 1 views
7

У меня есть программа, которая была создана в 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 --------

Там вы еще две проблемы:

  1. Когда я переместить окно на монитор с различными DPI, размер окна изменяется, но высота его заголовка и размер шрифта заголовка не изменяются.
  2. Размер поля флажка не изменяется.

Я чувствую, что эти проблемы могут иметь какие-то связи, но я не могу понять это.

-------- SAD НОВОСТИ --------

Я скомпилировал "DPI Учебник Sample" Microsoft с VS2013, и она имеет ту же проблему.

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

+1

Ну, вы, как правило, не хотели. Те диалоги, которые вы используете, устарели. Для 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. Вернитесь к старым диалоговым окнам в операционных системах нижнего уровня. –

+0

BTW от VS2012 (или VS2010 не совсем уверен), CFileDialog автоматически использует Диалог Обычный Элемент без дополнительной работы. –

+0

@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; } ' –

ответ

0

Согласно MSDN окно, которое обрабатывает WM_DPICHANGED сообщение возвращает 0. Однако любое окно MFC или управления отправкой WM_DPICHANGED возвращает 0, так как Тэй вызова процедуры окна по умолчанию для неизвестных сообщений.

Следовательно, судя по тому, что какое-то окно обрабатывает сообщение WM_DPICHANGED, проверяя его LRESULT, возвращаемое значение против нуля неточно.

Строка заголовка окна для каждого приложения, поддерживающего DPI, не масштабируется при перемещении по различным мониторам DPI, как указано на MSDN. К сожалению, неклиентская область окна никогда не корректирует DPI.

Калькулятор и другие мониторы, предназначенные для каждого монитора, поддерживающие DPI, имеют пользовательский заголовок строки заголовка, как описано here.

1

Таблицу заголовка (панель заголовка) можно масштабировать, позвонив по номеру EnableNonClientDpiScaling, который доступен в версиях Windows> = Обновление для Windows 10 Anniversary Update (1607).

Если вы хотите масштабировать DPI старшего диалога, который не поддерживает за монитор DPI масштабирования можно использовать SetThreadDpiAwarenessContext (с DPI_AWARENESS_CONTEXT_SYSTEM_AWARE или DPI_AWARENESS_CONTEXT_UNAWARE), чтобы иметь окно верхнего уровня диалога масштабированного Windows. Диалог может быть размытым, но он, по крайней мере, будет правильно установлен (также доступен только для> = 1607 сборок Windows 10). Шаблон использования должен вызвать этот API, прежде чем открывать диалоговое окно, а затем восстанавливать предыдущий контекст DPI сразу после вызова API.

Смежные вопросы