Установка ползунка «Изменить размер всех элементов» Control Panel\Appearance and Personalization\Display
на «Больше» (который изменяет эту запись реестра: HKEY_CURRENT_USER\Control Panel\Desktop\DesktopDPIOverride
) приводит к неправильному расчету метода Control.PointToScreen(). Это можно воспроизвести, используя следующий класс Class1 в форме Windows:
public class Class1 : Control
{
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
Draw(e.ClipRectangle, e.Graphics);
}
private void Draw(Rectangle rect, Graphics graphics)
{
Pen pen = new Pen(Color.Red);
pen.Width = 2;
graphics.DrawRectangle(pen, rect);
}
protected override void OnMouseDown(MouseEventArgs e)
{
base.OnMouseDown(e);
Point p = this.PointToScreen(new Point(0, 0));
ControlPaint.DrawReversibleFrame(new Rectangle(p, new Size(e.X, e.Y)), Color.Yellow, FrameStyle.Dashed);
}
protected override void OnMouseUp(MouseEventArgs e)
{
base.OnMouseUp(e);
this.Invalidate();
}
}
Использование этого элемента управления в WinForm и нажатие на него работает должным образом. Теперь измените «Изменить размер всех элементов» на «Увеличить» и снова запустите код — код больше не работает должным образом, метод PointToScreen возвращает ошибочное значение для (0, 0).
Кто-нибудь знает, как решить эту проблему? Большое спасибо.
Draw(e.ClipRectangle, e.Graphics)
, а результатыControl.PointToScreen
на дисплее с разрешением не 100% DPI, как показано при вызовеDrawReversibleFrame
. Я наблюдал такое же поведение: PointToScreen кажется сломанным, когда действует автоматическое масштабирование. Есть ли опыт в этом/мысли? - person adv12   schedule 21.04.2016Control.PointToScreen
— это просто оболочка (источник ссылки) на MapWindowPoints API, вы фактически заявляете, что вся Windows сломана. - person Ivan Stoev   schedule 21.04.2016Class1
в основную форму. Измените настройки DPI дисплея на что-то выше 100%. Затем запустите проект и щелкните элемент управленияClass1
.Class1
создаст и нарисует прямоугольник, начиная с экранных координат, рассчитанных с помощьюControl.PointToScreen
из местоположения клиента (0, 0). Прямоугольник, нарисованный на экране, будет начинаться выше и левее элемента управленияClass1
. Мы утверждаем, что это происходит. Похоже на ошибку вControl.PointToScreen
, но я был бы рад рассмотреть другие теории. - person adv12   schedule 21.04.2016Control.PointToScreen
, необходимо масштабировать на 1,25, чтобы они отображались в нужном месте на экране. То же самое касается ширины и высоты прямоугольника экрана. - person adv12   schedule 21.04.2016MapWindowPoints
используется в каждом приложении Windows (управляемом, неуправляемом и т. д.). - person Ivan Stoev   schedule 21.04.2016ControlPaint()
, но используюGraphics.CopyFromScreen()
. Могу ли я предположить, что также используетGetDCEx()
? (Просто пытаюсь понять, как мы с ОП наткнулись на одно и то же поведение...) - person adv12   schedule 22.04.2016