Textos Universitarios / Serie Docencia ________________________________________________________________________ Capítulo 7 Biblioteca de clases y la generación de Gráficas En este Capítulo se presenta una biblioteca formada por las clases, gLibrary y gImage desarrolladas haciendo uso de los métodos de GDI+ que se revisaron en los capítulos anteriores. 7.1 Dibujo de Marcos y Bordes con gLibrary A continuación se presenta el código de la clase gLibrary (desarrollada por un servidor) en la que se han definido los métodos estáticos brightenit, darkenit, drawTopLine, drawLeftLine, drawBottonLine, drawRightLine, DrawBorder y DrawFrame para dibujar bordes y marcos sobre un lienzo. Clase gLibrary.cs using System; using System.Drawing; using System.Globalization; namespace JCPGraphics { public class gLibrary { public gLibrary() { // // TODO: Add constructor logic here // } public static void DrawFrame(Graphics g1,int x1,int y1,int w1,int h1, int th1,int margin,string c1, string type) { if(th1==0) return; Pen m =new Pen(gLibrary.brightenit(c1,0.4)); Pen n =new Pen(gLibrary.darkenit(c1,0.4)); Pen o =new Pen(gLibrary.darkenit(c1,0.1)); Pen p =new Pen(gLibrary.brightenit(c1,0.8)); Pen q =new Pen(gLibrary.darkenit(c1,0.8)); Pen r =new Pen(gLibrary.darkenit(c1,0.3)); Pen t =new Pen(gLibrary.darkenit(c1,0.0)); Pen temp; if (th1 > 0) { if (type.Equals ("ShadowOut")) { for (int i=0; i < th1 ; i++) { drawTopLine( g1, m,x1, y1, w1,h1,i,margin); 281 Jenaro C. Paz ________________________________________________________________________ drawLeftLine( g1, m,x1, y1, w1,h1,i,margin); drawBottomLine( g1, n,x1, y1, w1,h1,i,margin); drawRightLine( g1, n,x1, y1, w1,h1,i,margin); } } else if(type.Equals ("ShadowEtchedIn")) { for (int i=0; i < th1 ; i++) { if(i==0)temp=q; else if(i==th1-1)temp=p; else temp=r; drawTopLine( g1, temp,x1, y1, w1,h1,i,margin); drawLeftLine( g1, temp,x1, y1, w1,h1,i,margin); if(i==0) temp=p; else if(i==th1-1) temp=q; else temp=r; drawBottomLine( g1, temp,x1, y1, w1,h1,i,margin); drawRightLine( g1, temp,x1, y1, w1,h1,i,margin); } } else if(type.Equals ("ShadowEtchedOut")) { for (int i=0; i < th1 ; i++) { if(i==0)temp=p; else if(i==th1-1)temp=q; else temp=t; drawTopLine( g1, temp,x1, y1, w1,h1,i,margin); drawLeftLine( g1, temp,x1, y1, w1,h1,i,margin); if(i==0)temp=q; else if(i==th1-1)temp=p; else temp=t; drawBottomLine( g1, temp,x1, y1, w1,h1,i,margin); drawRightLine( g1, temp,x1, y1, w1,h1,i,margin); } } else { for (int i=0; i < th1 ; i++) { drawTopLine( g1, n,x1, y1, w1,h1,i,margin); drawRightLine( g1, m,x1, y1, w1,h1,i,margin); drawBottomLine( g1, m,x1, y1, w1,h1,i,margin); drawLeftLine( g1, n,x1, y1, w1,h1,i,margin); } } } } public static void DrawBorder(Graphics g1,int x1,int y1,int w1, int h1, int bw1,int margin,Color clr1) { if(bw1> 0) { Pen myPen=new Pen(clr1); for (int i=0; i < bw1 ; i++) 282 Textos Universitarios / Serie Docencia ________________________________________________________________________ { g1.DrawRectangle (myPen,x1+margin+i,y1+margin+i, w1-2*margin-2*i-1,h1-2*margin-2*i-1); } } } public static void drawTopLine(Graphics g, Pen pen,int x, int y, int w, int h,int iter,int margin) { g.DrawLine(pen,x+margin+iter, y+margin+iter, x-iter+w-margin, y+margin+iter); } public static void drawLeftLine(Graphics g, Pen pen,int x, int y, int w, int h,int iter,int margin) { g.DrawLine(pen,x+iter+margin, y+iter+margin, x+iter+margin, y-iter+h-margin); } public static void drawBottomLine(Graphics g, Pen pen, int x, int y, int w, int h,int iter,int margin) { g.DrawLine(pen,x+margin+iter, y-iter+h-margin, x-iter+w-margin, y-iter+h-margin); } public static void drawRightLine (Graphics g, Pen pen,int x, int y, int w, int h,int iter,int margin) { g.DrawLine(pen,x-iter+w-margin, y+iter+margin, x-iter+w-margin, y-iter+h-margin); } public static Color darkenit(Color c, double factor) { return Color.FromArgb (Math.Max ((int)(c.R*(1-factor)),0), Math.Max ((int)(c.G*(1-factor)),0), Math.Max ((int)(c.B*(1-factor)),0)); } public static Color darkenit(int r, int g, int b, double factor) { Color clr1 = Color.FromArgb(r,g,b); return darkenit(clr1,factor); } public static Color darkenit(string hexColor, double factor) { ColorConverter colorConverter = new ColorConverter(); Color clr1 = (Color)colorConverter.ConvertFromString(hexColor); return darkenit(clr1,factor); } public static Color brightenit( Color c, double factor) { int r1,g1,b1; r1 = c.R +(int)((255-c.R)* factor); g1 = c.G +(int)((255-c.G)* factor); 283 Jenaro C. Paz ________________________________________________________________________ b1 = c.B +(int)((255-c.B)* factor); return Color.FromArgb (r1,g1,b1); } public static Color brightenit( int r,int g, int b,double factor) { Color clr1 = Color.FromArgb(r,g,b); return brightenit(clr1,factor); } public static Color brightenit( string hexColor, double factor) { ColorConverter colorConverter = new ColorConverter(); Color clr1 = (Color)colorConverter.ConvertFromString(hexColor); return brightenit(clr1,factor); } } } Para hacer uso de los métodos de esta Clase, creamos la forma Web: DrawFrameAndBorder.aspx Diseñada con una tabla y los controles que se muestran en la siguiente figura: Figura 7.1 Forma Web para la aplicación luego añadimos el código: DrawFrameAndBorder.aspx.cs using using using using 284 System; System.Collections; System.ComponentModel; System.Data; Textos Universitarios / Serie Docencia ________________________________________________________________________ using using using using using using System.Drawing; System.Web; System.Web.SessionState; System.Web.UI; System.Web.UI.WebControls; System.Web.UI.HtmlControls; namespace JCPGraphics { public class DrawFrameAndBorder : System.Web.UI.Page { protected System.Web.UI.WebControls.Label lblTitle; protected System.Web.UI.WebControls.TextBox txtGraphW; protected System.Web.UI.WebControls.TextBox txtGraphH; protected System.Web.UI.WebControls.TextBox txtGraphBGC; protected System.Web.UI.WebControls.TextBox txtBorderW; protected System.Web.UI.WebControls.TextBox txtBorderC; protected System.Web.UI.WebControls.TextBox txtFrameThick; protected System.Web.UI.WebControls.DropDownList txtFrameType; protected System.Web.UI.WebControls.TextBox txtBorderM; protected System.Web.UI.WebControls.TextBox txtFrameM; protected System.Web.UI.WebControls.Button btnBuild; private void Page_Load(object sender, System.EventArgs e) { // Put user code to initialize the page here } #region Web Form Designer generated code override protected void OnInit(EventArgs e) { InitializeComponent(); base.OnInit(e); } private void InitializeComponent() { this.btnBuild.Click += new System.EventHandler(this.btnBuild_Click); this.Load += new System.EventHandler(this.Page_Load); } #endregion private void btnBuild_Click(object sender, System.EventArgs e) { //////////////// Graph parameters ////////// string graphWidth = txtGraphW.Text; string graphHeight = txtGraphH.Text; string graphColor = txtGraphBGC.Text ; /////////////////Border parameters ///////// string borderWidth = txtBorderW.Text; string borderColor = txtBorderC.Text; string borderMargin = txtBorderM.Text; /////////////////Frame parameters ////////// string frameThick = txtFrameThick.Text; string frameType = txtFrameType.SelectedValue .ToString (); 285 Jenaro C. Paz ________________________________________________________________________ string frameMargin = txtFrameM.Text; /////////////////////////////////////////////////////////// Response.Write("<p align='left'>" + "<img border='0' src='ServerFrameAndBorder.aspx?ValueGW=" + graphWidth + "&ValueGH=" + graphHeight + "&ValueGC=" + graphColor + "&ValueBW=" + borderWidth + "&ValueBC=" + borderColor + "&ValueBM=" + borderMargin + "&ValueFTH=" + frameThick + "&ValueFTY=" + frameType + "&ValueFM=" + frameMargin + "'>" + "</p>"); } } } Esta forma Web, debe interactuar con otra forma Web que no tiene aspecto gráfico sino únicamente el código siguiente: ServerDrawFrameAndBorder.aspx.cs using using using using using using using using using using using using using System; System.Collections; System.ComponentModel; System.Data; System.Drawing; System.Web; System.Web.SessionState; System.Web.UI; System.Web.UI.WebControls; System.Web.UI.HtmlControls; System.IO; System.Drawing.Imaging; System.Globalization ; namespace JCPGraphics { public class ServerFrameAndBorder : System.Web.UI.Page { int w1,h1,borderWidth,borderMargin,frameThick,frameMargin; Color bgColor,AppColor, AppBorderColor; string graphColor, borderColor, frameType; private void { string string string Page_Load(object sender, System.EventArgs e) ValueGW ValueGH ValueGC = Request.QueryString["ValueGW"]; = Request.QueryString["ValueGH"]; = Request.QueryString["ValueGC"]; string ValueFTH = Request.QueryString["ValueFTH"]; string ValueFTY = Request.QueryString["ValueFTY"]; 286 Textos Universitarios / Serie Docencia ________________________________________________________________________ string ValueFM = Request.QueryString["ValueFM"]; string ValueBW = Request.QueryString["ValueBW"]; string ValueBC = Request.QueryString["ValueBC"]; string ValueBM = Request.QueryString["ValueBM"]; w1 = UInt16.Parse(ValueGW); h1 = UInt16.Parse(ValueGH); graphColor="#"+ValueGC; ColorConverter colorConverter = new ColorConverter(); bgColor = (Color)colorConverter.ConvertFromString(graphColor); //Frame frameThick = UInt16.Parse(ValueFTH); frameType=ValueFTY; frameMargin=UInt16.Parse(ValueFM); //Border borderWidth = UInt16.Parse(ValueBW); borderMargin=UInt16.Parse(ValueBM); borderColor="#"+ValueBC; AppBorderColor = (Color)colorConverter.ConvertFromString(borderColor); ImageFormat outPutFormat = ImageFormat.Jpeg; string contentType = "image/jpeg"; Stream mystream = formRectC(); // implemented next Bitmap recimg = new Bitmap(mystream); Response.Clear(); Response.ContentType = contentType; recimg.Save(Response.OutputStream, outPutFormat); } public Stream formRectC() { Stream mystream = new MemoryStream(); /* Brush and Pen to draw image */ Brush blackBrush = new SolidBrush(Color.Black); Brush graphBrush = new SolidBrush(bgColor); Pen mypen = new Pen(Color.FromArgb(0, 0, 255), 1); // crear una Imagen bitmap y el objeto grafico para dibujar Bitmap memImg = new Bitmap(w1,h1,PixelFormat.Format24bppRgb); Graphics g = Graphics.FromImage(memImg); Rectangle theRect = new Rectangle(0,0,w1,h1); int myRectMargin=Math.Max(frameMargin+frameThick,0); g.FillRectangle(graphBrush, theRect); gLibrary.DrawFrame( g,0,0,w1,h1,frameThick,frameMargin,graphColor,frameType); gLibrary.DrawBorder(g,0,0,w1,h1,borderWidth,borderMargin, AppBorderColor); memImg.Save(mystream, ImageFormat.Jpeg); 287 Jenaro C. Paz ________________________________________________________________________ return mystream ; } #region Web Form Designer generated code override protected void OnInit(EventArgs e) { // // CODEGEN: This call is required by the ASP.NET Web Form Designer. // InitializeComponent(); base.OnInit(e); } /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.Load += new System.EventHandler(this.Page_Load); } #endregion } } Al introducir información en la forma y pulsar el botón Build Image, este Servidor genera la siguiente imagen con un marco y un borde como el siguiente. Figura 7.2. Alimentación de parámetros 288 Textos Universitarios / Serie Docencia ________________________________________________________________________ Tipo de Marco ShadowIn A continuación se muestran varias imágenes donde se han utilizado diferente tipo de marcos y bordes Tipo de Marco ShadowOut Borde de 1 pixel Borde de 4 pixeles Tipo de Marco EtchedIn Borde de 1 pixel Borde de 8 pixeles Tipo de Marco EtchedOut Borde de 1 pixel Borde de 16 pixeles Figura 7.3 Diferentes tipos de marcos y bordes 7.2 Dibujo de cuatro diferentes tipos de Gráficas haciendo uso de la clase gImage. A continuación se presenta el código de la clase gImage (desarrollada por un servidor) en la que se han definido varios métodos para dibujar Gráficas de Columnas, Líneas, Barras y Columnas en 3D. Para cada una de las diferentes gráficas se presenta un programa que muestra la manera y orden de llamar los diferentes métodos de ella para obtener los resultados deseados. A manera de introducción, enseguida presentamos diferentes métodos de la clase gImage que están relacionados con la creación de gráficas de columnas para que de manera visual se entienda el uso de ellos. 289 Jenaro C. Paz ________________________________________________________________________ Primer método a usar: Figura 7.4 Segundo método a usar: Figura 7.5 Tercer método a usar: 290 Textos Universitarios / Serie Docencia ________________________________________________________________________ Figura 7.6 Cuarto método a usar: Figura 7.7 Quinto método a usar: Figura 7.8 Sexto método a usar: Figura 7.9 291 Jenaro C. Paz ________________________________________________________________________ Séptimo método a usar: Figura 7.10 Octavo método a usar para terminar la gráfica. Figura 7.11 Misma gráfica con otras propiedades: 292 Textos Universitarios / Serie Docencia ________________________________________________________________________ Figura 7.12 293 Jenaro C. Paz ________________________________________________________________________ 294 Textos Universitarios / Serie Docencia ________________________________________________________________________ 295 Jenaro C. Paz ________________________________________________________________________ 296 Textos Universitarios / Serie Docencia ________________________________________________________________________ 297 Jenaro C. Paz ________________________________________________________________________ 298 Textos Universitarios / Serie Docencia ________________________________________________________________________ 299 Jenaro C. Paz ________________________________________________________________________ 300 Textos Universitarios / Serie Docencia ________________________________________________________________________ 301 Jenaro C. Paz ________________________________________________________________________ 302 Textos Universitarios / Serie Docencia ________________________________________________________________________ 303 Jenaro C. Paz ________________________________________________________________________ 304 Textos Universitarios / Serie Docencia ________________________________________________________________________ Para construir una gráfica de columnas haciendo uso de los métodos de esta clase, desarrollaremos un formulario Web que tenga como interfaz gráfica de usuario (GUI) la forma siguiente: Figura 7.1 Formulario para introducir los parámetros de la Gráfica de Columnas A continuación se presenta tanto el código HTML (ColumnChart_ASPX.HTML) así como su código C# (ColumnChart.aspx.cs). Posteriormente el código C# del servidor (forma Web ServerColumnChartaspx..cs) que generará la imagen con la Gráfica. 305 Jenaro C. Paz ________________________________________________________________________ 306 Textos Universitarios / Serie Docencia ________________________________________________________________________ 307 Jenaro C. Paz ________________________________________________________________________ 308 Textos Universitarios / Serie Docencia ________________________________________________________________________ 309 Jenaro C. Paz ________________________________________________________________________ 310 Textos Universitarios / Serie Docencia ________________________________________________________________________ 311 Jenaro C. Paz ________________________________________________________________________ 312 Textos Universitarios / Serie Docencia ________________________________________________________________________ 313 Jenaro C. Paz ________________________________________________________________________ 314 Textos Universitarios / Serie Docencia ________________________________________________________________________ Los datos que se van a graficar se encuentran en el método anterior como dos arreglos de números float y string que pueden sustituirse por datos dinámicos suplidos por una base de datos mediante una conexión ADO.NET, dependiendo del tipo de aplicación en donde se desee aplicar la generación de gráficas. 315 Jenaro C. Paz ________________________________________________________________________ Una vez que el formulario es llenado con la información pertinente y el botón Build Image pulsado, el mismo formulario recibe la gráfica deseada. Figura 7.2 Gráfica de Columnas generada 316 Textos Universitarios / Serie Docencia ________________________________________________________________________ El segundo caso es construir una gráfica de líneas haciendo uso de los métodos de esta clase, desarrollaremos un formulario Web que tenga como interfaz gráfica de usuario (GUI) la forma siguiente: Figura 7.3 Formulario para introducir los parámetros de la Gráfica de Líneas A continuación se presenta tanto el código HTML (LineChart_ASPX.HTML) así como su código C# (LineChart.aspx.cs). Posteriormente el código C# del servidor (forma Web ServerLineChart.aspx.cs) que generará la imagen con la Gráfica. 317 Jenaro C. Paz ________________________________________________________________________ 318 Textos Universitarios / Serie Docencia ________________________________________________________________________ 319 Jenaro C. Paz ________________________________________________________________________ 320 Textos Universitarios / Serie Docencia ________________________________________________________________________ 321 Jenaro C. Paz ________________________________________________________________________ 322 Textos Universitarios / Serie Docencia ________________________________________________________________________ 323 Jenaro C. Paz ________________________________________________________________________ 324 Textos Universitarios / Serie Docencia ________________________________________________________________________ 325 Jenaro C. Paz ________________________________________________________________________ 326 Textos Universitarios / Serie Docencia ________________________________________________________________________ 327 Jenaro C. Paz ________________________________________________________________________ Una vez que el formulario es llenado con la información pertinente y el botón Build Image pulsado, el mismo formulario recibe la gráfica de líneas. Figura 7.4 Gráfica de Líneas generada 328 Textos Universitarios / Serie Docencia ________________________________________________________________________ La clase BChart cuyo código se presenta a continuación implementa las gráficas de barras. 329 Jenaro C. Paz ________________________________________________________________________ 330 Textos Universitarios / Serie Docencia ________________________________________________________________________ 331 Jenaro C. Paz ________________________________________________________________________ 332 Textos Universitarios / Serie Docencia ________________________________________________________________________ 333 Jenaro C. Paz ________________________________________________________________________ 334 Textos Universitarios / Serie Docencia ________________________________________________________________________ 335 Jenaro C. Paz ________________________________________________________________________ 336 Textos Universitarios / Serie Docencia ________________________________________________________________________ 337 Jenaro C. Paz ________________________________________________________________________ 338 Textos Universitarios / Serie Docencia ________________________________________________________________________ El tercer caso es construir una gráfica de barras horizontales haciendo uso de los métodos de esta clase, desarrollaremos un formulario Web que tenga como interfaz gráfica de usuario (GUI) la forma siguiente: Figura 7.5 Formulario para introducir los parámetros de la Gráfica de Barras A continuación se presenta tanto el código HTML (BarChart_ASPX.HTML) así como su código C# (BarChart.aspx.cs). Posteriormente el código C# del servidor (forma Web ServerBarChart.aspx.cs) que generará la imagen con la Gráfica. 339 Jenaro C. Paz ________________________________________________________________________ 340 Textos Universitarios / Serie Docencia ________________________________________________________________________ 341 Jenaro C. Paz ________________________________________________________________________ 342 Textos Universitarios / Serie Docencia ________________________________________________________________________ 343 Jenaro C. Paz ________________________________________________________________________ 344 Textos Universitarios / Serie Docencia ________________________________________________________________________ 345 Jenaro C. Paz ________________________________________________________________________ 346 Textos Universitarios / Serie Docencia ________________________________________________________________________ 347 Jenaro C. Paz ________________________________________________________________________ 348 Textos Universitarios / Serie Docencia ________________________________________________________________________ 349 Jenaro C. Paz ________________________________________________________________________ Una vez que el formulario es llenado con la información pertinente y el botón Build Image pulsado, el mismo formulario recibe la gráfica de barras. Figura 7.6 Gráfica de Barras generada 350 Textos Universitarios / Serie Docencia ________________________________________________________________________ A continuación se presenta el código que implementa la clase Col3DChart, que nos servirá para generar gráficas de columnas tridimensionales. 351 Jenaro C. Paz ________________________________________________________________________ 352 Textos Universitarios / Serie Docencia ________________________________________________________________________ 353 Jenaro C. Paz ________________________________________________________________________ 354 Textos Universitarios / Serie Docencia ________________________________________________________________________ 355 Jenaro C. Paz ________________________________________________________________________ 356 Textos Universitarios / Serie Docencia ________________________________________________________________________ 357 Jenaro C. Paz ________________________________________________________________________ 358 Textos Universitarios / Serie Docencia ________________________________________________________________________ 359 Jenaro C. Paz ________________________________________________________________________ 360 Textos Universitarios / Serie Docencia ________________________________________________________________________ 361 Jenaro C. Paz ________________________________________________________________________ 362 Textos Universitarios / Serie Docencia ________________________________________________________________________ El cuarto y último caso es construir una gráfica de columnas 3D haciendo uso de los métodos de la clase implementada, desarrollaremos un formulario Web que tenga como interfaz gráfica de usuario (GUI) la forma siguiente: Figura 7.7 Formulario para introducir los parámetros de la Gráfica de Columnas 3D A continuación se presenta tanto el código HTML (Column3DChart_ASPX.HTML) así como su código C# (Column3DChart.aspx.cs). Posteriormente el código C# del servidor (forma Web Server3DColumnChart.aspx.cs) que generará la imagen con la Gráfica. 363 Jenaro C. Paz ________________________________________________________________________ 364 Textos Universitarios / Serie Docencia ________________________________________________________________________ 365 Jenaro C. Paz ________________________________________________________________________ 366 Textos Universitarios / Serie Docencia ________________________________________________________________________ 367 Jenaro C. Paz ________________________________________________________________________ 368 Textos Universitarios / Serie Docencia ________________________________________________________________________ 369 Jenaro C. Paz ________________________________________________________________________ 370 Textos Universitarios / Serie Docencia ________________________________________________________________________ 371 Jenaro C. Paz ________________________________________________________________________ 372 Textos Universitarios / Serie Docencia ________________________________________________________________________ 373 Jenaro C. Paz ________________________________________________________________________ Una vez que el formulario es llenado con la información pertinente y el botón Build Image pulsado, el mismo formulario recibe la gráfica de columnas 3D. Figura 7.8 Gráfica de Columnas 3D generada 374