.NET 使用 GDI+ 绘制带轮廓线
.NET draw line with outline using GDI+
我将 .NET 用于桌面应用程序。
我正在绘制一些带有大写字母开头和结尾的线条,以将它们用作箭头,使用 Graphics.DrawLine 和合适的笔,宽度(假设为 8 像素)。
现在我想要实现的是用其他颜色向这条线添加一个 "outline",宽度为 1 或 2 像素。
我找不到使用 GDI+ 执行此操作的选项(如果有此选项,也许它在 "gdiplus.dll" 中,我可以使用 dllimport 导入它)。
我的第一次尝试是用更粗的笔先画同一条线,但效果并不像你想象的那样适合箭头末端。
有什么想法吗?
更新: 这是我第一次尝试画两条线的图像,一条在另一条之上:
这个答案有点晚了,但我有一个效果更好的,不完美但更好
用不同的偏移量画 4 次箭头,然后像这样在上面画主要的箭头
Using bigArrow As New Drawing2D.AdjustableArrowCap(5, 5)
' Shadow
Using objPen As New Pen(Color.Black, 5)
objPen.CustomEndCap = bigArrow
gr.DrawLine(objPen, 50 - 2, 50 - 2, 100 - 2, 100 - 2)
gr.DrawLine(objPen, 50 + 2, 50 - 2, 100 + 2, 100 - 2)
gr.DrawLine(objPen, 50 + 2, 50 + 2, 100 + 2, 100 + 2)
gr.DrawLine(objPen, 50 - 2, 50 + 2, 100 - 2, 100 + 2)
End Using
' Line
Using objPen As New Pen(Color.CornflowerBlue, 5)
objPen.CustomEndCap = bigArrow
gr.DrawLine(objPen, 50, 50, 100, 100)
End using
End Using
它错过了角落,但还不错
经过多次试验,我终于明白了
使用 GraphicsPath 和加宽命令,
另一个技巧是加宽也将线加宽到它伸出端盖箭头的位置,因此在端盖上也使用 WidthScale,然后只需减小端盖的大小
Using bigArrow As New Drawing2D.AdjustableArrowCap(3, 3)
bigArrow.WidthScale = 1.5
Using objPen As New Pen(Color.Black, 10)
objPen.CustomEndCap = bigArrow
Using objPath As New Drawing2D.GraphicsPath
objPath.AddLine(50, 50, 100, 100)
Using objWidenPen As New Pen(Color.Empty, 10)
objWidenPen.CustomEndCap = bigArrow
objPath.Widen(objWidenPen)
End Using
gr.DrawPath(objPen, objPath)
End Using
End Using
Using objPen As New Pen(Color.CornflowerBlue, 10)
objPen.CustomEndCap = bigArrow
gr.DrawLine(objPen, 50, 50, 100, 100)
End Using
End Using
结果看起来好多了
我将 .NET 用于桌面应用程序。
我正在绘制一些带有大写字母开头和结尾的线条,以将它们用作箭头,使用 Graphics.DrawLine 和合适的笔,宽度(假设为 8 像素)。
现在我想要实现的是用其他颜色向这条线添加一个 "outline",宽度为 1 或 2 像素。
我找不到使用 GDI+ 执行此操作的选项(如果有此选项,也许它在 "gdiplus.dll" 中,我可以使用 dllimport 导入它)。
我的第一次尝试是用更粗的笔先画同一条线,但效果并不像你想象的那样适合箭头末端。
有什么想法吗?
更新: 这是我第一次尝试画两条线的图像,一条在另一条之上:
这个答案有点晚了,但我有一个效果更好的,不完美但更好
用不同的偏移量画 4 次箭头,然后像这样在上面画主要的箭头
Using bigArrow As New Drawing2D.AdjustableArrowCap(5, 5)
' Shadow
Using objPen As New Pen(Color.Black, 5)
objPen.CustomEndCap = bigArrow
gr.DrawLine(objPen, 50 - 2, 50 - 2, 100 - 2, 100 - 2)
gr.DrawLine(objPen, 50 + 2, 50 - 2, 100 + 2, 100 - 2)
gr.DrawLine(objPen, 50 + 2, 50 + 2, 100 + 2, 100 + 2)
gr.DrawLine(objPen, 50 - 2, 50 + 2, 100 - 2, 100 + 2)
End Using
' Line
Using objPen As New Pen(Color.CornflowerBlue, 5)
objPen.CustomEndCap = bigArrow
gr.DrawLine(objPen, 50, 50, 100, 100)
End using
End Using
它错过了角落,但还不错
经过多次试验,我终于明白了
使用 GraphicsPath 和加宽命令, 另一个技巧是加宽也将线加宽到它伸出端盖箭头的位置,因此在端盖上也使用 WidthScale,然后只需减小端盖的大小
Using bigArrow As New Drawing2D.AdjustableArrowCap(3, 3)
bigArrow.WidthScale = 1.5
Using objPen As New Pen(Color.Black, 10)
objPen.CustomEndCap = bigArrow
Using objPath As New Drawing2D.GraphicsPath
objPath.AddLine(50, 50, 100, 100)
Using objWidenPen As New Pen(Color.Empty, 10)
objWidenPen.CustomEndCap = bigArrow
objPath.Widen(objWidenPen)
End Using
gr.DrawPath(objPen, objPath)
End Using
End Using
Using objPen As New Pen(Color.CornflowerBlue, 10)
objPen.CustomEndCap = bigArrow
gr.DrawLine(objPen, 50, 50, 100, 100)
End Using
End Using
结果看起来好多了