c# - System.Drawing.Graphics.DrawRectangle 绘制比指定大 1px 的矩形

标签 c# winforms graphics gdi+ gdi

这里的代码非常简单...只是在 OnPaint 例程中为 Form 绘制应该是 64x64 的矩形:

protected override void OnPaint(PaintEventArgs e)
{
    base.OnPaint(e);
    e.Graphics.DrawRectangle(Pens.Black, new Rectangle(32, 32, 64, 64));
}

我截取了以下屏幕截图,并测量了 65x65 的正方形。

enter image description here

只是想知道是什么导致额外的 1px 宽度/高度,以及如何解决?

编辑...

我知道我可以使用 Rectangle.Inflate(-1, -1) 修复...更重要的是,我想知道为什么 GDI/GDI+ 渲染矩形 1px 宽/高指定,并在此上下文中给出使用 Inflate 修复的原因。

最佳答案

每个边框边缘的中心绘制在矩形实际边缘的左侧或下方。对于单像素边框,顶部边缘和底部边缘绘制在矩形的实际边缘下方。如果您在表单顶部绘制这样一个矩形,则该矩形的顶部为 0,顶部边缘绘制在 0 像素和 1 像素之间的空间中。如果该矩形的高度为 64 像素,则 Bottom 为 64,底部边缘绘制在 64 像素和 65 像素之间。如果将笔的粗细设置为 2,那么您会发现底边的另一半绘制在 63 到 64 像素之间。垂直边缘也是如此,即第一个奇数像素向右绘制,偶数向左绘制。

关于c# - System.Drawing.Graphics.DrawRectangle 绘制比指定大 1px 的矩形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26201289/

相关文章:

c# - 如何获取您的 PING 并将其贴在标签上

c++ - 为什么重启原语需要发送十六进制索引? OpenGL

javascript - Canvas 自动像素混合/过渡功能

c# - Windows 窗体中的提示对话框

c# - 套接字只读取断点设置

c++ - 绘图圆,OpenGL 风格

c# - 如何找到 Id 属性或与导航属性相关的属性?

c# - 如何使用 DateTime.Today 与 TextBox.Text 的比较验证器?

c# - 捕获网络响应流

c# - 如何使用 FastMember 设置嵌套属性值