2014-10-22 43 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