2017-08-26 43 views
0

我正在嘗試編寫一個程序,該程序將在透明背景上放置十字準線,但十字準線會總是以偏移量繪製,即使放置的座標是正確的。C#winforms無法在屏幕中間畫圖,即使使用正確的屏幕高度和寬度

其中提請十字線的方法:

public void drawSquareCrosshair(Graphics gfx, Color color) { 
     SolidBrush lightChrosshairColor = new SolidBrush(color); 
     SolidBrush transparentColor = new SolidBrush(Color.Fuchsia); 

     // Crosshair Bounds 
     int width = 20; 
     int height = 20; 
     int x = (SystemInformation.VirtualScreen.Width/2)- (width/2); 
     int y = (SystemInformation.VirtualScreen.Height/2) - (height/2); 


     Console.WriteLine("X: " + x); 
     Console.WriteLine("Y: " + y); 

     gfx.FillRectangle(lightChrosshairColor, x, y, width, height); 
    } 

的邏輯是,在屏幕的寬度除以二,並且由十字除以二的寬度minussed。高度也是一樣。我已經設置了圖形對象來在面板上創建圖形,該面板固定在窗體的所有面上,但面板的高度和寬度仍然是1920x1080,就像窗體一樣。我設置窗體的方式是通過使用form.FormBorderStyle = FormBorderStyle.None;form.WindowState = FormWindowState.Maximized;

但是,似乎並不是這樣,因爲十字準線仍然放置在類似於屏幕中間的座標上( X:960,1920:1080屏幕上的Y:540)。我創建了一個桌面背景,作爲Photoshop中屏幕中間的十字準線(圖像也是1920x1080)。以下是它的外觀: The square is the crosshair painted by my application, the red cross is the wallpaper

有沒有人遇到過這個問題?

回答

1

這可以通過將SystemInformation.VirtualScreen替換爲ClientRectangle來解決,請參閱下面的代碼。 ClientRectangle返回窗口的drawable的邊界。

 int x = (ClientRectangle.Width/2) - (width/2); 
     int y = (ClientRectangle.Height/2) - (height/2); 
+0

謝謝! 這工作完美無瑕,我很困惑。 –

+0

更準確的實現是'int x =(ClientRectangle.Width - width)/ 2;'爲了防止舍入錯誤(整數除法) –