C# 使用图形在WinForms控件的左上角绘制矩形时,会在矩形的左上角剪切一个像素
我有一个WinForms项目,我试图在表单的左上角(0,0)处绘制一个矩形。出于某种原因,它会将矩形的高度和宽度减少一个像素。代码如下:C# 使用图形在WinForms控件的左上角绘制矩形时,会在矩形的左上角剪切一个像素,c#,.net,winforms,drawing,gdi+,C#,.net,Winforms,Drawing,Gdi+,我有一个WinForms项目,我试图在表单的左上角(0,0)处绘制一个矩形。出于某种原因,它会将矩形的高度和宽度减少一个像素。代码如下: private void Form1_Paint(object sender, PaintEventArgs e) { e.Graphics.DrawRectangle(new Pen(Color.Red, 5), new Rectangle(0, 0, 50, 50)); } 以下是为清晰起见放大的结果: 我知道我可以通过在(1,1)处绘制矩形来
private void Form1_Paint(object sender, PaintEventArgs e)
{
e.Graphics.DrawRectangle(new Pen(Color.Red, 5), new Rectangle(0, 0, 50, 50));
}
以下是为清晰起见放大的结果:
我知道我可以通过在(1,1)处绘制矩形来纠正这一点,但根据我从位于(0,0)和(1,1)处的控件中看到的情况,它不应该这样工作。例如,以下是面板在(1,1)处的外观,它显然有一个像素间距:
所以我的问题是:为什么在(0,0)处绘制矩形的行为与在(0,0)处放置控件的行为不同?为什么矩形在顶部和左侧被一个像素截断?笔的属性的默认值是对齐。居中
,这意味着绘制的线将居中于该线上方。所以你看到的是预期的
您可能需要将对齐设置为PenAlignment.Inset
:
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
e.Graphics.DrawRectangle(
new Pen(Color.Red, 5) { Alignment = PenAlignment.Inset },
new Rectangle(0, 0, 50, 50));
}
您可能还需要阅读备注:
Center
是此属性的默认值,并指定
笔的宽度以曲线或多边形的轮廓为中心。A.
此属性的Inset
值指定笔的宽度
位于曲线或多边形的轮廓内。其他三个价值观,
右侧
、左侧
和开头
将导致笔居中
它可能是3像素,而不是4像素。Reza Aghaei的建议是,如果需要在图形对象的边界内进行绘制,则通常会进行调整(也适用于GraphicsPath,因为它是提供画笔的图形对象)。您还可以将图形转换为钢笔尺寸的一半:e.Graphics.TranslateTransform(pen.Width/2,pen.Width/2)代码>。使用GraphicsPath,您可以使用bool outlineVisible=[GraphicsPath].IsOutlineVisible(新点(-1,-1),画笔)验证轮廓是否在边界内编码>并根据需要进行更正。