WinForms Control.PointToScreen и экран высокого разрешения

Я рисую так называемую обратимую линию в приложении .NET Framework WinForms, используя такой код:

ControlPaint.DrawReversibleLine(
    PointToScreen(new Point(x, y1)),
    PointToScreen(new Point(x, y2)),
    Color.Black);

Если поддержка высокого разрешения не включен в приложении, и приложение запускается на экране с высоким разрешением, координаты x, y1 и y2 берутся из событий мыши, как если бы приложение работало на экране с разрешением 96 dpi из-за виртуализации dpi в Windows . Но когда я передаю эти числа в Control. PointToScreen(), она обрабатывает их с учетом реального разрешения экрана. В результате баллы, которые я получаю от PointToScreen, смещаются в левый верхний угол экрана на экранах 4K.

Есть ли простой способ решить эту проблему? Пожалуйста, примите во внимание современные многомониторные конфигурации, в которых каждый монитор может иметь свое разрешение.


person TecMan    schedule 04.06.2020    source источник
comment
Сделайте свое приложение DpiAware.   -  person Jimi    schedule 04.06.2020
comment
@Jimi, эта конструкция должна работать в обеих средах - когда включено или выключено распознавание точек на дюйм.   -  person TecMan    schedule 04.06.2020
comment
Какие окружения? Это ваше приложение объявляет себя DpiAware. Когда вы это сделаете, вы получите невиртуализированные меры. Если вы этого не сделаете, вы можете получить виртуализированные и невиртуализированные меры, в зависимости от того, какой метод/свойство вы вызываете/доступ. Не сложный выбор сделать...   -  person Jimi    schedule 04.06.2020
comment
@Jimi, на самом деле это элемент управления, используемый другими в формах WinForms. Поэтому я не могу контролировать, поддерживает ли окружающая «среда» (приложение) dpi или нет.   -  person TecMan    schedule 04.06.2020
comment
Начните отсюда: Определите, было ли масштабировано/виртуализировано приложение, не поддерживающее DPI. Это также может помочь: Использование SetWindowPos с несколькими мониторами. Ознакомьтесь с информацией о масштабировании DPI в смешанном режиме и DPI и аппаратно-независимых пикселях. Также обратите внимание, что вам на самом деле не нужен DrawReversibleLine, вы можете рисовать прямо на экране. И/или самостоятельно обрабатывать MapWindowPoints (функция PointToScreen() вызывает)   -  person Jimi    schedule 04.06.2020