Действительно ли возможно измениться PowerPacks.LineShape
smoothingMode?
Я пытался использовать этот код (класс, который наследовался LineShape
):
Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
Dim g As Graphics = e.Graphics
' no difference when changing the SmoothingMode '
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
У меня всегда есть тот же результат, как это: сопроводительный текст http://lh6.ggpht.com/_1TPOP7DzY1E/S3v1IbxlbCI/AAAAAAAADD4/q1Y9kP8wJ0g/s800/Capture2.png
=======
Править
обновленный тест:
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
Результат (не берут в маркировках соображения и кругах):
по-видимому режим сглаживания не является взятой невнимательностью...
Вопрос был в моем режиме разработки: через подключение к удаленному рабочему столу на виртуальном ПК.
В моем случае RDC не принимает во внимание графическое свойство AntiAlias.
подробнее: Были ли у вас проблемы при разработке на Virtual PC?
Спасибо всем за участие, извините, это не проблема .NET.
SmoothingMode определенно должен повлиять на ваш результат
Вот некоторые настройки, которые я недавно использовал для изменения размера изображения с минимальным качеством потеря:
graphics.SmoothingMode = SmoothingMode.HighQuality;
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
InterpolationMode, вероятно, не имеет отношения к вашему примеру, но 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), });
}
}
}
SmoothingMode: AntiAlias None
SmoothingMode.AntiAlias http://www.ccswe.com/temp/SmoothingMode_AntiAlias.png SmoothingMode.None http://www.ccswe.com/temp/SmoothingMode_None.png
Обновление: Как указал Морбо, если объект Graphics
, представленный вам в PaintEventArgs
, не является тем же объектом Graphics
, который в конечном итоге будет используется для отображения, то изменение сглаживания может не иметь никакого эффекта. Хотя я бы не ожидал такой резкой разницы, если бы это был объект Graphics
из памяти Image
или что-то в этом роде.
Хотел бы я предложить больше. Может быть, если бы я лучше понимал, что LineShape
давал вам, и ваши аргументы в пользу его использования вместо одного из методов Graphics.DrawLine ().
Причина, по которой я сомневаюсь в том, что вы используете LineShape
, заключается в том, что вы переопределяете его OnPaint и рисуете свою собственную линию.Похоже, вы могли бы упростить свое приложение и отказаться от LineShape
, но, возможно, я чего-то упускаю.
Обновление: Хорошо, тогда понятно, почему вы используете LineShape
. Единственное предложение, которое я могу предложить на этом этапе, - это переопределить OnPaint на вашей панели или LineShape, попробуйте установить там режим сглаживания перед вызовом базового события. Что-то вроде:
protected override void OnPaint(PaintEventArgs e)
{
e.Graphichs.SmoothingMode = SmoothingMode.AntiAlias;
base.OnPaint(e);
}
Насколько я могу судить в Reflector, компонент PowerPack LineShape рисует с использованием объекта Graphics из исходного события Paint контейнера. Изменение свойств предоставленного вам объекта Graphics может повлиять на все остальное в контейнере, который рисует после вашей формы.
Какие объекты LineShape содержатся в вашем примере? (Если это настраиваемый элемент управления, создаете ли вы в какой-то момент растровое изображение? Как?) Если они находятся внутри настраиваемого элемента управления с низкой глубиной цвета, это может быть источником проблемы. LineShape по умолчанию рисует сглаживание на моем компьютере.
Какие настройки отображения установлены? По крайней мере, 24-битный цвет?
Я могу подтвердить, что создание класса из LineShape и переопределение OnPaint, как вы показали , действительно влияет на рендеринг линии, как ожидалось. Я также могу подтвердить, что и Power Pack 3.0, и версия в Visual Studio 2010 специально используют AntiAlias в методе LineShape.DrawInternal.
Я начал с чистого приложения .NET 2.0 Windows Forms. Я добавил следующий класс, который почти идентичен вашему, и форму, которая содержит только 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 () сразу после DrawLine?
Кроме того, какую версию PowerPack вы используете? Как я уже сказал, я довольно ясно вижу в Reflector, что LineShape.DrawInternal специально устанавливает SmoothingMode на AntiAlias в блоке try / finally. Перед возвратом он восстанавливает старый режим сглаживания. Но в вашем примере вы никогда не должны даже нажимать на это, потому что вы не вызываете базовый метод.