0

问候;

我在正确实例化 System.Drawing.Point 实例数组,然后在 WinForms 应用程序中使用 IronPython 将点数组添加到 GDI+ GraphicsPath 实例时遇到了一些麻烦。以下代码在 SharpDevelop 3.2 和 IronPython 2.6 下正确编译或构建:

import System.Drawing
import System.Drawing.Drawing2D 
import System.Windows.Forms

from System import Array 
from System.Drawing import Pen, Point
from System.Drawing.Drawing2D import GraphicsPath, CustomLineCap
from System.Windows.Forms import *

class MainForm(Form):
    def __init__(self):
        self.InitializeComponent()

    def InitializeComponent(self):
        self.SuspendLayout()
        # 
        # MainForm
        # 
        self.ClientSize = System.Drawing.Size(284, 264)
        self.Name = "MainForm"
        self.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen
        self.Text = "GDI Lines"
        self.Paint += self.MainFormPaint
        self.ResumeLayout(False)

    def MainFormPaint(self, sender, e):
        graphicContext = e.Graphics
        bluePen = Pen(Color.Blue, 1)

        points = Array.CreateInstance(Point, 9)
        points[0] = Point(10, 10)
        points[1] = Point(15, 10)
        points[2] = Point(20, 15)
        points[3] = Point(20, 20)
        points[4] = Point(15, 25)
        points[5] = Point(10, 25)
        points[6] = Point(5, 20)
        points[7] = Point(5, 15)
        points[8] = Point(10, 10)

        graphicsPath = GraphicsPath()
        graphicsPath.AddLines(points)
        graphicContext.SmoothingMode = SmoothingMode.AntiAlias

        lineCap = CustomLineCap(nil, graphicsPath)
        lineCap.BaseInset = 0
        lineCap.WidthScale = 1
        lineCap.StrokeJoin = LineJoin.Miter

        bluePen.CustomStartCap = lineCap
        bluePen.CustomEndCap = lineCap

        graphicContext.DrawLine(bluePen, 50, 150, 200, 150)
        graphicContext.DrawLine(bluePen, 150, 50, 150, 200)

        lineCap.Dispose()
        graphicsPath.Dispose()
        bluePen.Dispose()

根据上面的代码,我希望看到两条垂直的蓝线,每条线的末端都有一个小椭圆。使用上面的当前 scipting 代码,绘制了 GDI+ 运行时错误红色 X。我错过了什么或做错了什么?此外,是否有更简单或更简洁的方法来实例化 System.Drawing.Point 值的数组?

提前感谢您的时间和帮助...

4

1 回答 1

1

平心而论,我必须说我没有“回答我自己的问题”或自己解决这个问题,但能够从 Matt Ward 和 Michael Foord 那里得到外部帮助。我最诚挚地感谢 Matt 和 Michael 所付出的时间、帮助和耐心,我非常感谢他们回复他们的更正。

使 MainForm.py 脚本无法运行的主要问题是我遗漏了从 System.Drawing 命名空间导入 Color 类,以及从 System.Drawing.Drawing2D 命名空间导入 SmoothingMode 和 LineJoin 枚举。尽管我的脚本没有直接实例化任何其他枚举或类,但它们仍然必须由 .NET DLR 从它们各自的程序集中加载和引用,以使它们在我的脚本中可访问和可用。(注意:再次感谢马特向我指出这一点;如果解释中有任何错误,它们是我的,而不是马特的。)

GDI+ Point 实例的原始 Array 实例化是正确的,但更简洁的方法显示在下面的更正脚本中。(注意:再次感谢 Michael 指出 Array 实例化的替代方案。)

更正且有效的 MainForm.py 脚本如下:

import System.Drawing
import System.Drawing.Drawing2D 
import System.Windows.Forms

from System import Array 
from System.Drawing import Pen, Point, Color
from System.Drawing.Drawing2D import GraphicsPath, CustomLineCap, SmoothingMode, LineJoin
from System.Windows.Forms import *

class MainForm(Form):
    def __init__(self):
        self.InitializeComponent()

    def InitializeComponent(self):
        self.SuspendLayout()
        # 
        # MainForm
        # 
        self.ClientSize = System.Drawing.Size(284, 264)
        self.Name = "MainForm"
        self.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen
        self.Text = "GDI+ CustomLineCaps"
        self.Paint += self.MainFormPaint
        self.ResumeLayout(False)

    def MainFormPaint(self, sender, e):
        graphics = e.Graphics
        bluePen = Pen(Color.Blue, 1)

        points = Array[Point] \
        ((Point(10, 10), Point(15, 10), Point(20, 15), \
          Point(20, 20), Point(15, 25), Point(10, 25), \
          Point(5, 20),  Point(5, 15),  Point(10, 10)))

        graphicsPath = GraphicsPath()
        graphicsPath.AddLines(points)
        graphics.SmoothingMode = SmoothingMode.AntiAlias 

        lineCap = CustomLineCap(None, graphicsPath)
        lineCap.BaseInset = 0
        lineCap.WidthScale = 1
        lineCap.StrokeJoin = LineJoin.Miter 

        bluePen.CustomStartCap = lineCap
        bluePen.CustomEndCap = lineCap

        graphics.DrawLine(bluePen, 50, 150, 200, 150)
        graphics.DrawLine(bluePen, 150, 50, 150, 200)

        lineCap.Dispose()
        graphicsPath.Dispose()
        bluePen.Dispose()
于 2010-06-20T23:28:11.397 回答