Capítulo 4 Pinceles y Plumas
Transcripción
Capítulo 4 Pinceles y Plumas
Textos Universitarios / Serie Docencia ________________________________________________________________________ Capítulo 4 Pinceles y Plumas En el capítulo anterior vimos que para dibujar una figura, ya sea línea, rectángulo o trazo, es necesario el uso de una pluma (pen) y que para poder rellenar el interior de ellas era necesario el uso de un pincel (brush). En este capítulo estudiaremos en detalle como crear y usar varios tipos de pinceles y plumas. 4.1 Uso de pinceles en GDI+ En la biblioteca del Framework.NET hay dos espacios de nombres donde encontramos definida la funcionalidad para trabajar con pinceles: el espacio de nombres System.Drawing que define clases y funcionalidad de pinceles genéricos y el espacio de nombres System.Drawing.Drawing2D que define funcionalidad avanzada en 2D para los pinceles. En el espacio de nombres System.Drawing encontramos las clases Brush, SolidBrush, TextureBrush y Brushes y en el espacio de nombres System.Drawing.Drawing2D encontramos las clases HatchBrush, GradientBrush y PathGradientBrush que son mas elaboradas. 4.1.1 Clase Brush15 Requisitos Espacio de nombres: System.Drawing.Brush Las clases derivadas de esta clase base abstracta definen objetos utilizados para rellenar el interior de formas gráficas, como rectángulos, elipses, gráficos circulares, polígonos y rutas o trazos. Figura 4.1. Clases heredadas de la clase Brush 15 http://msdn2.microsoft.com/en-us/library/system.drawing.brush(VS.80).aspx Junio 3 de 2006 135 Jenaro C. Paz ________________________________________________________________________ 4.1.1.1 Métodos públicos Clone CreateObjRef (se hereda de MarshalByRefObject) Dispose . Equals (se hereda de Object) GetHashCode (se hereda de Object) GetLifetimeService (se hereda de MarshalByRefObject) GetType (se hereda de Object) InitializeLifetimeService (se hereda de MarshalByRefObject) ToString (se hereda de Object) Cuando se anula en una clase derivada, crea una copia exacta de este objeto Brush. Crea un objeto que contiene toda la información relevante necesaria para generar un proxy utilizado para comunicarse con un objeto remoto. Sobrecargado. Sobrecargado. Determina si dos instancias de Object son iguales. Sirve como función hash para un tipo concreto, apropiado para su utilización en algoritmos de hash y estructuras de datos como las tablas hash. Recupera el objeto de servicio de duración actual que controla la directiva de duración de esta instancia. Obtiene el objeto Type de la instancia actual. Obtiene un objeto de servicio de duración para controlar la directiva de duración de esta instancia. Devuelve un objeto String que representa al objeto Object actual. 4.1.1.2 Métodos protegidos Finalize Reemplazado. Vea Object.Finalize. En C# y C++, los finalizadores se expresan mediante la sintaxis del destructor. MemberwiseClone (se hereda de Object) Crea una copia superficial del objeto Object actual. 4.1.2 Clase SolidBrush16 Requisitos Espacio de nombres: System.Drawing.SolidBrush Define un pincel de un solo color. Los pinceles se utilizan para rellenar formas de gráficos, por ejemplo rectángulos, elipses, gráficos circulares y rutas o trazos. No se puede heredar esta clase. 16 http://msdn2.microsoft.com/en-us/library/system.drawing.solidbrush(VS.80).aspx Junio 3 de 2006 136 Textos Universitarios / Serie Docencia ________________________________________________________________________ 4.1.2.1 Constructores públicos SolidBrush (Constructor) Inicializa un nuevo objeto SolidBrush del color especificado. 4.1.2.2 Propiedades públicas Color Obtiene o establece el color de este objeto SolidBrush. 4.1.2.3 Métodos públicos Clone CreateObjRef (se hereda de MarshalByRefObject) Dispose (se hereda de Brush) Equals (se hereda de Object) GetHashCode (se hereda de Object) GetLifetimeService (se hereda de MarshalByRefObject) GetType (se hereda de Object) InitializeLifetimeService (se hereda de MarshalByRefObject) ToString (se hereda de Object) Reemplazado. Crea una copia exacta de este objeto SolidBrush. Crea un objeto que contiene toda la información relevante necesaria para generar un proxy utilizado para comunicarse con un objeto remoto. Sobrecargado. Sobrecargado. Determina si dos instancias de Object son iguales. Sirve como función hash para un tipo concreto, apropiado para su utilización en algoritmos de hash y estructuras de datos como las tablas hash. Recupera el objeto de servicio de duración actual que controla la directiva de duración de esta instancia. Obtiene el objeto Type de la instancia actual. Obtiene un objeto de servicio de duración para controlar la directiva de duración de esta instancia. Devuelve un objeto String que representa al objeto Object actual. 4.1.2.4 Métodos protegidos Finalize (se hereda de Object) Reemplazado. Permite que un objeto Object intente liberar recursos y realizar otras operaciones de limpieza antes de que el objeto Object sea reclamado por el recolector de elementos no utilizados. En C# y C++, los finalizadores se expresan mediante la sintaxis del destructor. MemberwiseClone (se hereda de Object) Crea una copia superficial del objeto Object 137 Jenaro C. Paz ________________________________________________________________________ actual. 4.1.2.5 El uso de SolidBrush en una forma Web Los listados 18b, 19b, 20b, 21b, 22b y 23b son ejemplos del uso de SolidBrush para rellenar diferente tipo de formas. Solo para resumir incluimos el siguiente segmento de código en donde se crea una pincel redBrush de color sólido y se rellena el interior de un rectángulo haciendo uso de el. SolidBrush redBrush = new SolidBrush(Color.Red); Rectangle rect = new Rectangle(150, 80, 200, 140); g.FillRectangle(redBrush, rect); redBrush.Dispose(); 4.1.3 Clase TextureBrush17 Requisitos Espacio de nombres: System.Drawing.TextureBrush Cada una de las propiedades de la clase TextureBrush es un objeto Brush que utiliza una imagen para rellenar el interior de una forma. No se puede heredar esta clase. 4.1.3.1 Constructores públicos TextureBrush (Constructor) Sobrecargado. Inicializa un nuevo objeto TextureBrush que utiliza la imagen especificada. 4.1.3.2 Propiedades públicas Image Transform WrapMode 17 Obtiene el objeto Image asociado a este objeto TextureBrush. Obtiene o establece un objeto Matrix que define una transformación geométrica local para la imagen asociada a este objeto TextureBrush. Obtiene o establece una enumeración WrapMode que indica el modo de ajuste de este objeto TextureBrush. http://msdn2.microsoft.com/en-us/library/system.drawing.texturebrush(VS.80).aspx Junio 3 de 2006 138 Textos Universitarios / Serie Docencia ________________________________________________________________________ 4.1.3.3 Métodos públicos Clone CreateObjRef (se hereda de MarshalByRefObject) Dispose (se hereda de Brush) Equals (se hereda de Object) GetHashCode (se hereda de Object) GetLifetimeService (se hereda de MarshalByRefObject) GetType (se hereda de Object) InitializeLifetimeService (se hereda de MarshalByRefObject) MultiplyTransform ResetTransform RotateTransform ScaleTransform ToString (se hereda de Object) TranslateTransform Reemplazado. Crea una copia exacta de este objeto TextureBrush. Crea un objeto que contiene toda la información relevante necesaria para generar un proxy utilizado para comunicarse con un objeto remoto. Sobrecargado. Sobrecargado. Determina si dos instancias de Object son iguales. Sirve como función hash para un tipo concreto, apropiado para su utilización en algoritmos de hash y estructuras de datos como las tablas hash. Recupera el objeto de servicio de duración actual que controla la directiva de duración de esta instancia. Obtiene el objeto Type de la instancia actual. Obtiene un objeto de servicio de duración para controlar la directiva de duración de esta instancia. Sobrecargado. Multiplica el objeto Matrix que representa la transformación geométrica local de este objeto TextureBrush por el objeto Matrix especificado, en el orden indicado. Restablece la propiedad Transform de este objeto TextureBrush en identidad. Sobrecargado. Gira la transformación geométrica local de este objeto TextureBrush en la cantidad especificada. Este método antepone la rotación a la transformación. Sobrecargado. Cambia el tamaño de la transformación geométrica local de este objeto TextureBrush en la cantidad especificada. Este método antepone la matriz de escala a la transformación. Devuelve un objeto String que representa al objeto Object actual. Sobrecargado. Desplaza la transformación geométrica local de este objeto 139 Jenaro C. Paz ________________________________________________________________________ TextureBrush en las dimensiones y en el orden especificados. 4.1.3.4 Métodos protegidos Finalize (se hereda de Object) Reemplazado. Permite que un objeto Object intente liberar recursos y realizar otras operaciones de limpieza antes de que el objeto Object sea reclamado por el recolector de elementos no utilizados. En C# y C++, los finalizadores se expresan mediante la sintaxis del destructor. MemberwiseClone (se hereda de Object) Crea una copia superficial del objeto Object actual. 4.1.3.5 El uso de TextureBrush en una forma Web Forma PaintBrushes01.aspx Figura 4.2. Forma Web para trabajar con Pinceles PaintBrushes01.aspx.cs using System; 140 Textos Universitarios / Serie Docencia ________________________________________________________________________ using using using using using using using using using System.Collections; System.ComponentModel; System.Data; System.Drawing; System.Web; System.Web.SessionState; System.Web.UI; System.Web.UI.WebControls; System.Web.UI.HtmlControls; namespace JCPGraphics { /// <summary> /// Descripción breve de DibujaCuadro. /// </summary> public class PaintBrushes01 : System.Web.UI.Page { protected System.Web.UI.WebControls.TextBox txtWidth; protected System.Web.UI.WebControls.Button btnBuild; protected System.Web.UI.WebControls.DropDownList ColorList; protected System.Web.UI.WebControls.TextBox txtHeight; 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) { string recHeight = txtHeight.Text; string recWidth = txtWidth.Text; string theColor = ColorList.SelectedItem.Text ; Response.Write("<img border='0' src='ServerPaintBrushes01.aspx?valueH=" + recHeight + "&valueW=" + recWidth + "&valueC=" + theColor + "'>"+ "</p>"); } } 141 Jenaro C. Paz ________________________________________________________________________ } ServerPaintBrushes01.aspx.cs using using 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.Drawing.Drawing2D; System.Drawing.Text; System.Globalization ; namespace JCPGraphics { public class ServerPaintBrushes01 : System.Web.UI.Page { int w1,h1; Color bgColor; private void Page_Load(object sender, System.EventArgs e) { w1 = UInt16.Parse(Request.QueryString["valueW"]); h1 = UInt16.Parse(Request.QueryString["valueH"]); bgColor=Color.FromName(Request.QueryString["valueC"]); // Create a Stream in memory to save the image MemoryStream memStream = canvasAndImage(); Response.Clear(); // Send the memory image to Browser in binary mode memStream.WriteTo(Response.OutputStream); } public MemoryStream canvasAndImage() { // Define a Rectangle to be the BG rectangle Rectangle bgRect = new Rectangle(0,0,w1,h1); // The bitmap Object used to work with images defined by // pixel data Bitmap pixelImage = new Bitmap(w1,h1); // 1) Will be used to build the new Graphics object // 2) Whatever you do with the Graphics object you afect // the image object! Graphics g = Graphics.FromImage(pixelImage); // +++++++++++++++Begins section related with this Server 142 Textos Universitarios / Serie Docencia ________________________________________________________________________ // Bitmap bitmap = new Bitmap(Server.MapPath("Textura.png")); TextureBrush tbrush = new TextureBrush(bitmap); g.FillRectangle(tbrush,bgRect); g.FillRectangle(new SolidBrush(Color.FromArgb(180, bgColor)), bgRect); Pen colorPen = new Pen(bgColor,8); g.DrawRectangle(colorPen,bgRect); // +++++++++++++++Ends section related with this Server MemoryStream aStream = new MemoryStream(); pixelImage.Save(aStream,ImageFormat.Png); // Bmp, Jpeg, Png, Gif return aStream; } Web Form Designer generated code } } Figura 4.3. Pintando un lienzo con Pinceles de Textura y Sólidos 4.1.4 Clase HatchBrush18 Requisitos Espacio de nombres: System.Drawing.Drawing2D.HatchBrush 18 http://msdn2.microsoft.com/en-us/library/system.drawing.drawing2d.hatchbrush(VS.80).aspx Junio 3 de 2006 143 Jenaro C. Paz ________________________________________________________________________ Define un pincel rectangular con un estilo de trama, un color de primer plano y un color de fondo. No se puede heredar esta clase. 4.1.4.1 Constructores públicos HatchBrush (Constructor) Sobrecargado. Inicializa una nueva instancia de la clase HatchBrush con la enumeración HatchStyle y el color de primer plano especificados. 4.1.4.2 Propiedades públicas BackgroundColor ForegroundColor HatchStyle Obtiene el color de los espacios entre las líneas de trama dibujadas por este objeto HatchBrush. Obtiene el color de las líneas de trama dibujadas por este objeto HatchBrush. Obtiene el estilo de trama de este objeto HatchBrush. 4.1.4 3 Métodos públicos Clone CreateObjRef (se hereda de MarshalByRefObject) Dispose (se hereda de Brush) Equals (se hereda de Object) GetHashCode (se hereda de Object) GetLifetimeService (se hereda de MarshalByRefObject) GetType (se hereda de Object) InitializeLifetimeService (se hereda de MarshalByRefObject) ToString (se hereda de Object) 144 Reemplazado. Crea una copia exacta de este objeto HatchBrush. Crea un objeto que contiene toda la información relevante necesaria para generar un proxy utilizado para comunicarse con un objeto remoto. Sobrecargado. Sobrecargado. Determina si dos instancias de Object son iguales. Sirve como función hash para un tipo concreto, apropiado para su utilización en algoritmos de hash y estructuras de datos como las tablas hash. Recupera el objeto de servicio de duración actual que controla la directiva de duración de esta instancia. Obtiene el objeto Type de la instancia actual. Obtiene un objeto de servicio de duración para controlar la directiva de duración de esta instancia. Devuelve un objeto String que representa al objeto Object actual. Textos Universitarios / Serie Docencia ________________________________________________________________________ 4.1.4 4 Métodos protegidos Finalize (se hereda de Object) Reemplazado. Permite que un objeto Object intente liberar recursos y realizar otras operaciones de limpieza antes de que el objeto Object sea reclamado por el recolector de elementos no utilizados. En C# y C++, los finalizadores se expresan mediante la sintaxis del destructor. MemberwiseClone (se hereda de Object) Crea una copia superficial del objeto Object actual. 4.1.4.5 El uso de HatchBrush en una forma Web PaintBrushes02.aspx.cs private void btnBuild_Click(object sender, System.EventArgs e) { string recHeight = txtHeight.Text; string recWidth = txtWidth.Text; string theColor = ColorList.SelectedItem.Text ; Response.Write("<img border='0' src='ServerPaintBrushes02.aspx?valueH=" + recHeight + "&valueW=" + recWidth + "&valueC=" + theColor + "'>"+ "</p>"); } ServerPaintBrushes02.aspx.cs using using 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.Drawing.Drawing2D; System.Drawing.Text; System.Globalization ; namespace JCPGraphics { public class ServerPaintBrushes02 : System.Web.UI.Page 145 Jenaro C. Paz ________________________________________________________________________ { int w1,h1; Color bgColor; private void Page_Load(object sender, System.EventArgs e) { w1 = UInt16.Parse(Request.QueryString["valueW"]); h1 = UInt16.Parse(Request.QueryString["valueH"]); bgColor=Color.FromName(Request.QueryString["valueC"]); // Create a Stream in memory to save the image MemoryStream memStream = canvasAndImage(); Response.Clear(); // Send the memory image to Browser in binary mode memStream.WriteTo(Response.OutputStream); } public MemoryStream canvasAndImage() { // Define a Rectangle to be the BG rectangle Rectangle bgRect = new Rectangle(0,0,w1,h1); // The bitmap Object used to work with images defined by // pixel data Bitmap pixelImage = new Bitmap(w1,h1); // 1) Will be used to build the new Graphics object // 2) Whatever you do with the Graphics object you afect // the image object! Graphics g = Graphics.FromImage(pixelImage); // Fill the interior of the bg rectangle g.FillRectangle(new SolidBrush(bgColor), bgRect); // +++++++++++++++Begins section related with this Server // HatchBrush hbrush = new HatchBrush(HatchStyle.DiagonalBrick, Color.Green, Color.FromArgb(200, Color.Yellow)); g.FillEllipse(hbrush,bgRect.X+10,bgRect.Y+10, bgRect.Width-20,bgRect.Height-20); // +++++++++++++++Ends section related with this Server MemoryStream aStream = new MemoryStream(); pixelImage.Save(aStream,ImageFormat.Png); // Bmp, Jpeg, Png, Gif return aStream; } Web Form Designer generated code } } Estilos para pinceles HatchBrush BackwardDiagonal DarkVertical DiagonalBrick ForwardDiagonal LargeGrid Max Percent05 146 Cross DashedDownwardDiagonal DiagonalCross Horizontal LightDownwardDiagonal Min Percent10 DarkDownwardDiagonal DashedHorizontal Divot HorizontalBrick LightHorizontal NarrowHorizontal Percent20 DarkHorizontal DashedUpwardDiagonal DottedDiamond LargeCheckerBoard LightUpwardDiagonal NarrowVertical Percent25 DarkUpwardDiagonal DashedVertical DottedGrid LargeConfetti LightVertical OutlinedDiamond Percent30 Textos Universitarios / Serie Docencia ________________________________________________________________________ Percent40 Percent80 SmallConfetti Vertical ZigZag Percent50 Percent90 SmallGrid Wave Percent60 Plaid SolidDiamond Weave Percent70 Shingle Sphere WideDownwardDiagonal Percent75 SmallCheckerBoard Trellis WideUpwardDiagonal Figura 4.4. Pinceles HatchBrush con estilos ForwardDiagonal, DiagonalBrick y Wave 4.1.5 Clase LinearGradientBrush19 Requisitos Espacio de nombres: System.Drawing.Drawing2D.LinearGradientBrush Encapsula un objeto Brush con un degradado lineal. No se puede heredar esta clase. 4.1.5.1 Constructores públicos LinearGradientBrush (Constructor) Sobrecargado. Inicializa una nueva instancia de la clase LinearGradientBrush con los puntos y colores especificados. 19 http://msdn2.microsoft.com/en-us/library/system.drawing.drawing2d.lineargradientbrush(VS.80).aspx Junio 3 de 2006 147 Jenaro C. Paz ________________________________________________________________________ 4.1.5.2 Propiedades públicas Blend GammaCorrection InterpolationColors LinearColors Rectangle Transform WrapMode Obtiene o establece un objeto Blend que especifica las posiciones y factores que definen una disminución personalizada para el degradado. Obtiene o establece un valor que indica si se habilitó la corrección gamma para este objeto LinearGradientBrush. Obtiene o establece un objeto ColorBlend que define un degradado lineal de varios colores. Obtiene o establece los colores inicial y final del degradado. Obtiene un área rectangular que define los puntos inicial y final del degradado. Obtiene o establece un objeto Matrix que define una transformación geométrica local para este objeto LinearGradientBrush. Obtiene o establece una enumeración WrapMode que indica el modo de ajuste de este LinearGradientBrush. 4.1.5.3 Métodos públicos Clone CreateObjRef (se hereda de MarshalByRefObject) Dispose (se hereda de Brush) Equals (se hereda de Object) GetHashCode (se hereda de Object) GetLifetimeService (se hereda de MarshalByRefObject) GetType (se hereda de Object) InitializeLifetimeService (se hereda de MarshalByRefObject) 148 Reemplazado. Crea una copia exacta de este objeto LinearGradientBrush. Crea un objeto que contiene toda la información relevante necesaria para generar un proxy utilizado para comunicarse con un objeto remoto. Sobrecargado. Sobrecargado. Determina si dos instancias de Object son iguales. Sirve como función hash para un tipo concreto, apropiado para su utilización en algoritmos de hash y estructuras de datos como las tablas hash. Recupera el objeto de servicio de duración actual que controla la directiva de duración de esta instancia. Obtiene el objeto Type de la instancia actual. Obtiene un objeto de servicio de duración para controlar la directiva de duración de Textos Universitarios / Serie Docencia ________________________________________________________________________ MultiplyTransform ResetTransform RotateTransform ScaleTransform SetBlendTriangularShape SetSigmaBellShape ToString (se hereda de Object) TranslateTransform esta instancia. Sobrecargado. Multiplica el objeto Matrix que representa la trasformación geométrica local de este objeto LinearGradientBrush por el objeto Matrix anteponiéndole el objeto Matrix especificado. Restablece la propiedad Transform en identidad. Sobrecargado. Gira la transformación geométrica local la cantidad especificada. Este método antepone la rotación a la transformación. Sobrecargado. Cambia el tamaño de la transformación geométrica local en las cantidades especificadas. Este método antepone la matriz de escala a la transformación. Sobrecargado. Crea un degradado lineal con un color central y una disminución lineal hacia un único color en ambos extremos. Sobrecargado. Crea una disminución de degradado basada en una curva en forma de campana. Devuelve un objeto String que representa al objeto Object actual. Sobrecargado. Convierte la transformación geométrica local en las dimensiones especificadas. Este método antepone la conversión a la transformación. 4.1.5.4 Métodos protegidos Finalize (se hereda de Object) Reemplazado. Permite que un objeto Object intente liberar recursos y realizar otras operaciones de limpieza antes de que el objeto Object sea reclamado por el recolector de elementos no utilizados. En C# y C++, los finalizadores se expresan mediante la sintaxis del destructor. MemberwiseClone (se hereda de Object) Crea una copia superficial del objeto Object actual. 4.1.5.5 El uso de LinearGradientBrush en una forma Web 149 Jenaro C. Paz ________________________________________________________________________ PaintBrushes03.aspx.cs private void btnBuild_Click(object sender, System.EventArgs e) { string recHeight = txtHeight.Text; string recWidth = txtWidth.Text; string theColor = ColorList.SelectedItem.Text ; Response.Write("<img border='0' src='ServerPaintBrushes03.aspx?valueH=" + recHeight + "&valueW=" + recWidth + "&valueC=" + theColor + "'>"+ "</p>"); } ServerPaintBrushes03.aspx.cs using using 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.Drawing.Drawing2D; System.Drawing.Text; System.Globalization ; namespace JCPGraphics { public class ServerPaintBrushes03 : System.Web.UI.Page { int w1,h1; Color bgColor; private void Page_Load(object sender, System.EventArgs e) { w1 = UInt16.Parse(Request.QueryString["valueW"]); h1 = UInt16.Parse(Request.QueryString["valueH"]); bgColor=Color.FromName(Request.QueryString["valueC"]); // Create a Stream in memory to save the image MemoryStream memStream = canvasAndImage(); Response.Clear(); // Send the memory image to Browser in binary mode memStream.WriteTo(Response.OutputStream); } public MemoryStream canvasAndImage() 150 Textos Universitarios / Serie Docencia ________________________________________________________________________ { // Define a Rectangle to be the BG rectangle Rectangle bgRect = new Rectangle(0,0,w1,h1); // The bitmap Object used to work with images defined by // pixel data Bitmap pixelImage = new Bitmap(w1,h1); // 1) Will be used to build the new Graphics object // 2) Whatever you do with the Graphics object you afect // the image object! Graphics g = Graphics.FromImage(pixelImage); // Fill the interior of the bg rectangle g.FillRectangle(new SolidBrush(bgColor), bgRect); // +++++++++++++++Begins section related with this Server // Rectangle rect = new Rectangle(bgRect.X+10, bgRect.Y+10,bgRect.Width-20,bgRect.Height-20); LinearGradientBrush lbrush = new LinearGradientBrush(rect, Color.Blue, Color.Turquoise, LinearGradientMode.ForwardDiagonal); g.FillEllipse(lbrush,rect); // +++++++++++++++Ends section related with this Server MemoryStream aStream = new MemoryStream(); pixelImage.Save(aStream,ImageFormat.Png); // Bmp, Jpeg, Png, Gif return aStream; } Web Form Designer generated code } } LinearGradientMode BackwardDiagonal ForwardDiagonal Horizontal Vertical 151 Jenaro C. Paz ________________________________________________________________________ Figura 4.5. Pinceles LinearGradientBrush con estilos ForwardDiagonal, Horizontal y Vertical 4.1.6 Clase PathGradientBrush20 Requisitos Espacio de nombres: System.Drawing.Drawing2D.PathGradientBrush Encapsula un objeto Brush que rellena el interior de un objeto GraphicsPath con un degradado. No se puede heredar esta clase. 4.1.6.1 Constructores públicos PathGradientBrush (Constructor) Sobrecargado. Inicializa una nueva instancia de la clase PathGradientBrush con el trazado especificado. 4.1.6.2 Propiedades públicas Blend CenterColor 20 Obtiene o establece un objeto Blend que especifica las posiciones y factores que definen una disminución personalizada para el degradado. Obtiene o establece el color en el centro del trazado del degradado. http://msdn2.microsoft.com/en-us/library/system.drawing.drawing2d.pathgradientbrush(VS.80).aspx Junio 3 ,de 2006 152 Textos Universitarios / Serie Docencia ________________________________________________________________________ CenterPoint FocusScales InterpolationColors Rectangle SurroundColors Transform WrapMode Obtiene o establece el punto central del trazado del degradado. Obtiene o establece el punto de foco para la disminución del degradado. Obtiene o establece un objeto ColorBlend que define un degradado lineal de varios colores. Obtiene un rectángulo delimitador para este objeto PathGradientBrush. Obtiene o establece una matriz de colores que corresponde a los puntos del trazado que rellena este objeto PathGradientBrush. Obtiene o establece un objeto Matrix que define una transformación geométrica local para este objeto PathGradientBrush. Obtiene o establece una enumeración WrapMode que indica el modo de ajuste de este objeto PathGradientBrush. 4.1.6.3 Métodos públicos Clone CreateObjRef (se hereda de MarshalByRefObject) Dispose (se hereda de Brush) Equals (se hereda de Object) GetHashCode (se hereda de Object) GetLifetimeService (se hereda de MarshalByRefObject) GetType (se hereda de Object) InitializeLifetimeService (se hereda de MarshalByRefObject) MultiplyTransform Reemplazado. Crea una copia exacta de este objeto PathGradientBrush. Crea un objeto que contiene toda la información relevante necesaria para generar un proxy utilizado para comunicarse con un objeto remoto. Sobrecargado. Sobrecargado. Determina si dos instancias de Object son iguales. Sirve como función hash para un tipo concreto, apropiado para su utilización en algoritmos de hash y estructuras de datos como las tablas hash. Recupera el objeto de servicio de duración actual que controla la directiva de duración de esta instancia. Obtiene el objeto Type de la instancia actual. Obtiene un objeto de servicio de duración para controlar la directiva de duración de esta instancia. Sobrecargado. Multiplica el objeto Matrix 153 Jenaro C. Paz ________________________________________________________________________ ResetTransform RotateTransform ScaleTransform SetBlendTriangularShape SetSigmaBellShape ToString (se hereda de Object) TranslateTransform que representa la trasformación geométrica local de este objeto PathGradientBrush por el objeto Matrix especificado, anteponiéndole el objeto Matrix especificado. Restablece la propiedad Transform en identidad. Sobrecargado. Aplica a la transformación geométrica local un giro del ángulo especificado y en el sentido de las agujas del reloj. Sobrecargado. Cambia el tamaño de la transformación geométrica local en las cantidades especificadas. Este método antepone la matriz de escala a la transformación. Sobrecargado. Crea un degradado con un color central y una disminución lineal hacia un color que lo rodea. Sobrecargado. Crea una disminución de degradado entre el color central y el primer color que lo rodea basándose en una curva en forma de campana. Devuelve un objeto String que representa al objeto Object actual. Sobrecargado. Aplica la conversión especificada a la transformación geométrica local. Este método antepone la conversión a la transformación. 4.1.6.4 Métodos protegidos Finalize (se hereda de Object) Reemplazado. Permite que un objeto Object intente liberar recursos y realizar otras operaciones de limpieza antes de que el objeto Object sea reclamado por el recolector de elementos no utilizados. En C# y C++, los finalizadores se expresan mediante la sintaxis del destructor. MemberwiseClone (se hereda de Object) Crea una copia superficial del objeto Object actual. 154 Textos Universitarios / Serie Docencia ________________________________________________________________________ 4.1.6.5 El uso de PathGradientBrush en una forma Web PaintBrushes04.aspx.cs private void btnBuild_Click(object sender, System.EventArgs e) { string recHeight = txtHeight.Text; string recWidth = txtWidth.Text; string theColor = ColorList.SelectedItem.Text ; Response.Write("<img border='0' src='ServerPaintBrushes04.aspx?valueH=" + recHeight + "&valueW=" + recWidth + "&valueC=" + theColor + "'>"+ "</p>"); } ServerPaintBrushes04.aspx.cs using using 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.Drawing.Drawing2D; System.Drawing.Text; System.Globalization ; namespace JCPGraphics { public class ServerPaintBrushes04 : System.Web.UI.Page { int w1,h1; Color bgColor; private void Page_Load(object sender, System.EventArgs e) { w1 = UInt16.Parse(Request.QueryString["valueW"]); h1 = UInt16.Parse(Request.QueryString["valueH"]); bgColor=Color.FromName(Request.QueryString["valueC"]); // Create a Stream in memory to save the image MemoryStream memStream = canvasAndImage(); Response.Clear(); // Send the memory image to Browser in binary mode memStream.WriteTo(Response.OutputStream); } 155 Jenaro C. Paz ________________________________________________________________________ public MemoryStream canvasAndImage() { // Define a Rectangle to be the BG rectangle Rectangle bgRect = new Rectangle(0,0,w1,h1); // The bitmap Object used to work with images defined by // pixel data Bitmap pixelImage = new Bitmap(w1,h1); // 1) Will be used to build the new Graphics object // 2) Whatever you do with the Graphics object you afect // the image object! Graphics g = Graphics.FromImage(pixelImage); // Fill the interior of the bg rectangle g.FillRectangle(new SolidBrush(bgColor), bgRect); // +++++++++++++++Begins section related with this Server // GraphicsPath path = new GraphicsPath(new Point[] { new Point(140, 30), new Point(235, 70), new Point(105, 95), new Point(170, 200), new Point(50, 220), new Point(20, 50), }, new byte[] { (byte)PathPointType.Start, (byte)PathPointType.Bezier, (byte)PathPointType.Bezier, (byte)PathPointType.Bezier, (byte)PathPointType.Line, (byte)PathPointType.Line, }); /* Segundo ejemplo GraphicsPath path = new GraphicsPath(new Point[] { new Point(195, 30), new Point(217, 99), new Point(290, 99), new Point(231, 142), new Point(253, 210), new Point(195, 168), new Point(137, 210), new Point(159, 142), new Point(100, 99), new Point(173, 99), new Point(195, 30) }, new byte[] { (byte)PathPointType.Start, (byte)PathPointType.Line, (byte)PathPointType.Line, (byte)PathPointType.Line, (byte)PathPointType.Line, (byte)PathPointType.Line, (byte)PathPointType.Line, (byte)PathPointType.Line, (byte)PathPointType.Line, (byte)PathPointType.Line, (byte)PathPointType.Line }); 156 Textos Universitarios / Serie Docencia ________________________________________________________________________ */ PathGradientBrush pgbrush = new PathGradientBrush(path); pgbrush.CenterColor = Color.FromArgb(255, 255, 0, 0); Color[] colors = {Color.FromArgb(255, 255, 155, 0)}; pgbrush.SurroundColors= colors; g.FillPath(pgbrush, path); // +++++++++++++++Ends section related with this Server MemoryStream aStream = new MemoryStream(); pixelImage.Save(aStream,ImageFormat.Png); // Bmp, Jpeg, Png, Gif return aStream; } Web Form Designer generated code } } Figura 4.6. Pinceles PathGradientBrush 157 Jenaro C. Paz ________________________________________________________________________ Otra aplicación: PaintWithBrushes.aspx.cs private void btnBuild_Click(object sender, System.EventArgs e) { string recHeight = txtHeight.Text; string recWidth = txtWidth.Text; Response.Write("<img border='0' src='ServerPaintWithBrushes.aspx?valueH=" + recHeight + "&valueW=" + recWidth + "'>"); Response.Write("<p><font color=red>Draw a Image!</font></p>"); } ServerPaintWithBrushes.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.Drawing.Drawing2D; System.Web; System.Web.SessionState; System.Web.UI; System.Web.UI.WebControls; System.Web.UI.HtmlControls; System.IO; System.Drawing.Imaging; namespace { /// /// /// JCPGraphics <summary> Summary description for rectServer. </summary> public class ServerPaintWithBrushes : System.Web.UI.Page { int w1,h1; Color bgColor=Color.LightGray; private void Page_Load(object sender, System.EventArgs e) { w1 = UInt16.Parse(Request.QueryString["valueW"]); h1 = UInt16.Parse(Request.QueryString["valueH"]); // Create a Stream in memory to save the image MemoryStream memStream = canvasAndImage(); Response.Clear(); // Send the memory image to Browser in binary mode memStream.WriteTo(Response.OutputStream); } public MemoryStream canvasAndImage() 158 Textos Universitarios / Serie Docencia ________________________________________________________________________ { // Define a Rectangle to be the BG rectangle Rectangle bgRect = new Rectangle(0,0,w1,h1); // The bitmap Object used to work with images defined by // pixel data Bitmap pixelImage = new Bitmap(w1,h1); // 1) Will be used to build the new Graphics object // 2) Whatever you do with the Graphics object you afect // the image object! Graphics g = Graphics.FromImage(pixelImage); // Fill the interior of the bg rectangle g.FillRectangle(new SolidBrush(bgColor), bgRect); // +++++++++++++++Begins section related with this Server // // Select a pen Pen bluePen = new Pen(Color.Blue,3); // Load an Image from root Folder Bitmap backgroundImage = new Bitmap (Server.MapPath("colorbars.jpg")); Brush backgroundBrush = new TextureBrush(backgroundImage); g.SmoothingMode = SmoothingMode.AntiAlias; g.FillRectangle(backgroundBrush, bgRect); g.FillRectangle(new SolidBrush(Color.FromArgb(180, Color.White)), bgRect); //Add a Violet rectangle and a Beige one that overlaps it g.FillRectangle(new SolidBrush(Color.Violet), 20, 20, 60, 50); g.FillRectangle(new SolidBrush(Color.FromArgb(180, Color.Yellow)), 40, 40, 50, 60); //Add an ellipse that is filled with a translucent hatch HatchBrush hb = new HatchBrush(HatchStyle.Cross, Color.Chocolate, Color.FromArgb(100, Color.Yellow)); g.FillEllipse(hb, 180, 20, 160, 80); //Now create a rectangle filled with a gradient brush Rectangle r = new Rectangle(260, 120, 100, 100); LinearGradientBrush lb = new LinearGradientBrush(r, Color.Green, Color.Turquoise, LinearGradientMode.ForwardDiagonal); g.FillRectangle(lb, r); //Now add a shape drawn with a path gradient brush GraphicsPath path = new GraphicsPath(new Point[] { new Point(80, 140), new Point(145, 200), new Point(200, 305), new Point(130, 360), new Point(50, 290), new Point(20, 130), }, new byte[] { (byte)PathPointType.Start, (byte)PathPointType.Line, (byte)PathPointType.Line, (byte)PathPointType.Line, 159 Jenaro C. Paz ________________________________________________________________________ (byte)PathPointType.Line, (byte)PathPointType.Line, } ); PathGradientBrush pgb = new PathGradientBrush(path); pgb.SurroundColors = new Color[] { Color.Green, Color.Yellow, Color.Red, Color.Blue, Color.Orange, Color.Violet, }; g.FillPath(pgb, path); //Now add a simple rectangle that has been rotated g.RotateTransform(-35); g.FillRectangle(new SolidBrush(Color.Blue), 40, 360, 65, 85); g.ResetTransform(); g.DrawRectangle(bluePen,bgRect); // // +++++++++++++++Ends section related with this Server MemoryStream aStream = new MemoryStream(); pixelImage.Save(aStream,ImageFormat.Png); // Bmp, Jpeg, Png, Gif return aStream; } Web Form Designer generated code } } 160 Textos Universitarios / Serie Docencia ________________________________________________________________________ Figura 4.7. Pinceles SolidBrush, TextureBrush, LinearGradientBrush y PathGradientBrush 4.2 Uso de plumas en GDI+ Las plumas son otro objeto importante en GDI+. Como mencionamos anteriormente, se usan para dibujar líneas y curvas y el contorno de figuras graficas. Una pluma dibuja líneas y curvas con un ancho específico y cierto estilo. El objeto Pen provee miembros para establecer el ancho y estilo de una pluma. Las plumas pueden ser de varios tipos de líneas continuas o punteadas y de diferente estilo en la manera de rellenar. El proceso de dibujar una línea crea una region en la forma de una línea ensanchada y esa region es rellenada con un pincel. Las líneas punteadas se representan por estilos dash. Los estilos para rellenar pueden ser sólidos o texturas dependiendo del pincel que se usa para crear la pluma. En esta sección veremos como crear plumas en GDI+; las clases Pen y Pens y como crear estilos dash, cap y de línea para las plumas. La clase Pen representa una pluma en GDI+. Usando el constructor de la clase Pen, se puede crear un objeto de un objeto Brush o Color especificando el ancho de la pluma. 4.2.1 Clase Pens21 Requisitos Espacio de nombres: System.Drawing.Pens Plumas de todos los colores estándar. No se puede heredar esta clase. 21 http://msdn2.microsoft.com/en-us/library/system.drawing.pens(VS.80).aspx Junio 3 de 2006 161 Jenaro C. Paz ________________________________________________________________________ 4.2.1.1 Propiedades públicas ( Obtiene Pen definido por el sistema con un ancho de 1.) AliceBlue AntiqueWhite Aqua Aquamarine Azure Beige Bisque Black BlanchedAlmond Blue BlueViolet Brown BurlyWood CadetBlue Chartreuse Chocolate Coral CornflowerBlue Cornsilk Crimson Cyan DarkBlue DarkCyan DarkGoldenrod DarkGray DarkGreen DarkKhaki DarkMagenta DarkOliveGreen DarkOrange DarkOrchid DarkRed DarkSalmon DarkSeaGreen DarkSlateBlue DarkSlateGray DarkTurquoise DarkViolet DeepPink DeepSkyBlue DimGray DodgerBlue Firebrick FloralWhite ForestGreen Fuchsia Gainsboro GhostWhite Gold Goldenrod Gray Green GreenYellow Honeydew HotPink IndianRed Indigo Ivory Khaki Lavender LavenderBlush LawnGreen LemonChiffon LightBlue LightCoral LightCyan LightGoldenrodYellow LightGray LightGreen LightPink LightSalmon LightSeaGreen LightSkyBlue LightSlateGray LightSteelBlue LightYellow Lime LimeGreen Linen Magenta Maroon MediumAquamarine MediumBlue MediumOrchid MediumPurple MediumSeaGreen MediumSlateBlue MediumSpringGreen MediumTurquoise MediumVioletRed MidnightBlue MintCream MistyRose Moccasin NavajoWhite Navy OldLace Olive OliveDrab Orange OrangeRed Orchid PaleGoldenrod PaleGreen PaleTurquoise PaleVioletRed PapayaWhip PeachPuff Peru Pink Plum PowderBlue Purple Red RosyBrown RoyalBlue SaddleBrown Salmon SandyBrown SeaGreen SeaShell Sienna Silver SkyBlue SlateBlue SlateGray Snow SpringGreen SteelBlue Tan Teal Thistle Tomato Transparent Turquoise Violet Wheat White WhiteSmoke Yellow YellowGreen La clase Pens como se muestra en la Tabla anterior, tiene propiedades estáticas para todos los colores estándar, que regresan objetos Pen de color. Las siguientes instrucciones crean tres objetos Pen usando la clase Pens. Pen myPen1 = Pens.LightGreen; Pen myPen2 = Pens.Yellow; Pen myPen3 = Pens.Lavender; 162 Textos Universitarios / Serie Docencia ________________________________________________________________________ 4.2.2 Clase Pen22 Requisitos Espacio de nombres: System.Drawing.Pen Define un objeto para dibujar líneas y curvas. No se puede heredar esta clase. 4.2.2.1 Constructores públicos Pen (Constructor) Sobrecargado. Inicializa una nueva instancia de la clase Pen con el color especificado. 4.2.2.2 Propiedades públicas Alignment Brush Color CompoundArray CustomEndCap CustomStartCap DashCap DashOffset DashPattern DashStyle Obtiene o establece la alineación para este objeto Pen. Obtiene o establece el objeto Brush que determina los atributos de este objeto Pen. Obtiene o establece el color de este objeto Pen. Obtiene o establece una matriz de valores que especifica un lápiz compuesto. Un lápiz compuesto dibuja una línea compuesta formada por líneas y espacios paralelos. Obtiene o establece un extremo personalizado que se utiliza al final de las líneas dibujadas con este objeto Pen. Obtiene o establece un extremo personalizado que se usa en el comienzo de las líneas dibujadas con este objeto Pen. Obtiene o establece el estilo del extremo que se utiliza al final de los guiones que forman las líneas discontinuas dibujadas con este objeto Pen. Obtiene o establece la distancia desde el comienzo de una línea hasta el comienzo de un modelo de guiones. Obtiene o establece una matriz de guiones y espacios personalizados. Obtiene o establece el estilo de las líneas discontinuas dibujadas con este objeto Pen. 22 http://msdn2.microsoft.com/en-us/library/system.drawing.pen(VS.80).aspx Junio 3 de 2006 163 Jenaro C. Paz ________________________________________________________________________ EndCap LineJoin MiterLimit PenType StartCap Transform Width Obtiene o establece el estilo de cierre que se utiliza al final de las líneas dibujadas con este objeto Pen. Obtiene o establece el estilo de combinación de los extremos de dos líneas consecutivas dibujadas con este objeto Pen. Obtiene o establece el límite del grosor de la combinación en una esquina en ángulo. Obtiene el estilo de las líneas dibujadas con un objeto Pen. Obtiene o establece el estilo de cierre que se utiliza al comienzo de las líneas dibujadas con este objeto Pen. Obtiene o establece la transformación geométrica para este objeto Pen. Obtiene o establece el ancho de este objeto Pen. 4.2.2.3 Métodos públicos Clone CreateObjRef (se hereda de MarshalByRefObject) Dispose Equals (se hereda de Object) GetHashCode (se hereda de Object) GetLifetimeService (se hereda de MarshalByRefObject) GetType (se hereda de Object) InitializeLifetimeService (se hereda de MarshalByRefObject) MultiplyTransform 164 Crea una copia exacta de este objeto Pen. Crea un objeto que contiene toda la información relevante necesaria para generar un proxy utilizado para comunicarse con un objeto remoto. Libera todos los recursos utilizados por este objeto Pen. Sobrecargado. Determina si dos instancias de Object son iguales. Sirve como función hash para un tipo concreto, apropiado para su utilización en algoritmos de hash y estructuras de datos como las tablas hash. Recupera el objeto de servicio de duración actual que controla la directiva de duración de esta instancia. Obtiene el objeto Type de la instancia actual. Obtiene un objeto de servicio de duración para controlar la directiva de duración de esta instancia. Sobrecargado. Multiplica la matriz de transformación de este objeto Pen por la Matrix especificada. Textos Universitarios / Serie Docencia ________________________________________________________________________ ResetTransform RotateTransform ScaleTransform SetLineCap ToString (se hereda de Object) . TranslateTransform Restablece la matriz de transformación geométrica de este objeto Pen en identidad. Sobrecargado. Gira la transformación geométrica local el ángulo especificado. Este método antepone la rotación a la transformación. Sobrecargado. Cambia el tamaño de la transformación geométrica local en los factores especificados. Este método antepone la matriz de escala a la transformación. Establece los valores que determinan el estilo de cierre que se utiliza para finalizar las líneas dibujadas con este objeto Pen. Devuelve un objeto String que representa al objeto Object actual. Sobrecargado. Convierte la transformación geométrica local en las dimensiones especificadas. Este método antepone la conversión a la transformación. 4.2.2.4 Métodos protegidos Reemplazado. Vea Object.Finalize. Finalize En C# y C++, los finalizadores se expresan mediante la sintaxis del destructor. MemberwiseClone (se hereda de Object) Crea una copia superficial del objeto Object actual. 4.2.2.5 El uso de diferente tipo de plumas en una forma Web PaintPen01.aspx.cs private void btnBuild_Click(object sender, System.EventArgs e) { string recHeight = txtHeight.Text; string recWidth = txtWidth.Text; string theColor = ColorList.SelectedItem.Text ; Response.Write("<img border='0' src='ServerPaintPen01.aspx?valueH=" + recHeight + "&valueW=" + recWidth + "&valueC=" + theColor + "'>"+ "</p>"); 165 Jenaro C. Paz ________________________________________________________________________ } ServerPaintPen01.aspx.cs using using 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.Drawing.Drawing2D; System.Drawing.Text; System.Globalization ; namespace JCPGraphics { public class ServerPaintPen01 : System.Web.UI.Page { int w1,h1; Color bgColor; private void Page_Load(object sender, System.EventArgs e) { w1 = UInt16.Parse(Request.QueryString["valueW"]); h1 = UInt16.Parse(Request.QueryString["valueH"]); bgColor=Color.FromName(Request.QueryString["valueC"]); // Create a Stream in memory to save the image MemoryStream memStream = canvasAndImage(); Response.Clear(); // Send the memory image to Browser in binary mode memStream.WriteTo(Response.OutputStream); } public MemoryStream canvasAndImage() { // Define a Rectangle to be the BG rectangle Rectangle bgRect = new Rectangle(0,0,w1,h1); // The bitmap Object used to work with images defined by // pixel data Bitmap pixelImage = new Bitmap(w1,h1); // 1) Will be used to build the new Graphics object // 2) Whatever you do with the Graphics object you afect // the image object! Graphics g = Graphics.FromImage(pixelImage); // Fill the interior of the bg rectangle g.FillRectangle(new SolidBrush(bgColor), bgRect); // +++++++++++++++Begins section related with this Server // 166 Textos Universitarios / Serie Docencia ________________________________________________________________________ SolidBrush blueBrush = new SolidBrush(Color.Blue); HatchBrush hatchBrush = new HatchBrush(HatchStyle.DashedVertical, Color.Yellow, Color.Green); // Create a pen from a solid brush with // width 7 Pen pn1 = new Pen( blueBrush, 7); // Create a pen from a hatch brush Pen pn2 = new Pen(hatchBrush, 8); // Create a pen from a Color structure Pen pn3 = new Pen(Color.Red,5); // Draw a line, ellipse, and rectangle g.DrawLine(pn1, new Point(40, 40), new Point(220, 220)); g.DrawEllipse(pn2, 20, 50, 160, 100); g.DrawRectangle(pn3, 40, 90, 180, 100); // +++++++++++++++Ends section related with this Server MemoryStream aStream = new MemoryStream(); pixelImage.Save(aStream,ImageFormat.Png); // Bmp, Jpeg, Png, Gif return aStream; } Web Form Designer generated code } } Figura 4.8. Plumas sólidas y HatchBrush PaintPen02.aspx.cs 167 Jenaro C. Paz ________________________________________________________________________ private void btnBuild_Click(object sender, System.EventArgs e) { string recHeight = txtHeight.Text; string recWidth = txtWidth.Text; string theColor = ColorList.SelectedItem.Text ; Response.Write("<img border='0' src='ServerPaintPen02.aspx?valueH=" + recHeight + "&valueW=" + recWidth + "&valueC=" + theColor + "'>"+ "</p>"); } ServerPaintPen02.aspx.cs using using 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.Drawing.Drawing2D; System.Drawing.Text; System.Globalization ; namespace JCPGraphics { public class ServerPaintPen02 : System.Web.UI.Page { int w1,h1; Color bgColor; private void Page_Load(object sender, System.EventArgs e) { w1 = UInt16.Parse(Request.QueryString["valueW"]); h1 = UInt16.Parse(Request.QueryString["valueH"]); bgColor=Color.FromName(Request.QueryString["valueC"]); // Create a Stream in memory to save the image MemoryStream memStream = canvasAndImage(); Response.Clear(); // Send the memory image to Browser in binary mode memStream.WriteTo(Response.OutputStream); } public MemoryStream canvasAndImage() { 168 Textos Universitarios / Serie Docencia ________________________________________________________________________ // Define a Rectangle to be the BG rectangle Rectangle bgRect = new Rectangle(0,0,w1,h1); // The bitmap Object used to work with images defined by // pixel data Bitmap pixelImage = new Bitmap(w1,h1); // 1) Will be used to build the new Graphics object // 2) Whatever you do with the Graphics object you afect // the image object! Graphics g = Graphics.FromImage(pixelImage); // Fill the interior of the bg rectangle g.FillRectangle(new SolidBrush(bgColor), bgRect); // +++++++++++++++Begins section related with this Server Bitmap bitmap = new Bitmap(Server.MapPath("Textura.png")); TextureBrush tbrush = new TextureBrush(bitmap); Pen texturedPen = new Pen(tbrush, 30); g.DrawImage(bitmap, 0, 0, bitmap.Width, bitmap.Height); g.DrawRectangle(texturedPen, 30, 100, 160, 100); // +++++++++++++++Ends section related with this Server MemoryStream aStream = new MemoryStream(); pixelImage.Save(aStream,ImageFormat.Png); // Bmp, Jpeg, Png, Gif return aStream; } Web Form Designer generated code } } Figura 4.9. Uso de pluma generado con un pincel TextureBrush 4.3 Transformaciones de gráficos donde intervienen Plumas 169 Jenaro C. Paz ________________________________________________________________________ Una transformación es el proceso de cambiar objetos gráficos de un estado a otro. Rotación, escalamiento, reflexión, translación y recorte son ejemplos de transformaciones. Vimos en el capitulo 3 que la clase Graphics contiene los métodos: MultiplyTransform ResetTransform RotateTransform ScaleTransform TranslateTransform Sobrecargado. Multiplica la transformación universal del objeto Graphics y especificada en el objeto Matrix. Restablece la matriz de transformación universal de este objeto Graphics en la matriz de identidades. Sobrecargado. Aplica la rotación especificada a la matriz de transformación de este objeto Graphics. Sobrecargado. Aplica la operación de cambio de escala especificada a la matriz de transformación de este objeto Graphics, anteponiéndola a esta última. Sobrecargado. Antepone la conversión especificada a la matriz de transformación de este objeto Graphics. Los cuales permiten llevar a cabo transformaciones sobre objetos gráficos que generemos mediante plumas en un lienzo. A continuación se presenta el código que nos permite dibujar una elipse horizontal en color rojo, luego rotarla 45 grados en el sentido de las manecillas del reloj y volver a dibujarla en color verde, finalmente hacer una translación horizontal de 200 pixeles a la derecha y volver a dibujarla en color azul. C# Pen pen1 = new Pen(Color.Black,1); pen1.DashStyle=DashStyle.DashDot; Pen pen2 = new Pen(Color.Brown,1); pen1.DashStyle=DashStyle.DashDotDot; //Draw an Ellipse g.DrawEllipse(new Pen(Color.Red, 3), 80, 20, 200, 80); //Draw two lines to the Red Ellipse g.DrawLine(pen1,0,0,80,60); g.DrawLine(pen2,0,0,280,60); // Set world transform of graphics object to rotate 45 degrees. g.RotateTransform(45.0F); //Draw an Ellipse g.DrawEllipse(new Pen(Color.Green, 3), 80, 20, 200, 80); //Draw two lines to the Green Ellipse g.DrawLine(pen1,0,0,80,60); g.DrawLine(pen2,0,0,280,60); // Then to translate, appending to world transform. g.TranslateTransform(200.0F, 0.0F, MatrixOrder.Append); // Draw rotated, translated ellipse to screen. 170 Textos Universitarios / Serie Docencia ________________________________________________________________________ g.DrawEllipse(new Pen(Color.Blue, 3), 80, 20, 200, 80); Figura 4.10. Rotación y Translación de una Elipse horizontal Obsérvese en la figura anterior, como con la rotación de 45 grados el punto 1 pasa a ser el punto 2 y con la translación de 200 pixeles hacia la derecha el punto 2 pasa a ser el punto 3. Como veremos en el Capitulo 9 en donde explicaremos el tema de Transformaciones y Matrices, cualquier punto (x,y) de la Elipse original se transforma en otro (x’,y’) de la Elipse transformada bajo la relación mostrada a continuación: [x' & cos(45) sen(45) 0# y ' 1]= $$' sen(45) cos(45) 0!![x $% 200 0 1!" y 1] Por lo tanto: x’ = .7071x - .7071y + 200 y’ = .7071x + .7071y Además de estas transformaciones que podemos realizar al objeto grafico existen otras que podemos efectuar a un objeto pluma, ya que también la clase Pen provee métodos para transformar y rotar. El método RotateTransform rota una transformación un cierto ángulo de tipo float y como segundo parámetro MatrixOrder que siendo optativo provee un orden para operaciones de transformación con matrices. Los valores para dicha enumeración son: Append y Prepend. El orden en las matrices es el orden en el cual una matriz se multiplica por otras. La diferencia entre Append y Prepend es el orden en la operación. Por ejemplo, si dos operaciones están participando en un proceso, la segunda operación se llevara a cabo después de la primera cuando el orden en las matrices es Append; cuando el orden es Prepend, la segunda operación se llevará a cabo primero. 171 Jenaro C. Paz ________________________________________________________________________ El método MultiplyTransform multiplica una matriz de transformación por una pluma. Su primer argumento es un objeto Matrix y el segundo argumento opcional es el orden de la operación. El método TranslateTransform de la clase Pen traslada una transformación por una dimensión específica. Este método toma dos valores de tipo float para la translación en x e y, luego un tercer parámetro opcional del tipo MatrixOrder. A continuación se muestra el código de un ejemplo que hace uso de Transformaciones sobre la pluma. TransPens01.aspx.cs private void btnBuild_Click(object sender, System.EventArgs e) { string recHeight = txtHeight.Text; string recWidth = txtWidth.Text; string theColor = ColorList.SelectedItem.Text ; Response.Write("<img border='0' src='ServerTransPens01.aspx?valueH=" + recHeight + "&valueW=" + recWidth + "&valueC=" + theColor + "'>"+ "</p>"); } ServerTransPens01.aspx.cs using using 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.Drawing.Drawing2D; System.Drawing.Text; System.Globalization ; namespace { /// /// /// 172 JCPGraphics <summary> Summary description for rectServer. </summary> Textos Universitarios / Serie Docencia ________________________________________________________________________ public class ServerTransPens01 : System.Web.UI.Page { int w1,h1; Color bgColor; private void Page_Load(object sender, System.EventArgs e) { w1 = UInt16.Parse(Request.QueryString["valueW"]); h1 = UInt16.Parse(Request.QueryString["valueH"]); bgColor=Color.FromName(Request.QueryString["valueC"]); // Create a Stream in memory to save the image MemoryStream memStream = canvasAndImage(); Response.Clear(); // Send the memory image to Browser in binary mode memStream.WriteTo(Response.OutputStream); } public MemoryStream canvasAndImage() { // Define a Rectangle to be the BG rectangle Rectangle bgRect = new Rectangle(0,0,w1,h1); // The bitmap Object used to work with images defined by // pixel data Bitmap pixelImage = new Bitmap(w1,h1); // 1) Will be used to build the new Graphics object // 2) Whatever you do with the Graphics object you afect // the image object! Graphics g = Graphics.FromImage(pixelImage); // Fill the interior of the bg rectangle g.FillRectangle(new SolidBrush(bgColor), bgRect); // +++++++++++++++Begins section related with this Server // // Create a Pen object Pen Pen1 = new Pen(Color.Violet, 5); Pen Pen2 = new Pen(Color.YellowGreen, 5); // Apply rotate and scale transformations Pen1.ScaleTransform(4, 1); Pen2.ScaleTransform(4, 1); g.DrawEllipse(Pen1, 20, 20, 100, 50); g.DrawRectangle(Pen2, 20, 120, 100, 50); Pen1.RotateTransform(45, MatrixOrder.Append); Pen2.RotateTransform(45, MatrixOrder.Append); g.DrawEllipse(Pen1, 160, 20, 100, 50); g.DrawRectangle(Pen2, 160, 120, 100, 50); Pen1.RotateTransform(45, MatrixOrder.Append); Pen2.RotateTransform(45, MatrixOrder.Append); g.DrawEllipse(Pen1, 300, 20, 100, 50); g.DrawRectangle(Pen2, 300, 120, 100, 50); // Dispose of objects Pen1.Dispose(); Pen2.Dispose(); g.Dispose(); // +++++++++++++++Ends section related with this Server MemoryStream aStream = new MemoryStream(); pixelImage.Save(aStream,ImageFormat.Png); 173 Jenaro C. Paz ________________________________________________________________________ // Bmp, Jpeg, Png, Gif return aStream; } Web Form Designer generated code } } Figura 4.11. Rotación de plumas para generar imágenes El siguiente ejemplo hace uso de transformaciones de gráficos haciendo uso de los métodos de la clase Graphics y en una segunda versión se muestra la forma en que se puede utilizar la matriz de rotación para llevar a cabo una transformación para generar los pétalos de la flor. DoFlower.aspx.cs private void btnGenerar_Click(object sender, System.EventArgs e) { string recHeight = txtHeight.Text; string recWidth = txtWidth.Text; Response.Write("<img border='0' src='ServerDoFlowerPath.aspx?valueH=" + recHeight + "&valueW=" + recWidth + "'>"); Response.Write("<p><font color=red>Making an Image with <I>Path and Transform</I>!</font></p>"); 174 Textos Universitarios / Serie Docencia ________________________________________________________________________ } ServerDoFlowerPath.aspx 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.Drawing.Drawing2D; namespace { /// /// /// JCPGraphics <summary> Summary description for rectServer. </summary> public class ServerDoFlowerPath : System.Web.UI.Page { int w1,h1; Color bgColor=Color.BlanchedAlmond; private void Page_Load(object sender, System.EventArgs e) { w1 = UInt16.Parse(Request.QueryString["valueW"]); h1 = UInt16.Parse(Request.QueryString["valueH"]); // Create a Stream in memory to save the image MemoryStream memStream = canvasAndImage(); Response.Clear(); // Send the memory image to Browser in binary mode memStream.WriteTo(Response.OutputStream); } public MemoryStream canvasAndImage() { // Define a Rectangle to be the BG rectangle Rectangle bgRect = new Rectangle(0,0,w1,h1); // The bitmap Object used to work with images defined by // pixel data Bitmap pixelImage = new Bitmap(w1,h1); // 1) Will be used to build the new Graphics object // 2) Whatever you do with the Graphics object you afect // the image object! Graphics g = Graphics.FromImage(pixelImage); // Fill the interior of the bg rectangle g.FillRectangle(new SolidBrush(bgColor), bgRect); // +++++++++++++++Begins section related with this Server /* First Method int cx=w1; 175 Jenaro C. Paz ________________________________________________________________________ int cy=h1; g.DrawBezier(new Pen(Color.Green,10), new Point(cx,cy), new Point(cx,3*cy/4), new Point(3*cx/4,cy/4), new Point(cx/2,cy/2)); float fScale = Math.Min(cx,cy)/2000f; g.TranslateTransform(cx/2,cy/2); g.ScaleTransform(fScale,fScale); GraphicsPath path = new GraphicsPath(); path.AddBezier(new Point(0,0), new Point(150,150), new Point(450,150), new Point(600,0)); path.AddBezier(new Point(600,0), new Point(450,-150), new Point(150,-150), new Point(0,0)); for(int i=0; i < 8; i++) { g.FillPath(Brushes.Yellow,path); g.DrawPath(Pens.Black,path); g.RotateTransform(360/8); } Rectangle rect = new Rectangle(-150, -150, 300, 300); g.FillEllipse(Brushes.Orange,rect); g.DrawEllipse(Pens.Black,rect); */ //Second Method int cx=w1; int cy=h1; g.DrawBezier(new Pen(Color.Green,10), new Point(cx,cy), new Point(cx,3*cy/4), new Point(3*cx/4,cy/4), new Point(cx/2,cy/2)); float fScale = Math.Min(cx,cy)/2000f; g.TranslateTransform(cx/2,cy/2); g.ScaleTransform(fScale,fScale); GraphicsPath path = new GraphicsPath(); path.AddBezier(new Point(0,0), new Point(150,150), new Point(450,150), new Point(600,0)); path.AddBezier(new Point(600,0), new Point(450,-150), new Point(150,-150), new Point(0,0)); //---------------[using Matrix]-------------------\\ Matrix m = new Matrix(); //This is the Diagonal m.Rotate(45); for(int i=0; i < 8; i++) { g.FillPath(Brushes.Yellow,path); g.DrawPath(Pens.Black,path); path.Transform(m); } 176 Textos Universitarios / Serie Docencia ________________________________________________________________________ //---------------[/using Matrix]------------------\\ Rectangle rect = new Rectangle(-150, -150, 300, 300); g.FillEllipse(Brushes.Orange,rect); g.DrawEllipse(Pens.Black,rect); // +++++++++++++++Ends section related with this Server MemoryStream aStream = new MemoryStream(); pixelImage.Save(aStream,ImageFormat.Png); // Bmp, Jpeg, Png, Gif return aStream; } Web Form Designer generated code } } Figura 4.12. Trayectorias Bezier y rotaciones para generar imágenes 177 Jenaro C. Paz ________________________________________________________________________ En este otro ejemplo se hace uso también de transformaciones de gráficos mostrando también la forma en que se puede utilizar la matriz de rotación para llevar a cabo la transformación grafica de los cuadriláteros de la estrella. DoStar.aspx.cs private void btnGenerar_Click(object sender, System.EventArgs e) { string recHeight = txtHeight.Text; string recWidth = txtWidth.Text; Response.Write("<img border='0' src='ServerDoStarPath.aspx?valueH=" + recHeight + "&valueW=" + recWidth + "'>"); Response.Write("<p><font color=red>Making an Image with <I>Path and Transform</I>!</font></p>"); } ServerDoStarPath.aspx 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.Drawing.Drawing2D; namespace { /// /// /// JCPGraphics <summary> Summary description for rectServer. </summary> public class ServerDoStarPath : System.Web.UI.Page { int w1,h1; Color bgColor=Color.BlanchedAlmond; private void Page_Load(object sender, System.EventArgs e) { w1 = UInt16.Parse(Request.QueryString["valueW"]); h1 = UInt16.Parse(Request.QueryString["valueH"]); // Create a Stream in memory to save the image MemoryStream memStream = canvasAndImage(); Response.Clear(); // Send the memory image to Browser in binary mode memStream.WriteTo(Response.OutputStream); } 178 Textos Universitarios / Serie Docencia ________________________________________________________________________ public MemoryStream canvasAndImage() { // Define a Rectangle to be the BG rectangle Rectangle bgRect = new Rectangle(0,0,w1,h1); // The bitmap Object used to work with images defined by // pixel data Bitmap pixelImage = new Bitmap(w1,h1); // 1) Will be used to build the new Graphics object // 2) Whatever you do with the Graphics object you afect // the image object! Graphics g = Graphics.FromImage(pixelImage); // Fill the interior of the bg rectangle g.FillRectangle(new SolidBrush(bgColor), bgRect); // +++++++++++++++Begins section related with this Server int cx=w1; int cy=h1; double L=500.0f; double M=184.0f; double ang = 54.0f*Math.PI/180.0f; float cosang =(float)Math.Cos(ang); float sinang =(float)Math.Sin(ang); float Msinang = (float)M*sinang; float Mcosang = (float)M*cosang; float fScale = Math.Min(cx,cy)/1200f; float Mf=(float)M; float Lf =(float)L; g.TranslateTransform(cx/2,cy/2); g.ScaleTransform(fScale,fScale); GraphicsPath path = new GraphicsPath(); path.AddLine(0.0f,0.0f,-Mcosang, -Msinang); path.AddLine(-Mcosang, -Msinang,0.0f,-Lf); path.AddLine(0.0f,-Lf,Mcosang,-Msinang); path.AddLine(Mcosang,-Msinang,0.0f,0.0f); //---------------[using Matrix]-------------------\\ Matrix m = new Matrix(); //This is the Diagonal m.Rotate(72); for(int i=0; i < 5; i++) { g.FillPath(Brushes.Yellow,path); g.DrawPath(Pens.Black,path); path.Transform(m); } //---------------[/using Matrix]-------------------\\ // +++++++++++++++Ends section related with this Server MemoryStream aStream = new MemoryStream(); pixelImage.Save(aStream,ImageFormat.Png); // Bmp, Jpeg, Png, Gif return aStream; } Web Form Designer generated code } } 179 Jenaro C. Paz ________________________________________________________________________ Figura 4.13. Dibujo de cuadriláteros y Rotaciones Para generar la estrella 4.4 Transformaciones de gráficos donde intervienen Pinceles Las clases TextureBrush, LinearGradientBrush y PathGradientBrush representadas en la Tabla siguiente por X_Brush contienen como ya vimos los siguientes métodos de transformación que aunque no se utilizan muy a menudo pueden servir para algún fin práctico MultiplyTransform ResetTransform RotateTransform ScaleTransform 180 Sobrecargado. Multiplica el objeto Matrix que representa la transformación geométrica local de este objeto X_Brush por el objeto Matrix especificado, en el orden indicado Restablece la propiedad Transform de este objeto X_Brush en identidad. Sobrecargado. Aplica la rotación especificada a la matriz de transformación de este objeto X_Brush. Sobrecargado. Cambia el tamaño de la transformación geométrica local de este objeto X_Brush en la cantidad especificada. Este método antepone la matriz de escala a la transformación. Textos Universitarios / Serie Docencia ________________________________________________________________________ TranslateTransform Sobrecargado. Desplaza la transformación geométrica local de este objeto X_Brush en las dimensiones y en el orden especificados. En las siguientes secciones presentamos algunas aplicaciones donde se utilizan transformaciones al objeto Graphics así como a los diferentes pinceles con que se dibuja. 4.4.1 Transformaciones para TextureBrush TextureBTrans.aspx.cs private void btnBuild_Click(object sender, System.EventArgs e) { string recHeight = txtHeight.Text; string recWidth = txtWidth.Text; string theColor = ColorList.SelectedItem.Text ; Response.Write("<img border='0' src='ServerTextureBTrans.aspx?valueH=" + recHeight + "&valueW=" + recWidth + "&valueC=" + theColor + "'>"+ "</p>"); } ServerTextureBTrans.aspx.cs using using 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.Drawing.Drawing2D; System.Drawing.Text; System.Globalization ; namespace { /// /// /// JCPGraphics <summary> Summary description for rectServer. </summary> public class ServerTextureBTrans : System.Web.UI.Page { int w1,h1; 181 Jenaro C. Paz ________________________________________________________________________ Color bgColor; private void Page_Load(object sender, System.EventArgs e) { w1 = UInt16.Parse(Request.QueryString["valueW"]); h1 = UInt16.Parse(Request.QueryString["valueH"]); bgColor=Color.FromName(Request.QueryString["valueC"]); // Create a Stream in memory to save the image MemoryStream memStream = canvasAndImage(); Response.Clear(); // Send the memory image to Browser in binary mode memStream.WriteTo(Response.OutputStream); } public MemoryStream canvasAndImage() { // Define a Rectangle to be the BG rectangle Rectangle bgRect = new Rectangle(0,0,w1,h1); // The bitmap Object used to work with images defined by // pixel data Bitmap pixelImage = new Bitmap(w1,h1); // 1) Will be used to build the new Graphics object // 2) Whatever you do with the Graphics object you afect // the image object! Graphics g = Graphics.FromImage(pixelImage); // Fill the interior of the bg rectangle g.FillRectangle(new SolidBrush(bgColor), bgRect); // +++++++++++++++Begins section related with this Server // // Create a TextureBrush object TextureBrush txtrBrush = new TextureBrush( new Bitmap(Server.MapPath("flowers3.png"))); // Rotate the texture image by 90 degrees txtrBrush.RotateTransform(90, MatrixOrder.Prepend); // Scale operation txtrBrush.ScaleTransform(2, 1, MatrixOrder.Prepend); // Fill a rectangle with texture brush g.TranslateTransform(180,0,MatrixOrder.Append); g.FillRectangle(txtrBrush, 0, 0, 192, 332); // Reset transformation txtrBrush.ResetTransform(); // Fill rectangle after resetting transformation // g.ResetTransform(); g.FillRectangle(txtrBrush, 0, 0, 166, 192); txtrBrush.ResetTransform(); txtrBrush.RotateTransform(180, MatrixOrder.Prepend); g.TranslateTransform(0,192,MatrixOrder.Append); g.FillRectangle(txtrBrush, 0, 0, 166, 192); // Dispose of objects txtrBrush.Dispose(); g.Dispose(); // +++++++++++++++Ends section related with this Server 182 Textos Universitarios / Serie Docencia ________________________________________________________________________ MemoryStream aStream = new MemoryStream(); pixelImage.Save(aStream,ImageFormat.Png); // Bmp, Jpeg, Png, Gif return aStream; } Web Form Designer generated code } } Figura 4.14. Transformaciones para TextureBrush 4.4.2 Transformaciones para LinearGradientBrush LinearGradBTrans.aspx.cs private void btnBuild_Click(object sender, System.EventArgs e) { string recHeight = txtHeight.Text; string recWidth = txtWidth.Text; string theColor = ColorList.SelectedItem.Text ; Response.Write("<img border='0' src='ServerLinearGradTrans.aspx?valueH=" + recHeight + 183 Jenaro C. Paz ________________________________________________________________________ "&valueW=" + recWidth + "&valueC=" + theColor + "'>"+ "</p>"); } ServerLinearGradTrans.aspx.cs using using 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.Drawing.Drawing2D; System.Drawing.Text; System.Globalization ; namespace { /// /// /// JCPGraphics <summary> Summary description for rectServer. </summary> public class ServerLinearGradBTrans : System.Web.UI.Page { int w1,h1; Color bgColor; private void Page_Load(object sender, System.EventArgs e) { w1 = UInt16.Parse(Request.QueryString["valueW"]); h1 = UInt16.Parse(Request.QueryString["valueH"]); bgColor=Color.FromName(Request.QueryString["valueC"]); // Create a Stream in memory to save the image MemoryStream memStream = canvasAndImage(); Response.Clear(); // Send the memory image to Browser in binary mode memStream.WriteTo(Response.OutputStream); } public MemoryStream canvasAndImage() { // Define a Rectangle to be the BG rectangle Rectangle bgRect = new Rectangle(0,0,w1,h1); // The bitmap Object used to work with images defined by // pixel data Bitmap pixelImage = new Bitmap(w1,h1); 184 Textos Universitarios / Serie Docencia ________________________________________________________________________ // 1) Will be used to build the new Graphics object // 2) Whatever you do with the Graphics object you afect // the image object! Graphics g = Graphics.FromImage(pixelImage); // Fill the interior of the bg rectangle g.FillRectangle(new SolidBrush(bgColor), bgRect); // +++++++++++++++Begins section related with this Server // // Create a LinearGradientBrush object Rectangle rect = new Rectangle(0, 0, 100, 100); LinearGradientBrush lgBrush = new LinearGradientBrush( rect, Color.Red, Color.Orange,0.0f,true); Matrix M = new Matrix(.7071f,.7071f,.7071f,.7071f,0.0f,0.0f); // Multiply transformation lgBrush.MultiplyTransform(M, MatrixOrder.Prepend); // Draw a rectangle after transformation g.FillRectangle(lgBrush, 0,0,200,200); // Reset transformation lgBrush.ResetTransform(); // Draw a rectangle after reset transformation g.FillRectangle(lgBrush, 200, 0, 200, 200); //Draw a white line to separate g.DrawLine(Pens.White,new Point(200,0),new Point(200,200)); // Dispose of objects lgBrush.Dispose(); g.Dispose(); // +++++++++++++++Ends section related with this Server MemoryStream aStream = new MemoryStream(); pixelImage.Save(aStream,ImageFormat.Png); // Bmp, Jpeg, Png, Gif return aStream; } Web Form Designer generated code } } 185 Jenaro C. Paz ________________________________________________________________________ Figura 4.15. Transformaciones para LinearGradientBrush Enseguida se muestra el código de una aplicación donde las transformaciones solo se llevan a cabo con los métodos de la clase Graphics LinearGradBrushes.aspx.cs private void btnBuild_Click(object sender, System.EventArgs e) { string recHeight = txtHeight.Text; string recWidth = txtWidth.Text; string theColor = ColorList.SelectedItem.Text ; Response.Write("<img border='0' src='ServerLGBrushes.aspx?valueH=" + recHeight + "&valueW=" + recWidth + "&valueC=" + theColor + "'>"+ "</p>"); } ServerLGBrushes.aspx.cs using using using using using using using using 186 System; System.Collections; System.ComponentModel; System.Data; System.Drawing; System.Web; System.Web.SessionState; System.Web.UI; Textos Universitarios / Serie Docencia ________________________________________________________________________ using using using using using using using System.Web.UI.WebControls; System.Web.UI.HtmlControls; System.IO; System.Drawing.Imaging; System.Drawing.Drawing2D; System.Drawing.Text; System.Globalization ; namespace { /// /// /// JCPGraphics <summary> Summary description for rectServer. </summary> public class ServerLGBrushes : System.Web.UI.Page { int w1,h1; Color bgColor; private void Page_Load(object sender, System.EventArgs e) { w1 = UInt16.Parse(Request.QueryString["valueW"]); h1 = UInt16.Parse(Request.QueryString["valueH"]); bgColor=Color.FromName(Request.QueryString["valueC"]); // Create a Stream in memory to save the image MemoryStream memStream = canvasAndImage(); Response.Clear(); // Send the memory image to Browser in binary mode memStream.WriteTo(Response.OutputStream); } public MemoryStream canvasAndImage() { // Define a Rectangle to be the BG rectangle Rectangle bgRect = new Rectangle(0,0,w1,h1); // The bitmap Object used to work with images defined by // pixel data Bitmap pixelImage = new Bitmap(w1,h1); // 1) Will be used to build the new Graphics object // 2) Whatever you do with the Graphics object you afect // the image object! Graphics g = Graphics.FromImage(pixelImage); // Fill the interior of the bg rectangle g.FillRectangle(new SolidBrush(bgColor), bgRect); // +++++++++++++++Begins section related with this Server // Rectangle rect = new Rectangle(0,0,150,100); LinearGradientBrush lbrush = new LinearGradientBrush(rect, Color.Wheat, Color.Orange, LinearGradientMode.ForwardDiagonal); g.RotateTransform(-60); g.ScaleTransform(1,2); g.TranslateTransform(-140,100); g.FillRectangle(lbrush,rect); g.ResetTransform(); g.FillRectangle(lbrush,rect); 187 Jenaro C. Paz ________________________________________________________________________ // +++++++++++++++Ends section related with this Server MemoryStream aStream = new MemoryStream(); pixelImage.Save(aStream,ImageFormat.Png); // Bmp, Jpeg, Png, Gif return aStream; } Web Form Designer generated code } } Figura 4.16. Transformaciones para el objeto Graphics asociado con LinearGradientBrush 4.4.3 Transformaciones para PathGradientBrush PathGradientBrushes.aspx.cs private void btnBuild_Click(object sender, System.EventArgs e) { string recHeight = txtHeight.Text; string recWidth = txtWidth.Text; string theColor = ColorList.SelectedItem.Text ; Response.Write("<img border='0' src='ServerPathGradientBrushes.aspx?valueH=" + recHeight + "&valueW=" + recWidth + 188 Textos Universitarios / Serie Docencia ________________________________________________________________________ "&valueC=" + theColor + "'>"+ "</p>"); } ServerPathGradientBrushes.aspx.cs using using 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.Drawing.Drawing2D; System.Drawing.Text; System.Globalization ; namespace { /// /// /// JCPGraphics <summary> Summary description for rectServer. </summary> public class ServerPathGradientBrushes : System.Web.UI.Page { int w1,h1; Color bgColor; private void Page_Load(object sender, System.EventArgs e) { w1 = UInt16.Parse(Request.QueryString["valueW"]); h1 = UInt16.Parse(Request.QueryString["valueH"]); bgColor=Color.FromName(Request.QueryString["valueC"]); // Create a Stream in memory to save the image MemoryStream memStream = canvasAndImage(); Response.Clear(); // Send the memory image to Browser in binary mode memStream.WriteTo(Response.OutputStream); } public MemoryStream canvasAndImage() { // Define a Rectangle to be the BG rectangle Rectangle bgRect = new Rectangle(0,0,w1,h1); // The bitmap Object used to work with images defined by // pixel data Bitmap pixelImage = new Bitmap(w1,h1); // 1) Will be used to build the new Graphics object // 2) Whatever you do with the Graphics object you afect // the image object! Graphics g = Graphics.FromImage(pixelImage); 189 Jenaro C. Paz ________________________________________________________________________ // Fill the interior of the bg rectangle g.FillRectangle(new SolidBrush(bgColor), // +++++++++++++++Begins section related /* GraphicsPath path = new GraphicsPath(new new Point(140, 30), new Point(235, 70), new Point(105, 95), new Point(170, 200), new Point(50, 220), new Point(20, 50), }, new byte[] { (byte)PathPointType.Start, (byte)PathPointType.Bezier, (byte)PathPointType.Bezier, (byte)PathPointType.Bezier, (byte)PathPointType.Line, (byte)PathPointType.Line, }); */ // Segundo ejemplo GraphicsPath path = new GraphicsPath(new new Point(195, 30), new Point(217, 99), new Point(290, 99), new Point(231, 142), new Point(253, 210), new Point(195, 168), new Point(137, 210), new Point(159, 142), new Point(100, 99), new Point(173, 99), new Point(195, 30) }, new byte[] { (byte)PathPointType.Start, (byte)PathPointType.Line, (byte)PathPointType.Line, (byte)PathPointType.Line, (byte)PathPointType.Line, (byte)PathPointType.Line, (byte)PathPointType.Line, (byte)PathPointType.Line, (byte)PathPointType.Line, (byte)PathPointType.Line, (byte)PathPointType.Line }); bgRect); with this Server Point[] { Point[] { PathGradientBrush pgbrush = new PathGradientBrush(path); pgbrush.CenterColor = Color.FromArgb(255, 255, 0, 0); Color[] colors = {Color.FromArgb(255, 255, 155, 0)}; pgbrush.SurroundColors= colors; g.TranslateTransform(195.0F,115.31034482758620689655172413793F); g.RotateTransform(36); g.TranslateTransform(40,40); g.ScaleTransform(0.5F,0.5F); g.FillPath(pgbrush, path); 190 Textos Universitarios / Serie Docencia ________________________________________________________________________ g.ResetTransform(); g.FillPath(pgbrush, path); // +++++++++++++++Ends section related with this Server MemoryStream aStream = new MemoryStream(); pixelImage.Save(aStream,ImageFormat.Png); // Bmp, Jpeg, Png, Gif return aStream; } Web Form Designer generated code } } Figura 4.17. Transformaciones del objeto Graphics asociado con PathGradientBrush PathGradBTrans.aspx.cs private void { string string string btnBuild_Click(object sender, System.EventArgs e) recHeight = txtHeight.Text; recWidth = txtWidth.Text; theColor = ColorList.SelectedItem.Text ; Response.Write("<img border='0' src='ServerPathGradBTrans.aspx?valueH=" + recHeight + "&valueW=" + recWidth + 191 Jenaro C. Paz ________________________________________________________________________ "&valueC=" + theColor + "'>"+ "</p>"); } ServerPathGradBTrans.aspx using using 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.Drawing.Drawing2D; System.Drawing.Text; System.Globalization ; namespace { /// /// /// JCPGraphics <summary> Summary description for rectServer. </summary> public class ServerPathGradBTrans : System.Web.UI.Page { int w1,h1; Color bgColor; private void Page_Load(object sender, System.EventArgs e) { w1 = UInt16.Parse(Request.QueryString["valueW"]); h1 = UInt16.Parse(Request.QueryString["valueH"]); bgColor=Color.FromName(Request.QueryString["valueC"]); // Create a Stream in memory to save the image MemoryStream memStream = canvasAndImage(); Response.Clear(); // Send the memory image to Browser in binary mode memStream.WriteTo(Response.OutputStream); } public MemoryStream canvasAndImage() { // Define a Rectangle to be the BG rectangle Rectangle bgRect = new Rectangle(0,0,w1,h1); // The bitmap Object used to work with images defined by // pixel data Bitmap pixelImage = new Bitmap(w1,h1); // 1) Will be used to build the new Graphics object 192 Textos Universitarios / Serie Docencia ________________________________________________________________________ // 2) Whatever you do with the Graphics object you afect // the image object! Graphics g = Graphics.FromImage(pixelImage); // Fill the interior of the bg rectangle g.FillRectangle(new SolidBrush(bgColor), bgRect); // +++++++++++++++Begins section related with this Server GraphicsPath path = new GraphicsPath(); // Create a rectangle and add it to path Rectangle rect = new Rectangle(20, 20, 100, 100); path.AddRectangle(rect); // Create a path gradient brush PathGradientBrush pgBrush = new PathGradientBrush(path.PathPoints); // Set its center and surrounding colors pgBrush.CenterColor = Color.Yellow; pgBrush.SurroundColors = new Color[] {Color.Red}; g.FillRectangle(pgBrush, 20, 20, 400, 400); pgBrush.CenterColor = Color.Green; pgBrush.SurroundColors = new Color[] {Color.Blue}; // Create matrix Matrix M = new Matrix(); // Translate M.Translate(150.0f, 70.0f, MatrixOrder.Prepend); // Rotate M.Rotate(20.0f, MatrixOrder.Prepend); // Scale M.Scale(1f, 2.0f, MatrixOrder.Prepend); // Shear M.Shear(.5f, 0.1f, MatrixOrder.Prepend); // Apply matrix to the brush pgBrush.MultiplyTransform(M); // Use brush after transformation // to fill a rectangle g.FillRectangle(pgBrush, 20, 20, 400, 400); // Dispose of objects pgBrush.Dispose(); g.Dispose(); // +++++++++++++++Ends section related with this Server MemoryStream aStream = new MemoryStream(); pixelImage.Save(aStream,ImageFormat.Png); // Bmp, Jpeg, Png, Gif return aStream; } Web Form Designer generated code } } 193 Jenaro C. Paz ________________________________________________________________________ Figura 4.18. Transformaciones del objeto PathGradientBrush 4.5 Plumas y pinceles del Sistema Las plumas y pinceles del sistema, se usan para dibujar y pintar usando colores del sistema. La forma en que plumas y pinceles pueden crearse es usando la clase SystemColors. 4.5.1 Colores del Sistema SystemColors representa en GDI+ a los colores del sistema, proveyendo las propiedades publicas para que usted pueda hacerlo. La manera para crear plumas de la clase SystemPens y pinceles de la clase SystemBrushes la veremos mas adelante, después de presentar a esta clase. 194 Textos Universitarios / Serie Docencia ________________________________________________________________________ 4.5.1.1 Clase SystemColors23 Requisitos Espacio de nombres: System.Drawing 4.5.1.1.1 Propiedades públicas ActiveBorder ActiveCaption ActiveCaptionText AppWorkspace Control ControlDark ControlDarkDark ControlLight ControlLightLight ControlText Obtiene una estructura Color que es el color del borde de la ventana activa. Obtiene una estructura Color que es el color del fondo de la barra de título de la ventana activa. Obtiene una estructura Color que es el color del texto de la barra de título de la ventana activa. Obtiene una estructura Color que es el color del área de trabajo de la aplicación. El área de trabajo de la aplicación es el área en una vista de varios documentos que no ocupan dichos documentos. Obtiene una estructura Color que es el color de la superficie de un elemento 3D. Obtiene una estructura Color que es el color de la sombra de un elemento 3D. El color de la sombra se aplica a las partes de los elementos en tres dimensiones que se encuentran en la zona alejada de la fuente de luz. Obtiene una estructura Color que es el color de la sombra oscura de un elemento 3D. El color de la sombra oscura se aplica a las partes de los elementos 3D que tienen el color más oscuro. Obtiene una estructura Color que es el color claro de un elemento 3D. El color claro se aplica a las partes de los elementos 3D expuestos a la fuente de luz. Obtiene una estructura Color que es el color resaltado de un elemento 3D. El color resaltado se aplica a las partes de los elementos 3D que tienen el color más claro. Obtiene una estructura Color que es el color 23 http://msdn2.microsoft.com/en-us/library/system.drawing.systemcolors(VS.80).aspx Junio 3 de 2006 195 Jenaro C. Paz ________________________________________________________________________ Desktop GrayText Highlight HighlightText HotTrack InactiveBorder InactiveCaption InactiveCaptionText Info InfoText Menu MenuText 196 del texto de un elemento 3D. Obtiene una estructura Color que es el color del escritorio. Obtiene una estructura Color que es el color del texto atenuado. Los elementos de una lista que no están habilitados se muestran en texto atenuado. Obtiene una estructura Color que es el color del fondo de los elementos seleccionados. Incluye elementos de menú seleccionados además del texto seleccionado. Por ejemplo, la estructura Color puede ser el color utilizado para el fondo de los elementos seleccionados de un cuadro de lista. Obtiene una estructura Color que es el color del texto de los elementos seleccionados. Por ejemplo, la estructura Color puede ser el color utilizado para el texto de los elementos seleccionados de un cuadro de lista. Obtiene una estructura Color que es el color utilizado para determinar un elemento del que se hace un seguimiento completo. Si se hace un sólo clic en un elemento del que se hace un seguimiento completo, el elemento se ejecuta. Obtiene una estructura Color que es el color del borde de una ventana inactiva. Obtiene una estructura Color que es el color del fondo de la barra de título de una ventana inactiva. Obtiene una estructura Color que es el color del texto de la barra de título de una ventana inactiva. Obtiene una estructura Color que es el color del fondo de una información sobre herramientas. Obtiene una estructura Color que es el color del texto de una información sobre herramientas. Obtiene una estructura Color que es el color del fondo de un menú. Obtiene una estructura Color que es el color del texto de un menú. Textos Universitarios / Serie Docencia ________________________________________________________________________ ScrollBar Window WindowFrame WindowText Obtiene una estructura Color que es el color del fondo de una barra de desplazamiento. Obtiene una estructura Color que es el color del fondo del área de cliente de una ventana. Obtiene una estructura Color que es el color del marco de una ventana. Obtiene una estructura Color que es el color del texto del área de cliente de una ventana. 4.5.2 Plumas del Sistema Cada una de las propiedades de la clase SystemPens es un objeto Pen que es del color de un elemento de presentación de Windows y es de un ancho de 1 pixel. 4.5.2.1 Clase SystemPens24 Requisitos 24 http://msdn2.microsoft.com/en-us/library/system.drawing.systempens(VS.80).aspx Junio 3 de 2006 197 Jenaro C. Paz ________________________________________________________________________ Espacio de nombres: System.Drawing 4.5.2.2 Propiedades públicas ActiveCaptionText Control ControlDark ControlDarkDark ControlLight ControlLightLight ControlText GrayText Highlight HighlightText 198 Obtiene un objeto Pen que es el color del texto de la barra de título de la ventana activa. Obtiene un objeto Pen que es el color de superficie de un elemento 3D. Obtiene un objeto Pen que es el color de la sombra de un elemento 3D. El color de la sombra se aplica a las partes de los elementos en tres dimensiones que se encuentran en la zona alejada de la fuente de luz. Obtiene un objeto Pen que es el color de la sombra oscura de un elemento 3D. El color de la sombra oscura se aplica a las partes de los elementos 3D que tienen el color más oscuro. Obtiene un objeto Pen que es el color claro de un elemento 3D. El color claro se aplica a las partes de los elementos 3D expuestos a la fuente de luz. Obtiene un objeto Pen que es el color resaltado de un elemento 3D. El color resaltado se aplica a las partes de los elementos 3D que tienen el color más claro. Obtiene un objeto Pen que es el color del texto de un elemento 3D. Obtiene un objeto Pen que es el color del texto atenuado. Los elementos de una lista que no están habilitados se muestran en texto atenuado. Obtiene un objeto Pen que es el color del fondo de los elementos seleccionados. Incluye elementos de menú seleccionados además del texto seleccionado. Por ejemplo, el lápiz puede ser del color utilizado para el fondo de los elementos seleccionados de un cuadro de lista. Obtiene un objeto Pen que es el color del Textos Universitarios / Serie Docencia ________________________________________________________________________ InactiveCaptionText InfoText MenuText WindowFrame WindowText texto de los elementos seleccionados. Incluye elementos de menú seleccionados además del texto seleccionado. Por ejemplo, el lápiz puede ser del color utilizado para el texto de los elementos seleccionados de un cuadro de lista. Obtiene un objeto Pen que es el color del texto de la barra de título de una ventana inactiva. Obtiene un objeto Pen que es el color del texto de una información sobre herramientas. Obtiene un objeto Pen que es el color del texto de un menú. Obtiene un objeto Pen que es el color del marco de una ventana. Obtiene un objeto Pen que es el color del texto del área de cliente de una ventana. La manera de crear una pluma utilizando la clase SystemPens se proporciona en el siguiente segmento de código C# Pen myPen = SystemPens.FromSystemColor(SystemColors.GrayText); 4.5.3 Pinceles del Sistema Cada una de las propiedades de la clase SystemBrushes es un objeto SolidBrush que es el color de un elemento de presentación de Windows. 4.5.3.1 Clase SystemBrushes25 Requisitos Espacio de nombres: System.Drawing 4.5.3.1.1 Propiedades públicas ActiveBorder ActiveCaption Obtiene un objeto SolidBrush que es el color del borde de la ventana activa. Obtiene un objeto SolidBrush que es el 25 http://msdn2.microsoft.com/en-us/library/system.drawing.systembrushes(VS.80).aspx Junio 3 de 2006 199 Jenaro C. Paz ________________________________________________________________________ ActiveCaptionText AppWorkspace Control ControlDark ControlDarkDark ControlLight ControlLightLight ControlText Desktop Highlight 200 color del fondo de la barra de título de la ventana activa. Obtiene un objeto SolidBrush que es el color del texto de la barra de título de la ventana activa. Obtiene un objeto SolidBrush que es el color del área de trabajo de la aplicación. El área de trabajo de la aplicación es el área en una vista de varios documentos que no ocupan dichos documentos. Obtiene un objeto SolidBrush que es el color de la superficie de un elemento en tres dimensiones. Obtiene un objeto SolidBrush que es el color de la sombra de un elemento en tres dimensiones. El color de la sombra se aplica a las partes de los elementos en tres dimensiones que se encuentran en la zona alejada de la fuente de luz. Obtiene un objeto SolidBrush que es el color de la sombra oscura de un elemento 3D. El color de la sombra oscura se aplica a las partes de los elementos 3D que tienen el color más oscuro. Obtiene un objeto SolidBrush que es el color claro de un elemento 3D. El color claro se aplica a las partes de los elementos 3D expuestos a la fuente de luz. Obtiene un objeto SolidBrush que es el color resaltado de un elemento en tres dimensiones. El color resaltado se aplica a las partes de los elementos 3D que tienen el color más claro. Obtiene un objeto SolidBrush que es el color del texto de un elemento 3D. Obtiene un objeto SolidBrush que es el color del escritorio. Obtiene un objeto SolidBrush que es el color del fondo de los elementos seleccionados. Incluye elementos de menú seleccionados además del texto seleccionado. Por ejemplo, el pincel puede ser del color utilizado para el fondo de los elementos seleccionados de un cuadro de Textos Universitarios / Serie Docencia ________________________________________________________________________ HighlightText HotTrack InactiveBorder InactiveCaption Info Menu ScrollBar Window WindowText lista. Obtiene un objeto SolidBrush que es el color del texto de los elementos seleccionados. Incluye elementos de menú seleccionados además del texto seleccionado. Por ejemplo, el pincel puede ser del color utilizado para el texto de los elementos seleccionados de un cuadro de lista. Obtiene un objeto SolidBrush que es el color utilizado para determinar un elemento del que se hace un seguimiento completo. Si se hace un sólo clic en un elemento del que se hace un seguimiento completo, el elemento se ejecuta. Obtiene un objeto SolidBrush que es el color del borde de una ventana inactiva. Obtiene un objeto SolidBrush que es el color del fondo de la barra de título de una ventana inactiva. Obtiene un objeto SolidBrush que es el color del fondo de una información sobre herramientas. Obtiene un objeto SolidBrush que es el color del fondo de un menú. Obtiene un objeto SolidBrush que es el color del fondo de una barra de desplazamiento. Obtiene un objeto SolidBrush que es el color del fondo del área de cliente de una ventana. Obtiene un objeto SolidBrush que es el color del texto del área de cliente de una ventana. C# SolidBrush myBrush = (SolidBrush) SystemBrushes.FromSystemColor(SystemColors.InactiveCaption); SystemPenPencil.aspx.cs private void btnBuild_Click(object sender, System.EventArgs e) { 201 Jenaro C. Paz ________________________________________________________________________ string recHeight = txtHeight.Text; string recWidth = txtWidth.Text; string theColor = ColorList.SelectedItem.Text ; Response.Write("<img border='0' src='ServerSystemPenPencil.aspx?valueH=" + recHeight + "&valueW=" + recWidth + "&valueC=" + theColor + "'>"+ "</p>"); } ServerSystemPenPencil.aspx.cs using using 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.Drawing.Drawing2D; System.Drawing.Text; System.Globalization ; namespace { /// /// /// JCPGraphics <summary> Summary description for rectServer. </summary> public class ServerSystemPenPencil: System.Web.UI.Page { int w1,h1; Color bgColor; private void Page_Load(object sender, System.EventArgs e) { w1 = UInt16.Parse(Request.QueryString["valueW"]); h1 = UInt16.Parse(Request.QueryString["valueH"]); bgColor=Color.FromName(Request.QueryString["valueC"]); // Create a Stream in memory to save the image MemoryStream memStream = canvasAndImage(); Response.Clear(); // Send the memory image to Browser in binary mode 202 Textos Universitarios / Serie Docencia ________________________________________________________________________ memStream.WriteTo(Response.OutputStream); } public MemoryStream canvasAndImage() { // Define a Rectangle to be the BG rectangle Rectangle bgRect = new Rectangle(0,0,w1,h1); // The bitmap Object used to work with images defined by // pixel data Bitmap pixelImage = new Bitmap(w1,h1); // 1) Will be used to build the new Graphics object // 2) Whatever you do with the Graphics object you afect // the image object! Graphics g = Graphics.FromImage(pixelImage); // Fill the interior of the bg rectangle g.FillRectangle(new SolidBrush(bgColor), bgRect); // +++++++++++++++Begins section related with this Server // // Create a pen using SystemPens Pen pn = SystemPens.FromSystemColor(SystemColors.GrayText); // Create a brush using SystemBrushes SolidBrush brush = (SolidBrush)SystemBrushes.FromSystemColor (SystemColors.InactiveCaption); // Draw lines and rectangles g.DrawLine(pn, 20, 20, 20, 100); g.DrawLine(pn, 20, 20, 100, 20); g.DrawLine(pn,20,100,100,100); g.DrawLine(pn,100,20,100,100); g.FillRectangle(brush, 30, 30, 60, 60); // +++++++++++++++Ends section related with this Server MemoryStream aStream = new MemoryStream(); pixelImage.Save(aStream,ImageFormat.Png); // Bmp, Jpeg, Png, Gif return aStream; } Web Form Designer generated code } } 203 Jenaro C. Paz ________________________________________________________________________ Figura 4.19. Trabajando con plumas y pinceles del Sistema 204