绘制相对于表单大小的矩形

时间:2014-10-22 04:29:24

标签: c# drawing draw

我目前正在尝试绘制一个简单的矩形,其大小和位置与表单大小有关。 我想我已经设法获得相对于表单大小的矩形的宽度和高度。但是,我似乎无法得到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不会根据屏幕尺寸而改变。有人能指出我正确的方向。

2 个答案:

答案 0 :(得分: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错误的代码。

最后的提示。表格宽度和高度大于可绘制区域(a.k.a.ClientSize)。 ClientSize是表单的大小,不包括表单的边框,菜单和状态栏。在代码中使用它。

我希望我能帮到你。

答案 1 :(得分:0)

首先,当调整大小事件发生时,您不会使表单无效。这是您需要在代码示例中修复的第一件事。也就是说,这样做不会解决原来的问题。为此,请继续阅读......

原始问题的部分内容如下:

  

每当我放大表格时,两个矩形相互重叠,   这让我觉得x,y并没有根据而改变   屏幕尺寸。

我的代码示例中没有看到任何改变x和y的内容,根本不需要根据表单大小的变化。所以他们不这样做并不奇怪。

在做这样的事情时要记住几件事,根据框架的大小在框架内缩放一些简单的对象:

  • 您需要对对象的位置和大小应用相同的缩放
  • 您需要确保缩放对这些属性所做的任何调整(例如分别应用于宽度和高度的-100和-50)

在您提供的代码示例中,您违反了这两个准则。 x和y位置永远不会调整,并且您不会通过更改宽度和高度来缩放-100和-50(因此,例如,如果将Form调整为低于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);

请注意,通过不是以绝对术语定义矩形,而是根据它们相对于表单的比例大小来定义矩形,那么很容易根据表单的当前大小计算实际位置和大小。

你可以使用你想要的任何比例。或者您可以定义确切的大小,但随后在表单的构造函数中,根据与初始表单大小相比的确切大小计算比例。