Control Panel\Appearance and Personalization\Display
'un "Tüm öğelerin boyutunu değiştir" kaydırıcısını Büyük'ye (bu kayıt defteri girdisini değiştirir: HKEY_CURRENT_USER\Control Panel\Desktop\DesktopDPIOverride
) ayarlamak, yanlış hesaplamak için Control.PointToScreen() yönteminin kullanılmasına neden olur. Bu bir Windows formu aşağıdaki Class1 kullanılarak yeniden olabilir:PointToScreen hatalı DesktopDPIOverride
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();
}
}
bir WinForm bu kumandanın kullanılması ve beklendiği gibi çalıştığını tıklayarak. Şimdi "Tüm öğelerin boyutunu değiştir" i "Büyük" olarak değiştirin ve kodu tekrar çalıştırın - kod beklendiği gibi çalışmıyor, PointToScreen yöntemi (0, 0) için hatalı bir değer döndürüyor.
Bu sorunu nasıl çözeceğini bilen var mı? Çok teşekkürler.
Çizim PaintEventArgs.ClipRectangle herhangi bir anlam ifade etmez. –
Aynı davranışı görüyorum. Herhangi bir çözüm bulabildin mi? – adv12
@HansPassant, ilginç bir "DrawReversibleFrame" çağrısıyla çizilen "Draw (e.ClipRectangle, e.Graphics)" değil, "Control.PointToScreen" sonuçlarının% 100 olmayan bir -DPI ekranında değil . Aynı davranışı gözlemledim: Otomatik ölçekleme etkin olduğunda PointToScreen bozuk görünüyor. Bu/düşüncelerle ilgili herhangi bir deneyiminiz var mı? – adv12