Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用图形在WinForms控件的左上角绘制矩形时,会在矩形的左上角剪切一个像素_C#_.net_Winforms_Drawing_Gdi+ - Fatal编程技术网

C# 使用图形在WinForms控件的左上角绘制矩形时,会在矩形的左上角剪切一个像素

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)处绘制矩形来

我有一个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)处绘制矩形来纠正这一点,但根据我从位于(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),画笔)验证轮廓是否在边界内并根据需要进行更正。