Ответ 1
Похоже, вам нужно сделать это DPI. Вы можете сделать это так
[DllImport("user32.dll")]
private static extern bool SetProcessDPIAware();
static void Main()
{
SetProcessDPIAware();
}
Установка слайдера "Изменить размер всех элементов" в Control Panel\Appearance and Personalization\Display
на "Больше" (который изменяет эту запись в реестре: HKEY_CURRENT_USER\Control Panel\Desktop\DesktopDPIOverride
) приводит к ошибочному вычислению метода Control.PointToScreen(). Это можно воспроизвести, используя следующий класс 1 в форме 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).
Кто-нибудь знает, как решить эту проблему? Большое спасибо.
Похоже, вам нужно сделать это DPI. Вы можете сделать это так
[DllImport("user32.dll")]
private static extern bool SetProcessDPIAware();
static void Main()
{
SetProcessDPIAware();
}