2014-10-22 45 views
0

我目前正試圖繪製一個簡單的矩形,其大小和位置與表單大小有關。 我想我得到了相對於表單大小的矩形的寬度和高度。不過,我似乎無法得到x和y點來做同樣的事情。相對於表單大小繪製一個矩形

代碼:

using System; 
using System.Text; 
using System.Drawing;    
using System.Windows.Forms;   

public class DrawFill : Form  
{ 
    public DrawFill() 
    { 
     Size = new Size(500, 300); 
     Text = "Draw and Fill";    
     BackColor = Color.White; 
    } 
    protected override void OnPaint(PaintEventArgs e) 
    {  
     Graphics g = e.Graphics;     
     Pen blue = new Pen(Color.Blue, 3); 
     // Width is 100, Height is 50 
     g.DrawRectangle(blue, 10,20, (Width - 100)/3, (Height - 50)/3));  
     g.FillRectangle(Brushes.Red, 150, 20, (Width - 100)/3, (Height - 50)/3); 

     base.OnPaint(e); 
    } 

    public static void Main() 
    { 
     Application.Run(new DrawFill());  
    } 
} 

我每次放大兩個矩形相互重疊的形式,這讓我覺得在x,y,不按屏幕尺寸發生變化。有人能指引我走向正確的方向嗎?

+0

改爲使用ClientSize屬性。在Resize事件處理程序中調用Invalidate(),以便使用新大小重新繪製它。並在構造函數中將ResizeRedraw和DoubleBuffered屬性設置爲* true *。 – 2014-10-22 06:23:56

回答

0

首先,您確實沒有使調整大小事件發生時的窗體失效。所以這是您需要在代碼示例中修復的第一件事。這就是說,這樣做不會解決原來的問題。爲此,閱讀...

原來的問題讀,一部分:

我每次放大兩個矩形相互重疊的形式, 這讓我覺得x,y是不會根據屏幕尺寸 更改。

我的代碼示例中沒有看到任何更改x和y的內容,根本不必介意根據表單大小的更改。所以他們沒有感到驚訝。

幾件事情要記住做時,這樣的事情,縮放框架內的一些簡單的目的,根據幀的大小:

  • 您需要將相同的縮放應用的位置和大小都對象的
  • 你需要確保你擴展您對這些屬性以及(如-100和-50您應用於寬度和高度分別爲)

在代碼中的任何調整你給的例子,你違反了兩個f這些指導原則。 x和y位置永遠不會調整,並且您不會通過更改寬度和高度來縮放-100和-50(例如,如果將窗體調整到100像素寬以下,則矩形會完全消失,因爲它們是空的或者具有負寬度)。

如果您可以純粹根據其與表單的比例大小來定義矩形的大小,則所有邏輯都可以進入OnPaint()方法。否則,您需要根據表單的初始佈局保存值,以便稍後保留比例。

下面是OnPaint()方法的方法體的一個版本,可能會做你想要什麼:

Graphics g = e.Graphics;     
    Pen blue = new Pen(Color.Blue, 3); 

    // Original form size is (500,300) 
    // 
    // Rectangle Width is 100, Height is 50 
    // 1st Rectangle is at (10,20), 2nd is at (150,20) 
    // So proportionally, rect1 is (10/500, 20/300, 100/500, 50/300) 
    //  = (0.02, 0.0667, 0.2, 0.1667) 
    // and rect is (150/500, 20/300, 0.2, 0.1667) = (0.3, 0.0667, 0.2, 0.1667) 
    // 
    // note that the y, width, and height is the same for both rectangles 

    float rectWidth = 0.2f * Width, rectHeight = 0.1667f * Height, 
     x1 = 0.02f * Width, x2 = 0.3f * Width, y = 0.0667f * Height; 

    g.DrawRectangle(blue, x1, y, rectWidth, rectHeight); 
    g.FillRectangle(Brushes.Red, x2, y, rectWidth, rectHeight); 

    base.OnPaint(e); 

注意通過在絕對意義上沒有定義的矩形,而是相對的比例大小方面表單,那麼很容易根據表單的當前大小計算實際位置和大小。

你可以使用任何你想要的比例。或者,您可以定義確切的大小,但在表單的構造函數中,根據與初始表單大小相比的確切大小計算比例。

+0

感謝您的詳細解釋,給了我一個很好的理解。 – Dchau 2014-10-22 10:34:56

0

您確實在您的代碼中添加了X的不同值。它在第一行中爲10,在第二行中爲150。會是這個問題嗎?

但是,爲了確保X的值始終相同,爲什麼不爲他們創建一個變量?

像:

int x = 10; //Or whateverelse value you want 
int y = 20; 
int w = (Width - 100)/3; 
int h = (Height - 50)/3; 
g.DrawRectangle(Brushes.Blue, x, y, w, h); 
g.FillRectangle(Brushes.Red, x, y, w, h); 

我沒看到你貼有sintax錯誤代碼,以及在「((寬」

而且最終尖端的形式寬度和高度更大然後。在繪製區域(又名ClientSize)的ClientSize的形式是不包括形式的邊框,菜單和狀態欄的大小。在你的代碼中使用此。

我希望我所做的幫助。

+0

我想要實現的是,如果窗體大小從(500,300)變爲像(1000,500)之類的東西,那麼該矩形將改變它的大小和位置相對於窗體。 – Dchau 2014-10-22 05:52:05