# crear un control con apariencia de dial C#



## Antia (Mar 7, 2010)

Hola:

Necesito crear un control de usuario con apariencia de dial en Microsoft Visual C# Express Edition, como se ven en una de las imágenes que adjunto. La verdad es que hasta hace unos días no tenía ni idea de C#, (y ahora no tengo mucha más), pero en una materia de tiempo real que estoy estudiando, nos exigen tener unas nociones de programación en este lenguaje.

El problema consiste en realizar un programa, que consta de 3 trackbar, cada una de las cuales maneja a la vez dos controles que son creados por el usuario: el depósito y el dial. El depósito nos lo dan hecho como ejemplo, y más o menos lo entendí..... pone un panel y un label, y luego maneja las propiedades etc. Pero es que para el dial..... uffffffffffff no consigo empezar; es que no cosigo ni dibujar los arcos ni el triangulito; creo que se hace con "DrawArc", pero he probado muchos códigos, y aunque no me dan errores ni nada, no me sale absolutamente nada, he puesto un panel y el último código que estoy probando es este:



```
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace AISA
{
public partial class Dial : UserControl
{
public Dial()
{
InitializeComponent();
}

private void Dial_Paint(object sender, PaintEventArgs e)
{

etiqueta.Text = String.Format("{0:N2}", Posicion);

int anchoTexto = (int)e.Graphics.MeasureString(etiqueta.Text, etiqueta.Font).Width;

etiqueta.Left = (Width - anchoTexto) / 2;

dibujaDial();

}

private void panel_Paint(object sender, PaintEventArgs e)
{

dibujaDial( );
}

private void dibujaDial()
{

Pen blackPen = new Pen(Color.Black, 3);
Rectangle rect = new Rectangle(0, 0, 100, 200);
float startAngle = 45.0F;
float sweepAngle = 270.0F;


Graphics g ;
g.DrawArc(Pen,rect,startAngle,sweepAngle) ; 
} 
}
}
}
```

seguramente hay cosas sin sentido, pero lo mío es como un método de prueba y error, porque no me entero mucho de como va esto..... Me he comprado un libro de C#, pero no trae mucho acerca de construir aplicaciones Windows Forms; va mas bien orientado a otros aspectos; me lo estoy leyendo, para coger las nociones del lenguaje, pero ..... no creo que me de tiempo de conseguir resolver esto.


Si alguien pudiese ayudarme a dibujar el dial, es decir del semiarco de colores y el puntero-triangulo, se lo agradecería muchisimo, porque a partir de ahí, podría seguir avanzando en el control, guiándome por el otro ejemplo del depósito; pero sin eso, no soy capaz de hacer nada.....


Muchas gracias de antemano.


Antía.


----------



## Antia (May 1, 2010)

Bien.....................  he conseguido avanzar bastante en el control.  Os pongo el código que define el control de usuario, y una foto para que veais el problema que tengo y que no sé como solucionar:  Lo que yo quería era tener en cada instante una sóla línea que apuntase al semicírculo, y eso lo que me hace es que para cada posición me dibuja una línea cada vez, y no borra las anteriores, con lo que al final tengo todo negro..... No sé si alguien prodrá ayudarme.....

Trozo de código en el que puede estar el error:


private void redibujaDial()
        {
            Graphics g = panel.CreateGraphics();
            // Crea un objeto gráfico asociado al panel

            iniX = panel.Width / 2;
            iniY = panel.Height;


            long_linea = panel.Height;

            Pen Lapiz = new Pen(Brushes.Black);
            Lapiz.Width = 1;



            g.DrawLine(Lapiz, iniX, iniY, finX, finY);
            g.Dispose(); //eliminamos el objeto para que no ocupe memoria.

        }


----------



## FRYCK (May 5, 2010)

Muy buen aporte *Antia*
saludos


----------



## Dr. Zoidberg (May 5, 2010)

Antia dijo:


> Bien.....................  he conseguido avanzar bastante en el control.  Os pongo el código que define el control de usuario, y una foto para que veais el problema que tengo y que no sé como solucionar:  Lo que yo quería era tener en cada instante una sóla línea que apuntase al semicírculo, y eso lo que me hace es que para cada posición me dibuja una línea cada vez, y no borra las anteriores, con lo que al final tengo todo negro..... No sé si alguien prodrá ayudarme.....
> 
> Trozo de código en el que puede estar el error:
> 
> ...



Y no las borra por que tu código no tiene previsto el borrado. Vas a tener que almacenar las coordenadas extremas de cada línea que dibujes, para luego redibujarla con el color de fondo antes de trazar una línea nueva. Si no incluyes eso en tu código, no vas a lograr lo que quieres...y en verdad es bastante simple de hacer, a menos que quieras una animación de alta velocidad usando la técnica del doble buffer, pero me parece excesivo para una aplicación tan sencilla...


----------

