2010-02-17 6 views
6

¿Es posible cambiar PowerPacks.LineShape smoothingMode?GDI + ¿Cómo cambiar el Modo de suavizado de línea?

He intentado utilizar el código (una clase que hereda 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 

siempre tengo el mismo resultado, como esto: alt text http://lh6.ggpht.com/_1TPOP7DzY1E/S3v1IbxlbCI/AAAAAAAADD4/q1Y9kP8wJ0g/s800/Capture2.png

=======

EDITAR

actualizan la prueba:

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 

Resultado (no tomar en consideración las etiquetas y los círculos):

modo

alt text http://lh3.ggpht.com/_1TPOP7DzY1E/S447qYvTqzI/AAAAAAAADE8/eP3kCLqQJbk/s800/Capture2.png

parecer suavizado no se toma desconsideración ...

+0

¿Estás diciendo que la línea no tiene antialias? Independientemente de la configuración? – Finglas

+0

@Finglas: Sí. Exactamente. – serhio

Respuesta

0

La pregunta estaba en mi modo de desarrollo: a través de Conexión a Escritorio remoto en una PC virtual.

El RDC no tiene en cuenta en mi caso la propiedad de gráficos AntiAlias.

más detalles: Have you had problems developing on a Virtual PC?

Gracias a todos por participar, siento que es no era un problema realmente .NET.

+0

Es muy probable que la profundidad de color como RDP en Vista y hasta definitivamente antialias. La diferencia es que Vista admite una gran profundidad de color. – Josh

3

El SmoothingMode definitivamente debe afectar a su salida

Aquí hay algunos ajustes que utilicé recientemente para cambiar el tamaño de una imagen con mini Mal pérdida de calidad:

graphics.SmoothingMode = SmoothingMode.HighQuality; 
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; 
graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; 

El InterpolationMode probablemente no es relevante por su ejemplo, pero el PixelOffsetMode podría ser. Déjame girar una aplicación de prueba rápida.

Actualización: Aquí está la aplicación de prueba rápida, SmoothingMode definitivamente impacta las líneas que dibujo.

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

Actualización: Como Morbo señaló si el objeto Graphics presentado a usted en el PaintEventArgs no es lo mismo Graphics objeto que será en última instancia utilizado para la visualización y luego cambiar el suavizado podría no tener ningún efecto. Aunque no esperaría una diferencia tan drástica si ese fuera un objeto Graphics de una memoria Image o algo así.

Desearía poder ofrecer más. Tal vez si entendiera mejor lo que le estaba dando el LineShape y su razonamiento para usarlo simplemente usando uno de los métodos Graphics.DrawLine().

La razón por la que cuestiono su uso del LineShape es que está anulando su OnPaint y está dibujando su propia línea. Parece que podría simplificar su aplicación y abandonar el LineShape, pero tal vez me falta algo.


Actualización: Ok que tiene sentido por qué está utilizando el LineShape a continuación.La única sugerencia que puedo ofrecer en este momento es anular OnPaint en su panel o LineShape, intente configurar el modo de suavizado allí antes de llamar al evento base. Algo así como:

protected override void OnPaint(PaintEventArgs e) 
{ 
    e.Graphichs.SmoothingMode = SmoothingMode.AntiAlias; 
    base.OnPaint(e); 
} 
+0

gracias, Cory. Sin embargo, no dibujo líneas simples, sino que anula PowerPacks.LineShape OnPaint, tal vez esto tenga un impacto. Editar. Lee el comentario de Morbo. Intentará cambiar el padre. – serhio

+0

Finalmente, lo que no entiendo es qué cambio del modo de suavizado tiene algún efecto en el dibujo lineal, cuando anulo OnPaint y no uso la lógica base.OnPaint para mi línea personalizada. – serhio

+0

@serhio: No estoy seguro de entender. ¿Estás diciendo que si eliminas 'MyBase.OnPaint (e)' funciona el 'SmoothingMode'? –

2

De lo que puedo decir en el reflector, las pinturas de componentes PowerPack LineShape utilizando objeto Graphics del evento Paint original del contenedor. El cambio de propiedades en el objeto Graphics que se le da puede afectar a todo lo demás en el contenedor que se pinta después de su forma.

¿Cuáles son los objetos de LineShape incluidos en su muestra? (Si se trata de un control personalizado, ¿se crea un mapa de bits en algún momento? ¿Cómo?) Si están dentro de un control personalizado con poca profundidad de color, esa podría ser la fuente del problema. LineShape dibuja antialiased por defecto en mi máquina.

+0

+1: Para excavar debajo del capó para averiguar qué hace en realidad PowerPack LineShape. –

+0

Dibujé lineShapes en un panel personalizado. ¿Cómo cambio estas propiedades de dibujo del panel? Como puede ver, anulo OnPaint, por lo que e.Graphics no son los gráficos principales que se pasan a? Además, como puede ver en mi código, no uso base.OnPaint – serhio

+0

Parece que encontré el problema aquí: http://stackoverflow.com/questions/2370738/have-you-had-probelms-developping-on -a-virtual-pc – serhio

2

¿Cuáles son sus configuraciones de pantalla configuradas? Por lo menos 24 bits de color?

Puedo confirmar que derivar una clase de LineShape y reemplazar OnPaint como mostró hace de hecho afecta la representación de línea como se esperaba. También puedo confirmar que tanto Power Pack 3.0 como la versión en Visual Studio 2010 usan específicamente AntiAlias ​​en el método LineShape.DrawInternal.

Empecé con una aplicación .NET 2.0 Windows Forms en blanco. Agregué la siguiente clase, que es casi idéntica a la tuya y una forma que solo contiene ShapeContainer y una forma MyLine diagonal.

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 

Si corro el proyecto con el código anterior como está, la línea es alias (dentada). Si elimino el comentario de la configuración SmoothingMode, la línea se suaviza (suaviza).

Así que definitivamente debería funcionar. Sé que parece una pregunta tonta, pero ¿has revisado para asegurarte de que tu código reciba un golpe en el depurador? ¿Has intentado llamar a Graphics.Flush() inmediatamente después de tu DrawLine?

Además, ¿qué versión del PowerPack está utilizando? Como dije, puedo ver claramente en Reflector que LineShape.DrawInternal establece específicamente SmoothingMode en AntiAlias ​​en un bloque try/finally. Restaura el antiguo modo de suavizado antes de volver. Pero en su ejemplo, nunca debería golpear esto porque no está llamando al método base.

+0

Uso la última versión de PowerPack - 3.0. Hice una prueba también en otro proyecto nuevo especialmente creado ... AntiAlias ​​está trabajando allí ... algo extraño. – serhio

+1

Holala! Uso una conexión de escritorio remota ... y por eso. – serhio

+0

Parece que encontré el problema, vea aquí: http://stackoverflow.com/questions/2370738/have-you-had-probelms-developping-on-a-virtual-pc – serhio

Cuestiones relacionadas