2014-07-01 12 views
15

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.

+2

Çizim PaintEventArgs.ClipRectangle herhangi bir anlam ifade etmez. –

+0

Aynı davranışı görüyorum. Herhangi bir çözüm bulabildin mi? – adv12

+0

@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

cevap

1

Bunu yapmak için yapmanız gerekenler gibi. Bunu,