Bueno antes que nada saludos a todos!, siempre he buscado y conseguido mucho software e informacion valiosa en este sitio, hasta he llegado a usarlo como metatag de busqueda en google!. Asi que creo que es tiempo de que les devuelva un poco lo que tanto me dieron. En fin, soy desarrollador de software, tengo 18 años y recien ingreso en el mercado laboral de IT, y en 1 semana empiezo la facultad!, empezando mi carrera de ing en sistemas.
Bueno voy a dejar de aburrirlos e ir al grano, como desarrollador creo que puedo contribuir en algo muy importante y de lo cual tengo experiencia, el campo de la programacion.
Asi que he decidido realizar mi primer post con codigo y explicacion sobre el componente activeX de microsoft, incluido en el .NET Framework 2.0, axMsChart:
Agregar la referencia:
Primero que nada vamos a empezar agregando la referencia a la dll del componente activeX, para ello en el visual studio, yo utilizo visual c# 2005 con sp1 (by the way: VB x sucks, es una abominacion para la programacion, sin ofender..), nos dirigimos a:
Project - Add reference - Pestaña COM - y seleccionamos Microsoft Chart Control 6(OLEDB)
Para agregar el componente a nuestro formulario nos dirijimos a:
toolBox - All windows Forms - Microsoft chart control, lo podemos "insertar" en nuestro formulario con un simple drag&drop
Luego de finalizado esto ya tendremos nuestro control en el formulario, ahora podemos insertar datos y modificarlo a nuestro antojo.
A continuacion les dejo un par de metodos que se pueden implementar para darle fluidez y comportamiento al mismo:
Agregar una serie:
El codigo vale mas que mil palabras

