是否可以将表单配置为一个固定的坐标范围,而不管其大小?
Can a form be configured to a fixed coordinate range regardless of its size?
我正在使用 System.Drawing 中的 类 在表单上做一些基本绘图(使用 C# 编码,针对 .NET 4.7.2)。
我想配置表单,无论表单大小如何,客户区的坐标范围都是(0, 0) 到(100, 100)。换句话说,如果我们最大化表格,右下角的坐标应该仍然是(100, 100)。
无需滚动我自己的缩放函数就可以做到这一点吗?
您可以使用 Graphics.ScaleTransform()
。
这是一个设置缩放比例的示例,使得 window 坐标的宽度和高度从 0 到 100。请注意,只要 window 大小发生变化,您就必须重新绘制并重新计算变换:
using System.Drawing;
using System.Windows.Forms;
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
public Form1()
{
this.ResizeRedraw = true;
InitializeComponent();
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
setScaling(e.Graphics);
e.Graphics.DrawRectangle(Pens.Black, 5, 5, 90, 90); // Draw rectangle close to the edges.
}
void setScaling(Graphics g)
{
const float WIDTH = 100;
const float HEIGHT = 100;
g.ScaleTransform(ClientRectangle.Width/WIDTH, ClientRectangle.Height/HEIGHT);
}
}
}
这不考虑 window 的纵横比,因此即使您绘制的是正方形,如果 window 不是正方形,它也会显示为矩形。
如果要保持正方形纵横比,也可以通过计算 TranslateTransform()
来实现。请注意,这会在顶部+底部或左侧+右侧引入空白区域,具体取决于 window:
的纵横比
void setScaling(Graphics g)
{
const double WIDTH = 100;
const double HEIGHT = 100;
double targetAspectRatio = WIDTH / HEIGHT;
double actualAspectRatio = ClientRectangle.Width / (double)ClientRectangle.Height;
double h = ClientRectangle.Height;
double w = ClientRectangle.Width;
if (actualAspectRatio > targetAspectRatio)
{
w = h * targetAspectRatio;
double x = (ClientRectangle.Width - w) / 2;
g.TranslateTransform((float)x, 0);
}
else
{
h = w / targetAspectRatio;
double y = (ClientRectangle.Height - h) / 2;
g.TranslateTransform(0, (float)y);
}
g.ScaleTransform((float)(w / WIDTH), (float)(h / HEIGHT));
}
我正在使用 System.Drawing 中的 类 在表单上做一些基本绘图(使用 C# 编码,针对 .NET 4.7.2)。
我想配置表单,无论表单大小如何,客户区的坐标范围都是(0, 0) 到(100, 100)。换句话说,如果我们最大化表格,右下角的坐标应该仍然是(100, 100)。
无需滚动我自己的缩放函数就可以做到这一点吗?
您可以使用 Graphics.ScaleTransform()
。
这是一个设置缩放比例的示例,使得 window 坐标的宽度和高度从 0 到 100。请注意,只要 window 大小发生变化,您就必须重新绘制并重新计算变换:
using System.Drawing;
using System.Windows.Forms;
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
public Form1()
{
this.ResizeRedraw = true;
InitializeComponent();
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
setScaling(e.Graphics);
e.Graphics.DrawRectangle(Pens.Black, 5, 5, 90, 90); // Draw rectangle close to the edges.
}
void setScaling(Graphics g)
{
const float WIDTH = 100;
const float HEIGHT = 100;
g.ScaleTransform(ClientRectangle.Width/WIDTH, ClientRectangle.Height/HEIGHT);
}
}
}
这不考虑 window 的纵横比,因此即使您绘制的是正方形,如果 window 不是正方形,它也会显示为矩形。
如果要保持正方形纵横比,也可以通过计算 TranslateTransform()
来实现。请注意,这会在顶部+底部或左侧+右侧引入空白区域,具体取决于 window:
void setScaling(Graphics g)
{
const double WIDTH = 100;
const double HEIGHT = 100;
double targetAspectRatio = WIDTH / HEIGHT;
double actualAspectRatio = ClientRectangle.Width / (double)ClientRectangle.Height;
double h = ClientRectangle.Height;
double w = ClientRectangle.Width;
if (actualAspectRatio > targetAspectRatio)
{
w = h * targetAspectRatio;
double x = (ClientRectangle.Width - w) / 2;
g.TranslateTransform((float)x, 0);
}
else
{
h = w / targetAspectRatio;
double y = (ClientRectangle.Height - h) / 2;
g.TranslateTransform(0, (float)y);
}
g.ScaleTransform((float)(w / WIDTH), (float)(h / HEIGHT));
}