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
.net GDI+;如何更改线条平滑模式?_.net_Vb.net_Graphics_Powerpacks - Fatal编程技术网

.net GDI+;如何更改线条平滑模式?

.net GDI+;如何更改线条平滑模式?,.net,vb.net,graphics,powerpacks,.net,Vb.net,Graphics,Powerpacks,是否可以更改电源组.LineShape平滑模式 我尝试使用此代码(继承LineShape)的类: 我总是有同样的结果,就像这样: ======= 编辑 更新了测试: Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs) Dim g As Graphics = e.Graphics Dim oldmode As SmoothingMode = g.SmoothingMo

是否可以更改
电源组.LineShape
平滑模式

我尝试使用此代码(继承
LineShape
)的类:

我总是有同样的结果,就像这样:

=======

编辑

更新了测试:

  Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
    Dim g As Graphics = e.Graphics

    Dim oldmode As SmoothingMode = g.SmoothingMode

    Using pen As New Pen(Color.Blue, 3)
      g.SmoothingMode = SmoothingMode.AntiAlias
      g.DrawLine(pen, X1, Y1, X2, Y2)
      g.SmoothingMode = SmoothingMode.None
      g.DrawLine(pen, X1 + 50, Y1, X2 + 50, Y2)
    End Using

    g.SmoothingMode = oldmode
    g.Flush()

    'MyBase.OnPaint(e)'
  End Sub
结果(不考虑标签和圆圈):


显然,平滑模式并没有被忽视……

平滑模式肯定会影响您的输出

以下是我最近使用的一些设置,用于以最小的质量损失调整图像的大小:

graphics.SmoothingMode = SmoothingMode.HighQuality;
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
插值模式可能与示例无关,但PixelOffsetMode可能与示例无关。让我启动一个快速测试应用程序

更新:这是一个快速测试应用程序,SmoothingMode肯定会影响我画的线条

private void Form1_Load(object sender, EventArgs e)
{
    foreach (var value in Enum.GetValues(typeof(SmoothingMode)))
    {
        _ComboBoxSmoothingMode.Items.Add(value);
    }

    foreach (var value in Enum.GetValues(typeof(PixelOffsetMode)))
    {
        _ComboBoxPixelOffsetMode.Items.Add(value);
    }

    _ComboBoxPixelOffsetMode.SelectedIndex = 0;
    _ComboBoxSmoothingMode.SelectedIndex = 0;
}

private void _ButtonDraw_Click(object sender, EventArgs e)
{
    using (Graphics g = _LabelDrawing.CreateGraphics())
    {
        g.Clear(Color.White);

        if (_ComboBoxPixelOffsetMode.SelectedItem != null && (PixelOffsetMode)_ComboBoxPixelOffsetMode.SelectedItem != PixelOffsetMode.Invalid)
        {
            g.PixelOffsetMode = (PixelOffsetMode)_ComboBoxPixelOffsetMode.SelectedItem;
        }

        if (_ComboBoxSmoothingMode.SelectedItem != null && (SmoothingMode)_ComboBoxSmoothingMode.SelectedItem != SmoothingMode.Invalid)
        {
            g.SmoothingMode = (SmoothingMode)_ComboBoxSmoothingMode.SelectedItem;
        }

        using (Pen pen = new Pen(Color.Blue, 3))
        {
            g.DrawLines(pen, new[] { new Point(0, 0), new Point(25, 50), new Point(_LabelDrawing.Width - 25, _LabelDrawing.Height - 50), new Point(_LabelDrawing.Width, _LabelDrawing.Height), });
        }
    }
}

从Reflector中可以看出,PowerPack LineShape组件使用容器原始绘制事件中的图形对象进行绘制。更改给定图形对象的属性可能会影响容器中根据图形绘制的所有其他内容


样本中包含哪些线型对象?(如果是自定义绘制的控件,是否在某个点创建位图?如何创建?)如果它们位于自定义控件内部且颜色深度较低,则可能是问题的根源。LineShape默认情况下在我的机器上绘制抗锯齿。

您的显示设置是什么?至少24位颜色