private class listType
{
public string dataName;
public double data;
public listType(string _dataName, double _data)
{
dataName = _dataName;
data = _data;
}
}
{
//Datos que agregaremos para graficar.
List<listType> listaRiesgos = new List<listType>();
listType item1 = new listType("progresiva-1", 1.1);
listType item2 = new listType("progresiva-2", 11.6);
listType item3 = new listType("progresiva-3", 6.86);
listType item4 = new listType("progresiva-4", 9.12);
listaRiesgos.Add(item1);
listaRiesgos.Add(item2);
listaRiesgos.Add(item3);
listaRiesgos.Add(item4);
Object[,] data = new Object[listaRiesgos.Count + 1, 2];
data[0, 0] = null;
data[0, 1] = "Puntos";
for (int x = 0; x < listaRiesgos.Count; x++)
{
data[x, 0] = listaRiesgos[x].dataName;
data[x, 1] = listaRiesgos[x].data;
if (x == 0)
{
axMSChart1.TitleText = listaRiesgos[x].dataName;
}
}
axMSChart1.ChartData = data;
// Valores de visibilidad
axMSChart1.Legend.Location.LocationType = MSChart20Lib.VtChLocationType.VtChLocationTypeRight;
axMSChart1.Legend.Location.Visible = true;
//Agregamos los titulos a los ejes.
axMSChart1.Plot.get_Axis(MSChart20Lib.VtChAxisId.VtChAxisIdX, null).AxisTitle.Text = "Progresiva";
axMSChart1.Plot.get_Axis(MSChart20Lib.VtChAxisId.VtChAxisIdY, null).AxisTitle.Text = "Puntos";
}
Exportar nuestro grafico a un bitmap(.bmp):
Primero que nada debemos agregar una clausula using para agregar la clase que se encarga de manejar las api de windows, ya que con ella manejaremos el clipboard de windows para exportar la imagen.
Entonces:
using System.Runtime.InteropServices;
Luego agregamos al espacio de nombres de nuestro proyecto, la siguiente clase que manejara el clipboard, la encapsulacion la pueden manejar ustedes a su gusto:
private class Win32ClipboardAPI
{
public const uint CF_BITMAP = 2;
[DllImport("user32.dll"
]
public static extern bool OpenClipboard(IntPtr hWndNewOwner);
[DllImport("user32.dll"
]
public static extern IntPtr GetClipboardData(uint uFormat);
[DllImport("user32.dll"
]
public static extern bool CloseClipboard();
[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true) ]
public static extern bool IsClipboardFormatAvailable(uint format);
}
Exelente!, una ves realizado esto ya podemos utilizar estos metodos para manejar el clipboard!!
Ahora al metodo en si!:
private void exportChartAsBitmap(string _path)
{
//copiamos el chart al clipboard
axMSChart1.EditCopy();
Application.DoEvents();
//Abrimos el clipBoard de windows
if (Win32ClipboardAPI.OpenClipboard(IntPtr.Zero))
{
//si se reconoce el bitmap
if (Win32ClipboardAPI.IsClipboardFormatAvailable(Win32ClipboardAPI.CF_BITMAP))
{
//obtenemos el puntero al bitmap en la pila de la memoria
IntPtr bmptr = Win32ClipboardAPI.GetClipboardData(Win32ClipboardAPI.CF_BITMAP);
if (bmptr != IntPtr.Zero)
{
//guardamos el bitmap
Bitmap chartCapture = Bitmap.FromHbitmap(bmptr);
chartCapture.Save(_path);
//limpiamos
chartCapture.Dispose();
}
}
//Cerramos el clipboard y libreramos los recursos utilizados
Win32ClipboardAPI.CloseClipboard();
}
y listo ! ya esta exportado nuestro chart como imagen!
cambiar el color de una serie:
DialogResult result = colorDialog1.ShowDialog();
if (result == DialogResult.OK)
{
axMSChart1.Plot.SeriesCollection[1].DataPoints[-1].Brush.FillColor.Blue = colorDialog1.Color.B;
axMSChart1.Plot.SeriesCollection[1].DataPoints[-1].Brush.FillColor.Red = colorDialog1.Color.R;
axMSChart1.Plot.SeriesCollection[1].DataPoints[-1].Brush.FillColor.Green = colorDialog1.Color.G;
}
Imprimir el chart:
Tambien podemos imprimir nuestro chart, esto ya es mas facil, lo unico que hacemos es registrar un evento al printPage a una instancia del objeto printDocument. Seria algo asi:
private void button1_Click(object sender, EventArgs e)
{
PrintDocument document = new PrintDocument();
document.PrintPage += this.document_PrintPage;
PrintDialog dlgSettings = new PrintDialog();
dlgSettings.Document = document;
if (dlgSettings.ShowDialog() == DialogResult.OK)
{
document.Print();
}
}
private void document_PrintPage(object sender, PrintPageEventArgs e)
{
exportChartAsBitmap(@"c:\temp.bmp"
;
Font font = new Font("Arial", 30);
float x = e.MarginBounds.Left;
float y = e.MarginBounds.Top;
float lineHeight = font.GetHeight(e.Graphics);
e.Graphics.DrawString("Nombre del grafico", font, Brushes.Black, x, 0);
y += lineHeight;
e.Graphics.DrawImage(Image.FromFile(@"c:\temp.bmp"
, x, y);
}
Liberar archivo temp.bmp:
Luego, no es mal habito limpiar los recursos que no utilizemos, podriamos hacer en el metodo onClose del formulario principal algo asi como
if (File.Exists(@"c:\temp.bmp"
)
{
File.Delete(@"c:\temp.bmp"
;
}
Y eso es todo, son algunas de las cosas que les podrian llegar a hacer falta a la hora de trabajar con charts desde .NET sin pagar algun componente privativo ni usar componentes third-party.
Hasta luegoo !!
Slds Rivas Ignacio.
Software Developer.
Bueno voy a dejar de aburrirlos e ir al grano, como desarrollador creo que puedo contribuir en algo muy importante y de lo cual tengo experiencia, el campo de la programacion.
Asi que he decidido realizar mi primer post con codigo y explicacion sobre el componente activeX de microsoft, incluido en el .NET Framework 2.0, axMsChart:
Agregar la referencia:
Primero que nada vamos a empezar agregando la referencia a la dll del componente activeX, para ello en el visual studio, yo utilizo visual c# 2005 con sp1 (by the way: VB x sucks, es una abominacion para la programacion, sin ofender..), nos dirigimos a:
Project - Add reference - Pestaña COM - y seleccionamos Microsoft Chart Control 6(OLEDB)
Para agregar el componente a nuestro formulario nos dirijimos a:
toolBox - All windows Forms - Microsoft chart control, lo podemos "insertar" en nuestro formulario con un simple drag&drop
Luego de finalizado esto ya tendremos nuestro control en el formulario, ahora podemos insertar datos y modificarlo a nuestro antojo.
A continuacion les dejo un par de metodos que se pueden implementar para darle fluidez y comportamiento al mismo:
Agregar una serie:
El codigo vale mas que mil palabras


private class listType
{
public string dataName;
public double data;
public listType(string _dataName, double _data)
{
dataName = _dataName;
data = _data;
}
}
{
//Datos que agregaremos para graficar.
List<listType> listaRiesgos = new List<listType>();
listType item1 = new listType("progresiva-1", 1.1);
listType item2 = new listType("progresiva-2", 11.6);
listType item3 = new listType("progresiva-3", 6.86);
listType item4 = new listType("progresiva-4", 9.12);
listaRiesgos.Add(item1);
listaRiesgos.Add(item2);
listaRiesgos.Add(item3);
listaRiesgos.Add(item4);
Object[,] data = new Object[listaRiesgos.Count + 1, 2];
data[0, 0] = null;
data[0, 1] = "Puntos";
for (int x = 0; x < listaRiesgos.Count; x++)
{
data[x, 0] = listaRiesgos[x].dataName;
data[x, 1] = listaRiesgos[x].data;
if (x == 0)
{
axMSChart1.TitleText = listaRiesgos[x].dataName;
}
}
axMSChart1.ChartData = data;
// Valores de visibilidad
axMSChart1.Legend.Location.LocationType = MSChart20Lib.VtChLocationType.VtChLocationTypeRight;
axMSChart1.Legend.Location.Visible = true;
//Agregamos los titulos a los ejes.
axMSChart1.Plot.get_Axis(MSChart20Lib.VtChAxisId.VtChAxisIdX, null).AxisTitle.Text = "Progresiva";
axMSChart1.Plot.get_Axis(MSChart20Lib.VtChAxisId.VtChAxisIdY, null).AxisTitle.Text = "Puntos";
}
Exportar nuestro grafico a un bitmap(.bmp):
Primero que nada debemos agregar una clausula using para agregar la clase que se encarga de manejar las api de windows, ya que con ella manejaremos el clipboard de windows para exportar la imagen.
Entonces:
using System.Runtime.InteropServices;
Luego agregamos al espacio de nombres de nuestro proyecto, la siguiente clase que manejara el clipboard, la encapsulacion la pueden manejar ustedes a su gusto:
private class Win32ClipboardAPI
{
public const uint CF_BITMAP = 2;
[DllImport("user32.dll"

]public static extern bool OpenClipboard(IntPtr hWndNewOwner);
[DllImport("user32.dll"

]public static extern IntPtr GetClipboardData(uint uFormat);
[DllImport("user32.dll"

]public static extern bool CloseClipboard();
[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true) ]
public static extern bool IsClipboardFormatAvailable(uint format);
}
Exelente!, una ves realizado esto ya podemos utilizar estos metodos para manejar el clipboard!!
Ahora al metodo en si!:
private void exportChartAsBitmap(string _path)
{
//copiamos el chart al clipboard
axMSChart1.EditCopy();
Application.DoEvents();
//Abrimos el clipBoard de windows
if (Win32ClipboardAPI.OpenClipboard(IntPtr.Zero))
{
//si se reconoce el bitmap
if (Win32ClipboardAPI.IsClipboardFormatAvailable(Win32ClipboardAPI.CF_BITMAP))
{
//obtenemos el puntero al bitmap en la pila de la memoria
IntPtr bmptr = Win32ClipboardAPI.GetClipboardData(Win32ClipboardAPI.CF_BITMAP);
if (bmptr != IntPtr.Zero)
{
//guardamos el bitmap
Bitmap chartCapture = Bitmap.FromHbitmap(bmptr);
chartCapture.Save(_path);
//limpiamos
chartCapture.Dispose();
}
}
//Cerramos el clipboard y libreramos los recursos utilizados
Win32ClipboardAPI.CloseClipboard();
}
y listo ! ya esta exportado nuestro chart como imagen!
cambiar el color de una serie:
DialogResult result = colorDialog1.ShowDialog();
if (result == DialogResult.OK)
{
axMSChart1.Plot.SeriesCollection[1].DataPoints[-1].Brush.FillColor.Blue = colorDialog1.Color.B;
axMSChart1.Plot.SeriesCollection[1].DataPoints[-1].Brush.FillColor.Red = colorDialog1.Color.R;
axMSChart1.Plot.SeriesCollection[1].DataPoints[-1].Brush.FillColor.Green = colorDialog1.Color.G;
}
Imprimir el chart:
Tambien podemos imprimir nuestro chart, esto ya es mas facil, lo unico que hacemos es registrar un evento al printPage a una instancia del objeto printDocument. Seria algo asi:
private void button1_Click(object sender, EventArgs e)
{
PrintDocument document = new PrintDocument();
document.PrintPage += this.document_PrintPage;
PrintDialog dlgSettings = new PrintDialog();
dlgSettings.Document = document;
if (dlgSettings.ShowDialog() == DialogResult.OK)
{
document.Print();
}
}
private void document_PrintPage(object sender, PrintPageEventArgs e)
{
exportChartAsBitmap(@"c:\temp.bmp"

;Font font = new Font("Arial", 30);
float x = e.MarginBounds.Left;
float y = e.MarginBounds.Top;
float lineHeight = font.GetHeight(e.Graphics);
e.Graphics.DrawString("Nombre del grafico", font, Brushes.Black, x, 0);
y += lineHeight;
e.Graphics.DrawImage(Image.FromFile(@"c:\temp.bmp"

, x, y); }
Liberar archivo temp.bmp:
Luego, no es mal habito limpiar los recursos que no utilizemos, podriamos hacer en el metodo onClose del formulario principal algo asi como
if (File.Exists(@"c:\temp.bmp"

){
File.Delete(@"c:\temp.bmp"

;}
Y eso es todo, son algunas de las cosas que les podrian llegar a hacer falta a la hora de trabajar con charts desde .NET sin pagar algun componente privativo ni usar componentes third-party.
Hasta luegoo !!
Slds Rivas Ignacio.
Software Developer.