我目前正在尝试绘制一个简单的矩形,其大小和位置与表单大小有关。 我想我已经设法获得相对于表单大小的矩形的宽度和高度。但是,我似乎无法得到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 :(得分: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的内容,根本不需要根据表单大小的变化。所以他们不这样做并不奇怪。
在做这样的事情时要记住几件事,根据框架的大小在框架内缩放一些简单的对象:
在您提供的代码示例中,您违反了这两个准则。 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);
请注意,通过不是以绝对术语定义矩形,而是根据它们相对于表单的比例大小来定义矩形,那么很容易根据表单的当前大小计算实际位置和大小。
你可以使用你想要的任何比例。或者您可以定义确切的大小,但随后在表单的构造函数中,根据与初始表单大小相比的确切大小计算比例。