我可以确认,从LineShape派生类并像您显示的那样重写OnPaint实际上会影响预期的线渲染。我还可以确认Power Pack 3.0和Visual Studio 2010中的版本都在LineShape.DrawInternal方法中专门使用了AntiAlias

我从一个空白的.NET2.0Windows窗体应用程序开始。我添加了与您的类几乎相同的类,以及一个只包含ShapeContainer和对角线MyLine形状的表单

Imports Microsoft.VisualBasic.PowerPacks

Public Class MyLine
    Inherits LineShape

    Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)

        Dim g As Graphics = e.Graphics

        'g.SmoothingMode = SmoothingMode.AntiAlias '

        Using pen As New Pen(Color.Blue, 3)
            g.DrawLine(pen, X1, Y1, X2, Y2)
        End Using

        'MyBase.OnPaint(e) '

    End Sub

End Class
如果我按原样使用上述代码运行项目,则该行会出现别名(锯齿状)。如果取消对SmoothingMode设置的注释,则该行将变为抗锯齿(平滑)

所以它肯定会起作用。我知道这似乎是一个愚蠢的问题,但您是否检查过以确保您的代码在调试器中被命中?您是否尝试过在抽绳后立即调用Graphics.Flush()


另外,您使用的是哪个版本的PowerPack?正如我所说,我可以在Reflector中非常清楚地看到LineShape.DrawInternal在try/finally块中专门将SmoothingMode设置为AntiAlias。它会在返回之前恢复旧的平滑模式。但在您的示例中,您甚至不应该点击这个按钮,因为您没有调用基本方法。

问题是在我的开发模式中:通过虚拟PC上的远程桌面连接

在我的例子中,RDC没有考虑AntiAlias graphics属性

更多详情:


感谢大家的参与,很抱歉,这不是一个真正的.NET问题。

您是说该行没有消除锯齿吗?无论设置如何?+1:用于在引擎盖下挖掘,以了解PowerPack线型的实际用途。我在自定义面板上绘制线型。如何更改此面板的图形属性?如您所见,我覆盖了OnPaint,因此e.Graphics不是传递给的父图形吗?正如你从我的代码中看到的,我没有使用base.OnPaintI。我似乎发现了问题,请看这里:谢谢你,Cory。然而,我画的不是简单的线条,而是一个覆盖PowerPacks.LineShape-OnPaint的图形,这可能会产生影响。编辑阅读Morbo的评论。将尝试更改父对象。最后,我不明白的是,当我重写OnPaint并对自定义线完全不使用base.OnPaint逻辑时,平滑模式的更改对线条绘制有任何影响。@serhio:我不确定我是否理解。你是说如果你取消注释MyBase.OnPaint(e)的话,
SmoothingMode
会工作吗?SmoothingMode永远不会工作。我不能丢弃
线型
。它可以进行点击测试、鼠标悬停和重新绘制逻辑。谢谢,科里。第二次更新中的代码与我在示例中的代码几乎相同。我未提交MyBase.OnPaint(e),但没有看到线条表示法与该线条表示法之间的差异,因为我使用的是PowerPack-3.0的最新版本。我还对另一个特别创建的新项目进行了测试。。。AntiAlias正在那里工作。。。有点奇怪。我似乎发现了问题,请看这里:啊,是的,Vista之前远程桌面仅限于16位颜色。这样就可以了。最有可能的颜色深度是Vista和更高版本上的RDP,它肯定会反别名。区别在于Vista支持高颜色深度。 SmoothingMode: AntiAlias None
protected override void OnPaint(PaintEventArgs e)
{
    e.Graphichs.SmoothingMode = SmoothingMode.AntiAlias;
    base.OnPaint(e);
}
Imports Microsoft.VisualBasic.PowerPacks

Public Class MyLine
    Inherits LineShape

    Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)

        Dim g As Graphics = e.Graphics

        'g.SmoothingMode = SmoothingMode.AntiAlias '

        Using pen As New Pen(Color.Blue, 3)
            g.DrawLine(pen, X1, Y1, X2, Y2)
        End Using

        'MyBase.OnPaint(e) '

    End Sub

End Class