Textos Universitarios / Serie Docencia ________________________________________________________________________ Contenido Introducción Capítulo 1 GDI+: La nueva Generación en Interfases gráficas 1.1 Superficies de dibujo y sistema de Coordenadas en GDI+ 1.1.1 Superficies de dibujo 1.1.2 Sistemas de Coordenadas 1.2 Estructuras Esenciales 1.2.1 Puntos bidimensionales 1.2.1.1 Constructores públicos 1.2.1.2 Campos públicos 1.2.1.3 Propiedades publicas 1.2.1.4 Métodos públicos 1.2.1.5 Operadores públicos y conversiones de tipo 1.2.1.6 Métodos protegidos 1.2.2 Estructura Size (tamaños) 1.2.2.1 Constructores públicos 1.2.2.2 Campos públicos 1.2.2.3 Propiedades publicas 1.2.2.4 Métodos públicos 1.2.2.5 Operadores públicos y conversión de tipos 1.2.2.6 Métodos protegidos 1.2.3 Estructura Rectangle (rectángulos) 1.2.3.1 Constructores públicos 1.2.3.2 Campos públicos 1.2.3.3 Propiedades publicas 1.2.3.4 Métodos públicos 1.2.3.5 Operadores públicos 1.2.3.6 Métodos protegidos 1.2.4 Estructura Color (colores) 1.2.4.1 Campos públicos 1.2.4.2 Propiedades publicas 1.2.4.3 Métodos públicos 1.2.4.4 Operadores públicos 1.2.4.5 Métodos protegidos 1.2.5 Clase TypeConverter 1.2.5.1 Constructores públicos 1.2.5.2 Métodos públicos 1.2.6 Clase ColorConverter 1.2.6.1 Constructores públicos 1.2.6.2 Métodos públicos 1.2.6.3 Métodos protegidos 1.2.7 Clase ColorTranslator 1.2.7.1 Métodos públicos 3 Jenaro C. Paz ________________________________________________________________________ Capítulo 2 Su primera aplicación GDI+ para Web 2.1 Imágenes, mapas de bits y metarchivos 2.1.1 Clase Image 2.1.1.1 Propiedades públicas 2.1.1.2 Métodos públicos 2.1.1.3 Métodos protegidos 2.1.2 Imágenes de trama (bitmaps) 2.1.2.1 Clase Bitmap 2.1.2.1.1 Constructores públicos 2.1.2.1.2 Propiedades publicas 2.1.2.1.3 Métodos públicos 2.1.2.1.4 Métodos protegidos 2.1.2.2 Tipos de mapas de bits 2.1.2.3 Formatos de archivos de gráficos 2.1.2.3.1 BMP (Bit MaP, mapa de bits) 2.1.2.3.2 GIF (Graphics Interchange Format, formato de intercambio de gráficos) 2.1.2.3.3 JPEG (Joint Photographic Experts Group, grupo conjunto de expertos en fotografía) 2.1.2.3.4 EXIF (Exchangeable Image File, archivo de imagen intercambiable) 2.1.2.3.5 PNG (Portable Network Graphics, gráficos de red portátiles) 2.1.2.3.6 TIFF (Tag Image File Format, formato de archivo de imágenes con etiquetas) 2.1.3 Clase Metafile 2.1.3.1 Constructores públicos 2.1.3.2 Propiedades publicas 2.1.3.3 Métodos públicos 2.1.3.4 Métodos protegidos 2.1.3.5 Información general acerca de gráficos vectoriales 2.2 Técnica para la generación de gráficos en línea en aplicaciones Web Capítulo 3 Objetos gráficos 3.1 Clase Graphics 3.1.1 Propiedades públicas 3.1.2 Métodos públicos 3.1.2.1 Métodos públicos para el dibujo 3.1.2.1.1 Dibujando imágenes mediante una forma Web 3.1.2.1.1.1 Generación del lienzo de dibujo definido por su color y su tamaño 3.1.2.1.1.2 Dibujando líneas sobre una lienzo 3.1.2.1.1.3 Dibujando rectángulos sobre un lienzo 3.1.2.1.1.4 Dibujando elipses y arcos sobre un lienzo 3.1.2.1.1.5 Dibujando polígonos sobre un lienzo 3.1.2.1.1.6 Dibujando curvas sobre un lienzo 3.1.2.1.1.7 Dibujando curvas Bézier sobre un lienzo 4 Textos Universitarios / Serie Docencia ________________________________________________________________________ 3.1.2.1.1.8 Dibujando trazados sobre un lienzo 3.1.2.1.1.9 Dibujando iconos sobre un lienzo 3.1.2.1.1.10 Dibujando imágenes sobre un lienzo 3.1.2.1.1.11 Dibujando pasteles sobre un lienzo 3.1.2.1.1.12 Dibujando cadenas sobre un lienzo 3.1.2.2 Métodos Públicos para rellenar 3.1.2.2.1 Rellenando el interior de formas dibujadas en un lienzo 3.1.2.2.1.1 Rellenando curvas cerradas 3.1.2.2.1.2 Rellenando elipses 3.1.2.2.1.3 Rellenando trazos 3.1.2.2.1.4 Rellenando pasteles 3.1.2.2.1.5 Rellenando polígonos 3.1.2.2.1.6 Rellenando un rectángulo Capítulo 4 Pinceles y Plumas 4.1 Uso de pinceles en GDI+ 4.1.1 La clase Brush 4.1.1.1 Métodos públicos 4.1.1.2 Métodos protegidos 4.1.2 La clase SolidBrush 4.1.2.1 Constructores públicos 4.1.2.2 Propiedades públicas 4.1.2.3 Métodos públicos 4.1.2.4 Métodos protegidos 4.1.2.5 El uso de SolidBrush en una forma Web 4.1.3 La clase TextureBrush 4.1.3.1 Constructores públicos 4.1.3.2 Propiedades publicas 4.1.3.3 Métodos públicos 4.1.3.4 Métodos protegidos 4.1.3.5 El uso de TextureBrush en una forma Web 4.1.4 La clase HatchBrush 4.1.4.1 Constructores públicos 4.1.4.2 Propiedades públicas 4.1.4.3 Métodos públicos 4.1.4.4 Métodos protegidos 4.1.4.5 El uso de HatchBrush en una forma Web 4.1.5 La clase LinearGradientBrush 4.1.5.1 Constructores públicos 4.1.5.2 Propiedades públicas 4.1.5.3 Métodos públicos 4.1.5.4 Métodos protegidos 4.1.5.5 El uso de LinearGradientBrush en una forma Web 4.1.6 La clase PathGradientBrush 4.1.6.1 Constructores públicos 4.1.6.2 Propiedades públicas 4.1.6.3 Métodos públicos 5 Jenaro C. Paz ________________________________________________________________________ 4.1.6.4 Métodos protegidos 4.1.6.5 El uso de PathGradientBrush en una forma Web 4.2 Uso de plumas en GDI+ 4.2.1 Clase Pens 4.2.1.1 Propiedades públicas 4.2.2 Clase Pen 4.2.2.1 Constructores públicos 4.2.2.2 Propiedades públicas 4.2.2.3 Métodos públicos 4.2.2.4 Métodos protegidos 4.2.2.5 El uso de diferente tipo de plumas en una forma Web 4.3 Transformaciones con plumas 4.4 Transformaciones con pinceles 4.4.1 Transformaciones para TextureBrush 4.4.2 Transformaciones para LinearGradientBrush 4.4.3 Transformaciones para PathGradientBrush 4.5 Plumas y pinceles del Sistema 4.5.1 Colores del Sistema 4.5.1.1 Clase SystemColors 4.5.1.1.1 Propiedades públicas 4.5.2 Plumas del Sistema 4.5.2.1 Clase SystemPens 4.5.2.1.1 Propiedades públicas 4.5.3 Pinceles del Sistema 4.5.3.1 Clase SystemBrushes 4.5.3.1.1 Propiedades públicas Capítulo 5 Fuentes y Texto 5.1 Trabajando con Fuentes 5.1.1 Clase FontFamily 5.1.1.1 Constructores públicos 5.1.1.2 Propiedades públicas 5.1.1.3 Métodos públicos 5.1.1.4 Métodos protegidos 5.1.2 Clase Font 5.1.2.1 Constructores públicos 5.1.2.2 Propiedades públicas 5.1.2.3 Métodos públicos 5.1.2.4 Métodos protegidos 5.1.3 Miembros de la enumeración FontStyle 5.1.4 Miembros de la enumeración GraphicsUnit 5.2 Trabajando con Cadenas de Caracteres 5.2.1 Dibujando Cadenas de caracteres con formato 5.2.1.1 Clase StringFormat 5.2.1.1.1 Constructores públicos 5.2.1.1.2 Propiedades públicas 5.2.1.1.3 Métodos públicos 6 Textos Universitarios / Serie Docencia ________________________________________________________________________ 5.2.1.1.4 Métodos protegidos 5.2.1.2 Alineación y recorte de Cadenas de caracteres 5.2.1.2.1 Enumeración StringAlignment 5.2.1.2.1.1 Miembros 5.2.1.2.2 Enumeración StringTrimming 5.2.1.2.2.1 Miembros 5.2.1.3 Uso de tabuladores para el texto 5.2.1.4 Formato en el Texto 5.2.1.4.1 Enumeración StringFormatFlags 5.2.1.4.1.1 Miembros 5.2.1.5 Presentación de Texto con calidad 5.2.1.5.1 Enumeración TextRenderingHint 5.2.1.5.1.1 Miembros 5.2.1.6 Transformando Texto Capítulo 6 Rectángulos, trazados, regiones y recortes 6.1 Dibujo y rellenado de Rectángulos 6.1.1 Enumeración PenAlignment 6.1.1.1 Miembros 6.2 Trazados 6.2.1 Clase GraphicsPath 6.2.1.1 Constructores públicos 6.2.1.2 Propiedades publicas 6.2.1.3 Métodos públicos 6.2.1.4 Métodos protegidos 6.2.2 Recorte con Trazados 6.3 Regiones (Me falta escribir sobre esto) 6.3.1 Clase Region 6.3.1.1 Constructores públicos 6.3.1.2 Métodos públicos 6.3.1.3 Métodos protegidos 6.4 Regiones y recortado Capítulo 7 Biblioteca de Clases y la generación de Gráficas 7.1 Dibujo de Marcos y Bordes con gLibrary 7.2 Dibujo de cuatro tipos de Gráficas con gImage 7.2.1 Gráficas de Columnas 7.2.2 Gráficas de Líneas 7.2.3 Gráficas de Barra 7.2.4 Gráficas de Columnas en 3D Capítulo 8 Procesamiento digital de imágenes 8.1 Introducción 8.1.1 Bitmaps (mapas de bits) 8.1.2 Representación vectorial de los colores 8.1.3 Clase BitmapData 7 Jenaro C. Paz ________________________________________________________________________ 8.1.3.1 Constructores públicos 8.1.3.2 Propiedades públicas 8.1.3.3 Métodos públicos 8.1.3.4 Métodos protegidos 8.2 Procesamiento de imágenes 8.2.1 Modificación de Color 8.2.1.1 Detección de orillas 8.2.1.2 Escala de grises 8.2.1.3 Inversión 8.2.1.4 Brillo 8.2.1.5 Contraste 8.2.1.6 Modificación de Colores 8.2.2 Modificación de la Imagen 8.2.2.1 Inversión de Imagen 8.2.2.2 Reflexión de Imagen 8.2.2.3 Escalamiento 8.2.2.4 Rotación de Imagen 8.2.2.5 Perspectiva Horizontal 8.2.2.6 Perspectiva Vertical 8.2.2.7 Inclinación Horizontal 8.2.2.8 Inclinación Vertical 8.2.3 generación de efectos por Convolución 8.2.3.1 Borrado Gaussiano (Blur) 8.2.3.2 Emboss 8.2.3.3 Sharpen 8.2.3.4 Smooth 8.2.3.5 Mean Renoval 8.2.3.6 Edge Detection Quick 8.2.3.7 Detección de orillas por Convolución método Sobel 8.2.3.8 Detección de orillas por Convolución método Prewitt 8.2.3.9 Detección de orillas por Convolución método Kirsh Capítulo 9 Representación matricial de Transformaciones 9.1 Matrices 9.2 Transformaciones con Matrices 9.2.1 Transformaciones Compuestas 9.3 Clase Matriz 9.3.1 Constructores públicos 9.3.2 Propiedades públicas 9.3.3 Métodos públicos 9.3.4 Métodos protegidos 8 Textos Universitarios / Serie Docencia ________________________________________________________________________ Introducción1 Dentro del contexto de las nuevas Tecnologías de Microsoft, para el desarrollo de una Aplicación Web utilizamos • • • Framework.NET de Microsoft Servidor MSSQL, para las bases de datos, tablas y procedimientos almacenados Visual Studio.NET que es un IDE para el desarrollo de aplicaciones con tecnologías .NET El Framework.NET es una nueva plataforma informática que simplifica el desarrollo de aplicaciones en un entorno altamente distribuido como es Internet. El diseño del Framework.NET estuvo enfocado a cumplir los objetivos siguientes: • • • • • • Proporcionar un entorno coherente de programación orientada a objetos, en el que el código de los objetos se pueda almacenar y ejecutar de forma local, ejecutar de forma local pero distribuida en Internet o ejecutar de forma remota. Proporcionar un entorno de ejecución de código que reduzca al máximo posible la implementación de software y los conflictos de versiones. Ofrecer un entorno de ejecución de código que garantice la ejecución segura del mismo, incluso del creado por terceras personas desconocidas o que no son de plena confianza. Proporcionar un entorno de ejecución de código que elimine los problemas de rendimiento de los entornos en los que se utilizan secuencias de comandos o intérpretes de comandos. Ofrecer al programador una experiencia coherente entre tipos de aplicaciones muy diferentes, como las basadas en Windows o en el Web. Basar toda la comunicación en estándares del sector para asegurar que el código del Framework.NET se puede integrar con otros tipos de código. El Framework.NET contiene dos componentes principales: CLR (Common Language Runtime) y la biblioteca de clases del Framework.NET. El CLR es el fundamento de la tecnología, el motor de tiempo de ejecución. Se puede considerar como un agente que administra el código en tiempo de ejecución y proporciona servicios centrales, como la administración de memoria, la administración de subprocesos y la interacción remota, al tiempo que aplica una seguridad estricta a los tipos y otras formas de especificación del código que garantizan su seguridad y solidez. De hecho, el concepto de administración de código es un principio básico del motor de tiempo de ejecución. El código destinado al motor de tiempo de ejecución se denomina código administrado, a diferencia del resto de código, que se conoce como código no administrado. La biblioteca de clases, el otro componente principal del Framework.NET, es una colección completa de tipos reutilizables orientada a objetos que se puede emplear para desarrollar 1 Traducción de la referencia en línea de MSDN (Microsoft Developer Network) por J.C. Paz http://msdn2.microsoft.com/en-us/library/zw4w595w.aspx junio 3 de 2006 9 Jenaro C. Paz ________________________________________________________________________ aplicaciones que abarcan desde las tradicionales herramientas de interfaz gráfica de usuario (GUI) o de línea de comandos hasta las aplicaciones basadas en las innovaciones más recientes proporcionadas por ASP.NET, como los formularios Web Forms y los servicios Web XML. El Framework.NET puede alojarse en componentes no administrados que cargan al CLR en sus procesos e inician la ejecución de código administrado, con lo que se crea un entorno de software en el que se pueden utilizar características administradas y no administradas. El Framework.NET no sólo provee varios hosts de tiempo de ejecución, sino que también se admite el desarrollo de hosts por parte de terceros. Por ejemplo, ASP.NET aloja el motor de tiempo de ejecución para proporcionar un entorno de servidor escalable para el código administrado. ASP.NET trabaja directamente con el motor de tiempo de ejecución para habilitar aplicaciones de ASP.NET y servicios Web XML, que se tratan más adelante en este tema. Internet Explorer es un ejemplo de aplicación no administrada que aloja el motor de tiempo de ejecución (en forma de una extensión de tipo MIME). Al usar Internet Explorer para alojar el motor de tiempo de ejecución, puede incrustar componentes administrados o controles de Windows Forms en documentos HTML. Al alojar el motor de tiempo de ejecución de esta manera se hace posible el uso de código móvil administrado (similar a los controles de Microsoft® ActiveX®), pero con mejoras significativas que sólo el código administrado puede ofrecer, como la ejecución semiconfiable y el almacenamiento en archivos aislado. En la ilustración siguiente se muestra la relación de CLR y la biblioteca de clases con las aplicaciones y el sistema en su conjunto. En la ilustración se representa igualmente cómo funciona el código administrado dentro de una arquitectura mayor. .NET Framework en contexto Figura I.1. Framework de Microsoft 10 Textos Universitarios / Serie Docencia ________________________________________________________________________ En las secciones siguientes se describen con más detalle las componentes y características principales del Framework.NET. Características del CLR El Common Language Runtime administra la memoria, la ejecución de subprocesos, la ejecución de código, la comprobación de la seguridad del código, la compilación y demás servicios del sistema. Estas características son intrínsecas del código administrado que es ejecutado por el CLR. Con respecto a la seguridad, los componentes administrados reciben grados de confianza diferentes, en función de una serie de factores entre los que se incluye su origen (como Internet, red empresarial o equipo local). Esto significa que un componente administrado puede ser capaz o no de realizar operaciones de acceso a archivos, operaciones de acceso al Registro y otras funciones delicadas, incluso si se está utilizando en la misma aplicación activa. El motor de tiempo de ejecución impone seguridad en el acceso al código. Por ejemplo, los usuarios pueden confiar en que un archivo ejecutable incrustado en una página Web puede reproducir una animación en la pantalla o reproducir una canción, pero no puede tener acceso a sus datos personales, sistema de archivos o red. Por ello, las características de seguridad del motor de tiempo de ejecución permiten que el software legítimo implementado en Internet sea excepcionalmente rico en contenido. Además, el motor de tiempo de ejecución impone la solidez del código mediante la implementación de una infraestructura estricta de comprobación de tipos y código denominada CTS (Common Type System, Sistema de tipos común). CTS garantiza que todo el código administrado es auto descriptivo. Los diferentes compiladores de lenguajes de Microsoft y de terceros generan código administrado que se ajusta a CTS. Esto significa que el código administrado puede usar otros tipos e instancias administradas, al tiempo que se aplica inflexiblemente la fidelidad y seguridad de los tipos. Además, el entorno administrado del motor de tiempo de ejecución elimina muchos problemas de software comunes. Por ejemplo, el motor de tiempo de ejecución controla automáticamente la disposición de los objetos, administra las referencias a éstos y los libera cuando ya no se utilizan. Esta administración automática de la memoria soluciona los dos errores más comunes de las aplicaciones: la pérdida de memoria y las referencias no válidas a la memoria. 11 Jenaro C. Paz ________________________________________________________________________ Además, el motor de tiempo de ejecución aumenta la productividad del programador. Por ejemplo, los programadores pueden crear aplicaciones en el lenguaje que prefieran y seguir sacando todo el provecho del motor de tiempo de ejecución, la biblioteca de clases y los componentes escritos en otros lenguajes por otros programadores. El proveedor de un compilador puede elegir destinarlo al motor de tiempo de ejecución. Los compiladores de lenguajes que se destinan al Framework.NET hacen que las características del Framework.NET estén disponibles para el código existente escrito en dicho lenguaje, lo que facilita enormemente el proceso de migración de las aplicaciones existentes. Aunque el motor de tiempo de ejecución está diseñado para el software del futuro, también es compatible con el software actual y el software antiguo. La interoperabilidad entre el código administrado y no administrado permite que los programadores continúen utilizando los componentes COM y las DLL que necesiten. El motor de tiempo de ejecución está diseñado para mejorar el rendimiento. Aunque Common Language Runtime proporciona muchos servicios estándar de motor de tiempo de ejecución, el código administrado nunca se interpreta. Una característica denominada compilación JIT (Just-In-Time) permite ejecutar todo el código administrado en el lenguaje máquina nativo del sistema en el que se ejecuta. Mientras tanto, el administrador de memoria evita que la memoria se pueda fragmentar y aumenta la zona de referencia de la memoria para mejorar aún más el rendimiento. Por último, el motor de tiempo de ejecución se puede alojar en aplicaciones de servidor de gran rendimiento, como Microsoft® SQL Server™ e IIS (Servicios de Internet Information Server). Esta infraestructura permite utilizar código administrado para escribir su lógica de negocios, al tiempo que se disfruta del rendimiento superior de los servidores empresariales que puedan alojar al motor de tiempo de ejecución. Biblioteca de clases de .NET Framework La biblioteca de clases del Framework.NET es una colección de tipos reutilizables que se integran estrechamente con el CLR. La biblioteca de clases es orientada a objetos, lo que proporciona tipos de los que su propio código administrado puede derivar funcionalidad. Esto ocasiona que los tipos de .NET Framework sean sencillos de utilizar y reduce el tiempo asociado con el aprendizaje de las nuevas características del Framework.NET. Además, los componentes de terceros se pueden integrar sin dificultades con las clases del Framework.NET. Por ejemplo, la colección de clases de del Framework.NET implementan un conjunto de interfases que se pueden usar para desarrollar sus propia colección de clases. Éstas se combinarán fácilmente con las clases de Framework.NET. 12 Textos Universitarios / Serie Docencia ________________________________________________________________________ Como en cualquier biblioteca de clases orientada a objetos, los tipos de Framework.NET permiten realizar diversas tareas comunes de programación, como son la administración de cadenas, recopilación de datos, conectividad a bases de datos y acceso a archivos. Además de estas tareas habituales, la biblioteca de clases incluye tipos adecuados para diversos escenarios de desarrollo especializados. Por ejemplo, puede utilizar Framework.NET para desarrollar los siguientes tipos de aplicaciones y servicios: • • • • • Aplicaciones de consola Aplicaciones GUI de Windows (Windows Forms) Aplicaciones de ASP.NET Servicios Web XML Servicios de Windows Por ejemplo, las clases de Windows Forms son un conjunto completo de tipos reutilizables que simplifican enormemente el desarrollo de interfaces GUI para Windows. Si escribe una aplicación Web Form de ASP.NET, puede utilizar las clases de Web Forms. Desarrollo de aplicaciones cliente Las aplicaciones cliente constituyen lo más parecido a una aplicación de estilo tradicional en la programación basada en Windows. En este tipo de aplicaciones se muestran ventanas o formularios en el escritorio, lo que permite al usuario realizar una tarea. Entre las aplicaciones cliente se incluyen los procesadores de texto y las hojas de cálculo, además de aplicaciones de negocios tales como herramientas con entrada de datos, de informes, etcétera. En las aplicaciones cliente se suelen emplear ventanas, menús, botones y otros elementos de la interfaz gráfica de usuario, y suelen tener acceso a recursos locales como el sistema de archivos y a dispositivos periféricos como las impresoras. Otro tipo de aplicación cliente es el tradicional control ActiveX (reemplazado ahora por el control administrado de Windows Forms) implementado en Internet como una página Web. Esta aplicación es muy parecida a otras aplicaciones cliente: se ejecuta de forma nativa, tiene acceso a los recursos locales e incluye elementos gráficos. En el pasado, los programadores creaban esas aplicaciones mediante C o C++ en combinación con MFC (Microsoft Foundation Classes) o con un entorno RAD (Rapid Application Development, desarrollo rápido de aplicaciones) como Microsoft® Visual Basic®. En Framework.NET se incorporan aspectos de estos productos, que siguen existiendo, en un único entorno de desarrollo coherente que simplifica de forma espectacular el desarrollo de las aplicaciones cliente. 13 Jenaro C. Paz ________________________________________________________________________ Las clases de Windows Forms contenidas en Framework.NET están diseñadas para utilizarse en el desarrollo de GUI. Puede crear ventanas, botones, menús, barras de herramientas y demás elementos de pantalla fácilmente con la flexibilidad requerida para adaptarse a la evolución de las necesidades de negocio. Por ejemplo, .NET Framework proporciona propiedades simples para ajustar los atributos visuales asociados con los formularios. En determinadas circunstancias, el sistema operativo subyacente no permite cambiar estos atributos directamente y, entonces, Framework.NET vuelve a crear los formularios de forma automática. Ésta es una de las múltiples maneras en que Framework.NET integra la interfaz del programador, con lo que la creación de código resulta más sencilla y más coherente. A diferencia de los controles ActiveX, los controles de Windows Forms tienen acceso al equipo de del usuario con semiconfianza. Esto significa que el código binario o que se ejecuta de forma nativa puede tener acceso a algunos de los recursos del sistema del usuario (como elementos de la GUI y acceso limitado a los archivos) sin tener acceso ni comprometer los demás recursos. Debido a la seguridad de acceso a código, muchas aplicaciones que antes era necesario instalar en el sistema de un usuario, ahora se pueden implementar con seguridad a través del Web. Las aplicaciones pueden tener las características de una aplicación local a la vez que se implementan como una página Web. Desarrollo de aplicaciones de servidor Las aplicaciones de servidor en entornos administrados se implementan mediante hosts de tiempo de ejecución. Las aplicaciones no administradas alojan al CLR, que permite al código administrado controlar el comportamiento del servidor. Este modelo proporciona todas las características de Common Language Runtime y la biblioteca de clases, además de obtener el rendimiento y la escalabilidad del servidor anfitrión. En la ilustración siguiente se muestra un esquema de red básico donde se ejecuta código administrado en diferentes entornos de servidor. Los servidores como IIS y SQL Server pueden realizar operaciones estándar mientras la lógica de la aplicación se ejecuta en el código administrado. 14 Textos Universitarios / Serie Docencia ________________________________________________________________________ Código administrado en el servidor Figura I.2. Código administrado ASP.NET es el albergue que permite a los programadores utilizar Framework.NET en las aplicaciones Web. Sin embargo, ASP.NET no es sólo un albergue del motor de tiempo de ejecución: se trata de una arquitectura completa para el desarrollo de sitios Web y de objetos distribuidos en Internet mediante código administrado. Los formularios Web y los servicios Web XML utilizan el IIS y ASP.NET como mecanismos de publicación de las aplicaciones, ambos disponen de una colección de clases de soporte en el Framework.NET. Los servicios Web XML, que constituyen una evolución importante de la tecnología basada en el Web, son componentes distribuidos de aplicaciones de servidor similares a los sitios Web. Sin embargo, a diferencia de las aplicaciones basadas en el Web, los componentes de servicios Web XML no tienen interfaz de usuario y no están orientados a exploradores como Internet Explorer y Netscape Navigator. En su lugar, los servicios Web XML constan de componentes de software reutilizables diseñados para que los utilicen otras aplicaciones, como aplicaciones cliente tradicionales, aplicaciones basadas en el Web o, incluso, otros servicios Web XML. Como resultado, la tecnología de servicios Web XML está impulsando de manera rápida el desarrollo y la implementación de aplicaciones hacia el entorno altamente distribuido de Internet. Si ha utilizado versiones anteriores de la tecnología ASP, apreciará de inmediato las mejoras que ofrecen ASP.NET y Web Forms. Por ejemplo, puede desarrollar páginas de Web Forms en cualquier lenguaje compatible con Framework.NET. Además, ya no es necesario que el código comparta el mismo archivo con el texto HTTP (aunque puede seguir haciéndolo, si lo prefiere). Los formularios Web se ejecutan en lenguaje máquina nativo porque, al igual que todas las aplicaciones administradas, sacan todo el provecho del motor de tiempo de ejecución. En cambio, las páginas ASP no administradas siempre utilizan secuencias de comandos e intérpretes de comandos. El desarrollo de páginas de ASP.NET es más rápido, más funcional y más sencillo que el desarrollo de páginas ASP no administradas, porque interactúan con el motor de tiempo de ejecución como una aplicación administrada. 15 Jenaro C. Paz ________________________________________________________________________ El Framework.NET proporciona también una colección de clases y herramientas para ayudar al desarrollo y uso de las aplicaciones de servicios Web XML. Los servicios Web XML se basan en estándares como SOAP (un protocolo de llamadas a procedimientos remotos), XML (un formato de datos extensible) y WSDL (el Lenguaje de descripción de servicios Web). En Framework.NET se utilizan estos estándares para fomentar la interoperabilidad con soluciones que no son de Microsoft. Por ejemplo, la herramienta de WSDL incluida en Framework.NET SDK puede consultar un servicio Web XML publicado en el Web, analizar su descripción WSDL y producir código fuente de C# o Visual Basic que la aplicación puede utilizar para convertirse en cliente del servicio Web XML en cuestión. El código fuente puede crear clases derivadas de las clases de la biblioteca de clases que controlan completamente la comunicación subyacente mediante SOAP y análisis de XML. Aunque puede utilizar la biblioteca de clases para usar los servicios Web XML directamente, la herramienta WSDL y las demás herramientas incluidas en el SDK facilitan el trabajo de desarrollo con Framework.NET. Si desarrolla y publica su propio servicio Web XML, Framework.NET proporciona un conjunto de clases que cumplen todos los estándares de comunicación subyacentes, como SOAP, WSDL y XML. El uso de esas clases le permite centrarse en la lógica del servicio, sin preocuparse de la infraestructura de comunicaciones que se requiere en el desarrollo de software distribuido. Por último, al igual que los formularios Web en un entorno administrado, el servicio Web XML se ejecutará con la velocidad del lenguaje máquina nativo mediante la comunicación escalable de IIS. 16 Textos Universitarios / Serie Docencia ________________________________________________________________________ Capítulo 12 GDI+: La nueva Generación en Interfases gráficas Comenzaremos diciendo que el GDI+ de Microsoft es la parte del los sistemas operativos Windows XP o Windows Server 2003 que provee gráficos vectoriales en dos dimensiones, compatibilidad de imágenes y tipografía. Es también una mejora del GDI incluida en los sistemas operativos de Windows anteriores a XP. GDI+ reside en un conjunto de clases que presentan compatibilidad con la versión anterior de GDI y mediante esta biblioteca de clases se pueden escribir aplicaciones independientes de dispositivos, lo que permite al programador hacer llamadas a los métodos proporcionados por las clases de GDI+ y estos métodos a su vez se encargan de llamar a los controladores de dispositivos necesarios para que la aplicación se ejecute sin problema. GDI+ está disponible como un redistribuible para Windows NT 4.0 SP6, Windows 2000, Windows 98 y Windows Me. Para descargar el último redistribuible, entre al sitio: http://www.microsoft.com/downloads Y haga la búsqueda de Platform SDK Redistributable: GDI+, luego baje el archivo gdiplus_dnld.exe, el cual al momento de ejecutar le permitirá escoger el árbol de directorios a usar. Tenga en cuenta que este redistribuible únicamente será necesario cuando se vaya a instalar en la misma computadora un programa ejecutable que fue elaborado haciendo uso de esta nueva tecnología. Además, GDI+ es una componente del CLR (Common Language Runtime) del Framework .NET de Microsoft. Este ultimo que es descargable gratuitamente desde: http://msdn.microsoft.com/netframework/ Es el modelo de programación de la plataforma .NET. Los componentes clave del Framework.NET como se indicó en la introducción son: • • • Common Language Runtime (motor de ejecución del código administrado generado por compiladores de Visual Basic .NET, C#, J# y JScript .NET) Bibliotecas de clases unificadas (la biblioteca de clases del Framework .NET es una biblioteca de clases, interfases y tipos de valor que se incluye en el SDK del Framework .NET de Microsoft. Esta biblioteca brinda acceso a la funcionalidad del sistema y es la base sobre la que se crean las aplicaciones, los componentes y los controles del Framework .NET) Componentes ASP.NET (ASP.NET es más que una nueva versión de las páginas Active Server, es una plataforma de programación Web unificada que proporciona los servicios necesarios para que los programadores creen 2 Traducción de la referencia en línea de MSDN (Microsoft Developer Network) por J.C. Paz http://msdn.microsoft.com/library/en-us/gdicpp/GDIPlus/AboutGDIPlus/IntroductiontoGDIPlus junio 3 de 2006. 17 Jenaro C. Paz ________________________________________________________________________ aplicaciones Web para la empresa. que proporciona un modelo de programación y una estructura nuevos para crear aplicaciones más seguras, escalables y estables. A la hora de crear una aplicación ASP.NET, se pueden utilizar formularios Web Forms o servicios Web XML o combinarlas de la manera que más les convenga. Las dos características son compatibles con la misma infraestructura, que permite utilizar esquemas de autenticación, almacenar en caché datos que se utilizan con frecuencia y personalizar la configuración de la aplicación, entre otras muchas cosas.). Es conveniente aclarar que hay dos versiones del Framework .Net • El Redistribuible, si desea ejecutar aplicaciones Windows en su computadora que fueron elaboradas con esta nueva tecnología y • La versión de Programador que incluye todo lo que los desarrolladores de software necesitan para escribir, probar y poner en producción aplicaciones Framework.NET, además incluye documentación, ejemplos, herramientas de línea de comando y compiladores. Debe de instalarse primeramente el redistribuible. Dentro de las características para gráficos de 2D, GDI+ soporta: • • • • • • • • • • • Compatibilidad de mezcla alfa para todos los gráficos antiguos Anti-alias Rellenos de textura y degradado Líneas gruesas Curvas spline cardinales Regiones dimensionables Coordenadas de punto flotante Líneas compuestas Lápiz insertado Dimensionalidad y filtrado de alta calidad Varios estilos de línea y opciones para extremos La compatibilidad de imágenes incluye lo siguiente: • • • • 18 Compatibilidad original para formatos de archivos de imagen como .jpeg, .png, .gif, .bmp, .tiff, .exif e .icon Interfases comunes para la codificación y decodificación de formatos de imágenes de trama con carácter arbitrario Arquitectura extensible para agregar de forma dinámica nuevos formatos de archivos de imagen Compatibilidad de procesamiento de imágenes originales para operaciones comunes relacionadas con puntos como brillo, contraste, color, equilibrio, difuminación y disolución. Compatibilidad de transformaciones comunes como rotación o cortes, entre otras. Textos Universitarios / Serie Docencia ________________________________________________________________________ Administración de color • Compatibilidad con sRGB, ICM2 y sRGB64 La compatibilidad tipográfica incluye lo siguiente: • • • • • • Compatibilidad original ClearType Texto rellenado con textura y degradado Compatibilidad total con Unicode en todas las plataformas Compatibilidad con todas las secuencias de comandos de Windows 2000 Actualización con los estándares de Unicode 3.0 Compatibilidad con servicios de línea de texto para una mejor lectura textual Las clases de GDI+ residen en los siguientes seis espacios de nombres System.Drawing, System.Drawing.Design, System.Drawing.Drawing2D, System.Drawing.Imaging, System.Drawing.Printing y System.Drawing.Text. Todos estos espacios de nombres se encuentran en el ensamblado System.Drawing.DLL. Figura 1.1. Espacio de nombres System.Drawing Para usar cualquier clase definida en estos espacios de nombres, hay que incluirlos en su aplicación. 19 Jenaro C. Paz ________________________________________________________________________ 1.1 Superficies de dibujo y sistemas de Coordenadas en GDI+3 Es esencial entender lo que es una superficie de dibujo y conocer los sistemas de coordenadas de GDI+ para poder escribir aplicaciones que tengan que ver con la generación de gráficos en línea. 1.1.1 Superficies de dibujo Cualquier aplicación para dibujo consiste de los siguientes componentes: • El lienzo (canvas), que viene siendo el espacio donde los diferentes objetos se dibujarán, en una aplicación Web, la forma Web es el lienzo. • Un pincel (brush) o una pluma (pen) es el color, la textura y la dimensión de los objetos que se van a dibujar en el lienzo. • El procedimiento indica como los objetos se dibujan en el lienzo. Cada superficie de dibujo cuenta con cuatro propiedades: ancho, alto, resolución y profundidad de color. • El ancho y alto de una superficie determinan su tamaño y estos están especificados por el número de pixeles tanto horizontal como verticalmente. Entendemos un píxel como el elemento más pequeño que participa en un proceso de dibujo para desplegar objetos gráficos o imágenes en la pantalla. La densidad de pixeles se representa por el valor de puntos por pulgada (dpi). • La resolución de una superficie es una medida de la calidad de la imagen en puntos por pulgada (dpi). • La profundidad de color de una superficie es el número de colores que puede tener un píxel. La calidad de un píxel es directamente proporcional a la profundidad de color. La estructura Color representa un color en GDI+. Mas adelante en este capitulo ahondaremos sobre este tópico. 1.1.2 Sistemas de Coordenadas El Sistema de coordenadas representa las posiciones de los objetos gráficos en un dispositivo de despliegue como monitores o impresoras. El sistema de coordenadas de GDI+ tiene como origen la esquina superior izquierda. El eje x apunta hacia la derecha y el eje y apunta hacia abajo 3 Traducción de la referencia en línea de MSDN (Microsoft Developer Network) por J.C. Paz http://msdn.microsoft.com/library/en-us/gdicpp/GDIPlus/aboutGDIPlus/ coordinatesystemsandtransformations/ typesofcoordinatesystems.asp junio 3 de 2006 20 Textos Universitarios / Serie Docencia ________________________________________________________________________ Figura 1.2. Sistema de Coordenadas de GDI+ Puntos con valores negativos de x ó y no son visibles en este sistema de coordenadas, sin embargo mediante transformaciones puede trasladarse el origen para que objetos con valores negativos puedan mostrarse. GDI+ usa tres espacios de coordenadas: mundiales, de página y de dispositivo. Cuando se hace la llamada g.DrawLine(myPen,0,0,100,150), los puntos que se le pasan al método DrawLine [ (0,0) y (100,150)] están dados en el espacio de coordenadas mundiales. Antes que GDI+ pueda dibujar la línea en la pantalla, las coordenadas pasan por una serie de transformaciones. Una transformación convierte las coordenadas mundiales a coordenadas de página y otra transformación convierte estas últimas a coordenadas de dispositivo. Suponga que se va a trabajar con un sistema de coordenadas que tiene su origen en el cuerpo del área del cliente a 50 pixeles de la orilla izquierda y a 50 pixeles de la orilla superior como se muestra a continuación. Figura 1.3. Sistema de Coordenadas trasladado con respecto al origen Cuando se llama el método g.DrawLine(myPen,0,0,100,150) se obtiene una línea como la mostrada a continuación 21 Jenaro C. Paz ________________________________________________________________________ Figura 1.4. Línea en el Sistema de Coordenadas trasladado Las coordenadas de los puntos extremos en los tres sistemas de coordenadas son: Mundiales (0,0) (100,150) Página (50,50) (150,200) Dispositivo (50,50) (150,200) Note que el sistema de coordenadas de página tiene su origen en la esquina superior izquierda del área del cliente y que debido a que la unidad de medida es el píxel, el espacio de coordenadas de dispositivo es el mismo, pero que si la unidad de medida fuera por ejemplo el centímetro entonces habría una diferencia entre los tres sistemas de coordenadas. La transformación que convierte al sistema de coordenadas mundial al sistema de coordenadas de página se llama transformación mundial y esta sustentada por el objeto Graphics. En el ejemplo anterior la Transformación consiste en una translación de 50 unidades en el eje x así como también en el eje de las y. En el siguiente ejemplo se establece una transformación mundial para un objeto Graphics y luego se utiliza este para dibujar la línea del ejemplo anterior. g.TranslateTransform(50.0F,50.0F); g.DrawLine(myPen,0,0,100,150); Figura 1.5. Línea dibujada por GDI+ 22 Textos Universitarios / Serie Docencia ________________________________________________________________________ La transformación que convierte al sistema de coordenadas de página al sistema de dispositivo se llama transformación de página, también está sustentada por el objeto Graphics mediante las propiedades PageUnit y PageScale conteniendo también las propiedades DpiX y DpiY, que sirven para investigar el número de pixeles por pulgada tanto en el eje x como en el y. Se puede usar la propiedad PageUnit de la clase Graphics para especificar la unidad de medida a usar. El siguiente ejemplo dibuja una línea de (0,0) a (1,2) donde el punto (1,2) se encuentra a 1 pulgada a la derecha y 2 pulgadas hacia abajo de (0,0). g.PageUnit=GraphicsUnit.Inch; g.TranslateTransform(0.5F,0.5F); Pen myPen= new Pen(Color.Red, 2/g.DpiX); Pen myPen2= new Pen(Color.Blue,1/g.DpiX); g.DrawLine(myPen2,0,0,2,0); g.DrawLine(myPen2,0,0,0,2); g.DrawLine(myPen, 0, 0, 1, 2); donde myPen y myPen2 deben estar definidas de la manera anterior para que tenga un grosor de 2 pixeles y 1 pixel y no de 2 y 1 pulgadas GraphicsUnit4 es una enumeración que contiene los elementos: Nombre de miembro Display Document Inch Millimeter Pixel Point World Descripción Especifica 1/75 de pulgada como unidad de medida. Especifica la unidad del documento (1/300 de pulgada) como unidad de medida. Especifica que la pulgada es la unidad de medida. Especifica que el milímetro es la unidad de medida. Especifica que un píxel de dispositivo es la unidad de medida. Especifica que un punto de la impresora (1/72 de pulgada) es la unidad de medida. Especifica que la unidad universal es la unidad de medida. Tabla 1.1. Enumeración GraphicsUnit 4 Traducción de la referencia en línea de MSDN (Microsoft Developer Network) por J.C. Paz http://msdn.microsoft.com/library/en-us/cpref/html/frlrfSystemDrawingGraphicsUnitClassTopic.asp junio 3 2006 23 Jenaro C. Paz ________________________________________________________________________ Si suponemos que el dispositivo de despliegue (pantalla) tiene 72 puntos por pulgada en ambas direcciones, los puntos extremos de la línea en el ejemplo anterior tienen los siguientes valores en los tres espacios de coordenadas: Mundiales (0,0) (1,2) Página (0.5,0.5) (1.5,2.5) Dispositivo (36,36) (108,180) La Figura 1.6 muestra este ejemplo y lo dicho anteriormente: Figura 1.6. Llínea dibujada por GDI+ donde se ha trasladado el origen y cambiado la especificación de unidades En el Capítulo 10 trataremos con las Matrices que representan a las Transformaciones. 1.2 Estructuras Esenciales Estructuras frente a clases Las estructuras pueden parecer muy similares a las clases, pero existen diferencias importantes que se deben tener en cuenta. En primer lugar, las clases son tipos de referencia mientras que las estructuras son tipos de valor. Mediante las estructuras, se pueden crear objetos que se comportan como los tipos basicos - Boolean, Byte, Char, Decimal, Double, Int16, Int32, Int64, SByte, Single, UInt16, UInt32, UInt64 - y aprovechar sus beneficios. ¿Montón o pila? Cuando se realiza una llamada con el operador New sobre una clase, se asigna espacio en el montón (heap). Sin embargo, cuando se crea una instancia de una estructura, el espacio se asigna en la pila (stack). De esta forma, se consigue mejorar el rendimiento. Además, a 24 Textos Universitarios / Serie Docencia ________________________________________________________________________ diferencia de las clases, no tendrá que tratar con referencias a instancias de estructuras. Se trabaja directamente con la instancia de la estructura. Debido a esto, cuando se pasa una estructura a un método, se pasa por valor en vez de como una referencia. Constructores y herencia Las estructuras pueden declarar constructores, pero deben utilizar parámetros. Es un error declarar un constructor predeterminado (sin parámetros) para una estructura. Los miembros de una estructura no pueden tener inicializadores. Siempre existe un constructor predeterminado que inicializa los miembros de la estructura con sus valores predeterminados. Cuando se crea un objeto struct mediante el operador new, se crea y se llama al constructor apropiado. A diferencia de las clases, se pueden crear instancias de las estructuras sin utilizar el operador New. Si no se utiliza New, los campos permanecerán sin asignar y el objeto no se podrá utilizar hasta haber inicializado todos los campos. A diferencia de las clases, para las estructuras no existe herencia. Una estructura no puede heredar de otra estructura o clase, ni puede ser la base de una clase. Sin embargo, las estructuras heredan de la clase base object. Una estructura puede implementar interfases del mismo modo que las clases. Conclusión Las estructuras son sencillas de utilizar y pueden resultar muy útiles en ocasiones. Simplemente, tenga en cuenta que se crean en la pila y que no se utilizan referencias a ellas, sino que se trata directamente con ellas. Siempre que necesite un tipo que se utilice a menudo y que trate con valores de datos, las estructuras constituyen una excelente opción. Cuando se programa para ambientes gráficos es muy común y casi necesario trabajar con los siguientes cuatro tipos de datos (definidos por estructuras): • • • • Puntos de coordenadas bidimensionales (forma entera y de punto flotante) Tamaños en términos de ancho y alto (forma entera y de punto flotante) Rectángulos (forma entera y de punto flotante) Colores Estas siete estructuras junto con CharacterRange son las ocho únicas estructuras definidas en el espacio de nombres System.Drawing5. Aunque en C# las clases y las estructuras son muy parecidas ya que sus métodos y campos (al igual que propiedades y eventos) son privados en ambas, difieren en que las clases son tipos referencia (o apuntadores a bloques de memoria) y las estructuras son tipos valor así como los tipos básicos -Boolean, Byte, Char, Decimal, Double, Int16, Int32, Int64, SByte, Single, UInt16, UInt32, UInt64-. Todas estas estructuras (véase Figura 1.2) descienden de 5 Traducción de la referencia en línea de MSDN (Microsoft Developer Network) por J.C. Paz http://msdn.microsoft.com/library/en-us/cpref/html/frlrfSystemDrawing.asp junio 3 2006 25 Jenaro C. Paz ________________________________________________________________________ System.ValueType y debe pensarse en este tipo de datos como objetos livianos o pequeños que se crean y destruyen con frecuencia. Figura 1.7. Herencia para las estructuras 1.2.1 Estructura Point (puntos bidimensionales) Point representa un par ordenado de coordenadas x (horizontal) e y (vertical) de enteros que define un punto en un plano bidimensional que puede ser la pantalla de una computadora o una hoja de papel en la impresora. 1.2.1.1 Constructores públicos Sobrecargado. Inicializa una nueva instancia de la clase Point con las coordenadas especificadas. Point (Constructor) Tabla 1.2. Miembros de la estructura Point Para crear un punto hay que utilizar el constructor de la siguiente manera: Point myPoint = new Point(5,12); int a=134; int b=65; Point zPoint = new Point(a,b); 1.2.1.2 Campos públicos Empty Representa un Point nulo. Ejemplos: Point aPoint = Point.Empty; 1.2.1.3 Propiedades públicas IsEmpty X Y 26 Obtiene un valor que indica si el objeto Point está vacío. Obtiene o establece la coordenada x de este objeto Point. Obtiene o establece la coordenada y de este Textos Universitarios / Serie Docencia ________________________________________________________________________ objeto Point. Ejemplos: Point aPoint = Point.Empty; aPoint.X = 20; aPoint.Y = 40; 1.2.1.4 Métodos públicos Ceiling Equals GetHashCode GetType (se hereda de Object) Offset Round ToString Truncate Convierte el objeto PointF especificado en un objeto Point redondeando los valores del objeto PointF a los valores enteros superiores siguientes. Reemplazado. Especifica si este objeto Point tiene las mismas coordenadas que el Object especificado. Reemplazado. Devuelve un código hash para este objeto Point. Obtiene el objeto Type de la instancia actual. Convierte este objeto Point en la cantidad especificada. Convierte el objeto PointF especificado en Point redondeando los valores del objeto Point a los valores enteros más cercanos. Reemplazado. Convierte esta estructura Point en una cadena legible para el usuario. Convierte el objeto PointF especificado al objeto Point mediante el truncamiento de los valores del objeto Point. Ejemplos: PointF bPoint=new PointF(20.5F,13.2F); Point cPoint=Point.Ceiling(bPoint); Point dPoint= new Point(20,13); Boolean bvar=bPoint.Equals(dPoint); int hCode=dPoint.GetHashCode(); Type oneType = dPoint.GetType(); dPoint.Offset(1,2); // p(21,15) Point ePoint=Point.Round(bPoint); String sPoint = ePoint.ToString(); Point hPoint = Point.Truncate(bPoint); 1.2.1.5 Operadores públicos y conversiones de tipos Operador de suma Convierte Point en Size especificado. 27 Jenaro C. Paz ________________________________________________________________________ Operador de igualdad Operador de desigualdad Operador de resta Conversión de Point a Size Conversión de Point a PointF Compara dos objetos Point. El resultado especifica si los valores de las propiedades X y Y de los dos objetos Point son iguales. Compara dos objetos Point. El resultado especifica si los valores de las propiedades X y Y de los dos objetos Point no son iguales. Convierte un objeto Point en la cantidad negativa del objeto Size especificado. Crea un nuevo objeto Size con las coordenadas del objeto Point especificado. Crea un nuevo objeto PointF con las coordenadas del objeto Point especificado. Ejemplos: Point hPoint Size tSize Point iPoint Point jPoint bool areEqual bool unEqual Point mPoint Size nSize PointF fPoint = = = = = = = = = new Point(5,4); new Size(10,10); hPoint + tSize; new Point(30,23); iPoint == jPoint; iPoint != mPoint; iPoint-tSize; new Size(iPoint); (PointF)jPoint; 1.2.1.6 Métodos protegidos 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. MemberwiseClone (se hereda de Object) Crea una copia superficial del objeto Object actual. Finalize (se hereda de Object) 1.2.2 Estructura Size (tamaños) Size almacena un par de enteros ordenados, normalmente el ancho y el alto de un rectángulo. 1.2.2.1 Constructores públicos Size (Constructor) Sobrecargado. Inicializa una nueva instancia de la clase Size a partir del objeto Point especificado. Tabla 1.3. Miembros de la estructura Size 28 Textos Universitarios / Serie Docencia ________________________________________________________________________ Ejemplos: Point hPoint Size zSize Size tSize Size mSize = = = = new new new new Point(5,4); Size(); Size(10,10); Size(hPoint); 1.2.2.2 Campos públicos Empty Inicializa una nueva instancia de la clase Size. Ejemplos: Size aSize = Size.Empty; 1.2.2.3 Propiedades públicas Height IsEmpty Width Obtiene o establece el componente vertical de este Size. Prueba si este objeto Size tiene un ancho y un alto de cero. Obtiene o establece el componente horizontal de este Size. Ejemplos: Size aSize = Size.Empty; aSize.Height = 20; aSize.Width = 4*aSize.Height; if(!aSize.IsEmpty) {aSize.Height=0; aSize.Width=0;} 1.2.2.4 Métodos públicos Ceiling Equals GetHashCode GetType (se hereda de Object) Round Convierte la estructura SizeF especificada en una estructura Size redondeando los valores de SizeF a los valores enteros superiores siguientes. Reemplazado. Comprueba si el objeto especificado es Size con las mismas dimensiones que este Size. Reemplazado. Devuelve un código hash para esta estructura Size. Obtiene el objeto Type de la instancia actual. Convierte la estructura SizeF especificada en una estructura Size redondeando los valores de Size a los valores enteros más 29 Jenaro C. Paz ________________________________________________________________________ cercanos. Reemplazado. Crea una cadena legible para el usuario que representa este Size. Convierte la estructura SizeF especificada en una estructura Size mediante el truncamiento de los valores de la estructura Size a los valores enteros inferiores siguientes. ToString Truncate Ejemplos: SizeF bSize=new SizeF(23.5F,23.2F); Size cSize=Size.Ceiling(bSize); Size dSize= new Size(29,33); Boolean b_var=bSize.Equals(dSize); int h_Code=dSize.GetHashCode(); Type theType = dSize.GetType(); Size eSize=Size.Round(bSize); String sSize = eSize.ToString(); Size hSize = Size.Truncate(bSize); 1.2.2.5 Operadores públicos y conversiones de tipos Operador de suma Operador de igualdad Operador de desigualdad . Operador de resta Conversión de Size a Point Conversión de Size a SizeF Ejemplos: Size oSize Size pSize Size iSize Size jSize bool bEqual bool bunEqual Size mSize Point nPoint SizeF fSize 30 = = = = = = = = = new Size(15,24); new Size(10,10); oSize + pSize; new Size(34,122); iSize == jSize; iSize != oSize; iSize-tSize; new Point(iSize); (SizeF)jSize; Agrega el ancho y el alto de una estructura Size al ancho y alto de otra estructura Size. Determina si dos estructuras Size son iguales. Determina si dos estructuras Size son distintas. Resta el ancho y el alto de una estructura Size del ancho y alto de otra Size. Convierte el objeto Size especificado en Point. Convierte el objeto Size especificado en SizeF. Textos Universitarios / Serie Docencia ________________________________________________________________________ 1.2.2.6 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. 1.2.3 Estructura Rectangle (rectángulos) Rectangle almacena un conjunto de cuatro enteros que representan la posición y tamaño de un rectángulo. 1.2.3.1 Constructores públicos Sobrecargado. Inicializa una nueva instancia de la clase Rectangle con la ubicación y el tamaño y especificados. Rectangle (Constructor) Tabla 1.4. Miembros de la estructura Rectangle Ejemplos: Rectangle aRect Point onePoint Size theSize Rectangle bRect RectangleF gRect = = = = = new new new new new Rectangle(15,24,80,60); Point(20,20); Size(73,127); Rectangle(onePoint, theSize); RectangleF(10.3F,24.7F,86.4F,45.3F); 1.2.3.2 Campos públicos Empty Representa una estructura Rectangle con las propiedades sin inicializar. Ejemplos: Rectangle hRect = Rectangle.Empty; 1.2.3.3 Propiedades públicas Bottom Obtiene la coordenada y del borde inferior de esta estructura Rectangle. 31 Jenaro C. Paz ________________________________________________________________________ Height Obtiene o establece el alto de esta estructura Rectangle. IsEmpty Comprueba si todas las propiedades numéricas de este objeto Rectangle tienen valores de cero. Obtiene la coordenada x del borde izquierdo de esta estructura Rectangle. Obtiene o establece las coordenadas de la esquina superior izquierda de esta estructura Rectangle. Obtiene la coordenada x del borde derecho de esta estructura Rectangle. Left Location Right Size Obtiene o establece el tamaño de este Rectangle. Top Obtiene la coordenada y del borde superior de esta estructura Rectangle. Width Obtiene o establece el ancho de esta estructura Rectangle. X Obtiene o establece la coordenada x de la esquina superior izquierda de esta estructura Rectangle. Obtiene o establece la coordenada y de la esquina superior izquierda de esta estructura Rectangle. Y Ejemplos: int Y1 = aRect.Top; int Y2 = aRect.Bottom; int X1 = aRect.Left; int X2 = aRect.Right; int aWidth = aRect.Width; int aHeight = aRect.Height; Point onePoint = new Point(20,20); Size theSize = new Size(73,127); Rectangle cRect = Rectangle.Empty; If(cRect.IsEmpty) { cRect.X = X1; cRect.Y = Y1; cRect.Size=theSize; 32 Textos Universitarios / Serie Docencia ________________________________________________________________________ } Rectangle dRect = Rectangle.Empty; dRect.Location= onePoint; dRect.Width = 100; dRect.Height = 200; 1.2.3.4 Métodos públicos Ceiling Contains Equals FromLTRB GetHashCode GetType (se hereda de Object) Inflate Intersect IntersectsWith Offset Round ToString Convierte la estructura RectangleF especificada en una estructura Rectangle redondeando los valores de RectangleF a los valores enteros superiores siguientes. Sobrecargado. Determina si el punto especificado está dentro de la región rectangular que define Rectangle. Reemplazado. Comprueba si obj es una estructura Rectangle con la misma ubicación y el mismo tamaño que esta estructura Rectangle. Crea una estructura Rectangle con las ubicaciones de los bordes especificadas. Reemplazado. Devuelve el código hash para esta estructura Rectangle. Para obtener información acerca del uso de códigos hash, vea Object.GetHashCode. Obtiene el objeto Type de la instancia actual. Sobrecargado. Crea y devuelve una copia aumentada de la estructura Rectangle especificada. La copia se aumenta en la cantidad especificada. Sobrecargado. Reemplaza esta estructura Rectangle con la intersección de ella misma y la estructura Rectangle especificada. Determina si este rectángulo tiene una intersección con rect. Sobrecargado. Ajusta la ubicación de este rectángulo en la cantidad especificada. Convierte la estructura RectangleF en Rectangle redondeando los valores de RectangleF a los valores enteros más cercanos. Reemplazado. Convierte los atributos de este Rectangle en una cadena inteligible para el usuario. 33 Jenaro C. Paz ________________________________________________________________________ Convierte el objeto RectangleF especificado en Rectangle mediante el truncamiento de los valores RectangleF. Obtiene una estructura Rectangle que contiene la intersección de dos estructuras Rectangle. Truncate Union Ejemplos: RectangleF aR = new RectangleF(5.3F, 2.1F, 23.9F,45.6F); Rectangle bR = Rectangle.Ceiling(aR); bool bInside = aR.Contains(6.7F,4.5F); bool bInside2 = aR.Contains(bR); bool bEQ = aR.Equals(bR); Rectangle myR = Rectangle.FromLTRB(X1,Y1,X2,Y2); Type rType = myR.GetType(); aR.Inflate(23.5F,12.9F); bR.Intersect(dRect); bool bIntersect = aR.IntersectsWith(bR); aR.Offset(10.0F,10.0F); Rectangle cR = Rectangle.Round(aR); string sRect = cR.ToString(); Rectangle dR = Rectangle.Truncate(aR); Rectangle Ra = new Rectangle(5,5,20,20); Rectangle Rb = new Rectangle(10,10,30,30); Rectangle rectan = Rectangle.Union(Ra,Rb); 1.2.3.5 Operadores públicos Operador de igualdad Operador de desigualdad Comprueba si dos estructuras Rectangle tiene la misma ubicación y el mismo tamaño. Comprueba si dos estructuras Rectangle tiene una ubicación o un tamaño diferentes. Ejemplos: RectangleF aR = Rectangle bR = bool bEqualRect bool bSameRect new RectangleF(5.3F, 2.1F, 23.9F,45.6F); Rectangle.Ceiling(aR); = Ra == Rb; = Ra != Rb; 1.2.3.6 Métodos protegidos Finalize (se hereda de Object) 34 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 Textos Universitarios / Serie Docencia ________________________________________________________________________ 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. 1.2.4 Estructura Color (colores) Color representa un color ARGB. (Alfa, Red, Green, Blue). En GDI+ un color está representado por una estructura de 32 bits construido de cuatro componentes cuyo rango de valores varia de 0 a 255. La componente alfa (los primeros 8 bits) del color representa la transparencia, que determina de que manera un color se mezcla con el fondo. Un valor alfa de 0 representa un color completamente transparente y un valor de 255 representa un color opaco; valores intermedios producen resultados entre estos extremos. El espacio de colores RGB puede pensarse como un cubo en donde la longitud indica la intensidad de rojo, el ancho indica la intensidad de verde y la altura indica la intensidad en azul. El punto (0,0,0) es negro y el (255,255,255) es blanco. Cualquier otro color disponible se encuentra dentro del cubo. 1.2.4.1 Campos públicos Representa un color nulo. Empty Tabla 1.5. Miembros de la estructura Color 1.2.4.2 Propiedades públicas A B G IsEmpty IsKnownColor IsNamedColor Obtiene el valor del componente alfa de esta estructura Color. Obtiene el valor del componente azul de esta estructura Color. Obtiene el valor del componente verde de esta estructura Color. Especifica si esta estructura Color está sin inicializar. Especifica si esta estructura Color es un color predefinido. Los elementos de la enumeración KnownColor representan los colores predefinidos. Especifica si esta estructura Color es un color predefinido. Los elementos de la enumeración KnownColor representan los 35 Jenaro C. Paz ________________________________________________________________________ colores predefinidos. Especifica si esta estructura Color es un color del sistema. Un color del sistema es un color utilizado en un elemento que se muestra en Windows. Los elementos de la enumeración KnownColor representan los colores del sistema. Obtiene el nombre de este nombre de Color. Devolverá el nombre del color definido por el usuario, si el color se creó a partir de un nombre, o el nombre de un color conocido. Para los colores personalizados, se devuelve el valor RGB. Obtiene el valor del componente rojo de esta estructura Color. IsSystemColor Name R Propiedades públicas ( 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 36 Obtiene un color definido por el sistema.) 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 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 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 Textos Universitarios / Serie Docencia ________________________________________________________________________ DarkOliveGreen DarkOrange DarkOrchid DarkRed DarkSalmon DarkSeaGreen DarkSlateBlue DarkSlateGray LightCoral LightCyan LightGoldenrodYellow LightGray LightGreen LightPink LightSalmon LightSeaGreen OrangeRed Orchid PaleGoldenrod PaleGreen PaleTurquoise PaleVioletRed PapayaWhip PeachPuff Wheat White WhiteSmoke Yellow YellowGreen 1.2.4.3 Métodos públicos Equals FromArgb FromKnownColor FromName GetBrightness GetHashCode GetHue GetSaturation GetType (se hereda de Object) Reemplazado. Comprueba si el objeto especificado es una estructura Color y si equivale a esta estructura Color. Sobrecargado. Crea una estructura Color a partir de los cuatro valores de los componentes ARGB de 8 bits (alfa, rojo, verde y azul). Crea una estructura Color a partir del color predefinido especificado. Crea una estructura Color a partir del nombre especificado de un color predefinido. Obtiene el valor de brillo HSB (brillo de saturación de matiz) de esta estructura Color. Reemplazado. Devuelve un código hash para esta estructura Color. Obtiene el valor de matiz HSB (brillo de saturación de matiz), en grados, de esta estructura Color. Obtiene el valor de saturación HSB (brillo de saturación de matiz) de esta estructura Color. Obtiene el objeto Type de la instancia actual. ToArgb Obtiene el valor ARGB de 32 bits de esta estructura Color. ToKnownColor Obtiene el valor KnownColor de esta estructura Color. 37 Jenaro C. Paz ________________________________________________________________________ ToString Reemplazado. Convierte esta estructura Color en una cadena inteligible para el usuario. 1.2.4.4 Operadores públicos Operador de igualdad Comprueba si dos estructuras Color especificadas son equivalentes. Operador de desigualdad Comprueba si dos estructuras Color especificadas son distintas. 1.2.4.5 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. Ejemplos: RectangleF aR = new RectangleF(5.3F, 2.1F, 23.9F,45.6F); //Crear un color usando ARGB Color redColor = Color.FromArgb(120,255,0,0); //Crear un color usando su nombre Color orchidColor = Color.FromName(“Orchid”); //Crear un color a partir de un color conocido Color blueColor = Color.FromKnowColor(KnownColor.Blue); //Crear un color vacio Color unColor = Color.Empty; //Verifica si un color es vacio if(unColor.IsEmpty) { unColor = Color.LightGoldenrodYellow; } //Valor de propiedades string str = “Color : “+ greenColor.Name + “, A:” + greenColor.A.ToString() + “, R:” + greenColor.R.ToString() + “, G:” + greenColor.G.ToString() + “, B:” + greenColor.B.ToString(); //Creacion de Color 38 Textos Universitarios / Serie Docencia ________________________________________________________________________ Color myColor = Color.FromArgb(255,200,0,120); //Obtener matiz, saturación y brillo float matiz = myColor.GetHue(); float saturacion = myColor.GetSaturation(); float brillo = myColor.GetBrightness(); string str2 = “Matiz: “+ matiz.ToString() + “\n” + “Saturacion: “+saturacion.ToString() + “\n” + “Brillo: “+brillo.ToString(); En el ejemplo anterior hemos utilizado las propiedades públicas A, R, G, B para obtener las componentes del color en el sistema ARGB y los métodos públicos GetHue, GetSaturation y GetBrightness para obtenerlos en el sistema HSB. El Framework.NET de Microsoft cuenta con las clases TypeConverter y ColorConverter para llevar a cabo conversiones cuando el usuario cuenta con la información de Color en un formato especificado bajo algún estándar y desea procesarlo bajo aplicaciones Web haciendo uso de GDI+, veamos como son estas dos clases: 1.2.5 Clase TypeConverter6 Requisitos Espacio de nombres: System.ComponentModel Proporciona un modo unificado para convertir los tipos de valores en otros tipos, así como para obtener acceso a valores estándar y a subpropiedades. 1.2.5.1 Constructores públicos TypeConverter (Constructor) Inicializa una nueva instancia de la clase TypeConverter. Tabla 1.6. Miembros de la Clase TypeConverter 1.2.5.2 Métodos públicos CanConvertFrom CanConvertTo ConvertFrom Sobrecargado. Devuelve si este conversor puede convertir un objeto de un tipo al tipo de este conversor. Sobrecargado. Devuelve si este conversor puede convertir el objeto al tipo especificado. Sobrecargado. Convierte el valor dado al 6 Traducción de la referencia en línea de MSDN (Microsoft Developer Network) por J.C. Paz http://msdn.microsoft.com/library/en-us/cpref/html/frlrfsystemcomponentmodeltypeconverterclasstopic.asp junio 3 de 2006 39 Jenaro C. Paz ________________________________________________________________________ ConvertFromInvariantString ConvertFromString ConvertTo ConvertToInvariantString ConvertToString CreateInstance Equals (se hereda de Object) GetCreateInstanceSupported GetHashCode (se hereda de Object) . GetProperties GetPropertiesSupported GetStandardValues GetStandardValuesExclusive GetStandardValuesSupported GetType (se hereda de Object) IsValid 40 tipo de este conversor. Sobrecargado. Convierte el valor a un tipo de este conversor, utilizando la referencia cultural invariable. Sobrecargado. Convierte el texto especificado a un objeto. Sobrecargado. Convierte el objeto de valor dado al tipo especificado. Sobrecargado. Convierte el valor especificado a una representación de cadena invariable de la referencia cultural. Sobrecargado. Convierte el valor especificado a una representación de cadena. Sobrecargado. Vuelve a crear un Object dado un conjunto de valores de propiedad del objeto. Sobrecargado. Determina si dos instancias de Object son iguales. Sobrecargado. Devuelve si al cambiar un valor de este objeto es necesario llamar a CreateInstance para crear un nuevo valor. 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. Sobrecargado. Devuelve una colección de propiedades para el tipo de matriz especificado por el valor del parámetro. Sobrecargado. Devuelve si este objeto admite propiedades. Sobrecargado. Devuelve una colección de valores estándar para el tipo de datos para el que está diseñado este conversor de tipos. Sobrecargado. Devuelve si la colección de valores estándar devueltos por GetStandardValues es una lista exclusiva. Sobrecargado. Devuelve si este objeto admite un conjunto estándar de valores que se pueden seleccionar de una lista. Obtiene el objeto Type de la instancia actual. Sobrecargado. Devuelve si el valor de Textos Universitarios / Serie Docencia ________________________________________________________________________ ToString (se hereda de Object) objeto dado es válido para este tipo. Devuelve un objeto String que representa al objeto Object actual. La clase ColorConverter que ahora veremos se usa para convertir colores de un tipo de datos a otro. Esta clase se hereda de la clase TypeConverter, quien define la funcionalidad en la conversión de los tipos y la forma de acceder a los valores y propiedades de ellos. En el Capítulo 5 Fuentes y Texto veremos la clase FontConverter. 1.2.6 Clase ColorConverter7 Requisitos Espacio de nombres: System.Drawing Convierte colores de un tipo de datos a otro. Se tiene acceso a esta clase mediante TypeDescriptor. 1.2.6.1 Constructores públicos ColorConverter (Constructor) Inicializa una nueva instancia de la clase ColorConverter. Tabla 1.7. Miembros de la Clase ColorConverter 7 Traducción de la referencia en línea de MSDN (Microsoft Developer Network) por J.C. Paz http://msdn.microsoft.com/library/en-us/cpref/html/frlrfsystemdrawingcolorconverterclasstopic.asp junio 3 2006 41 Jenaro C. Paz ________________________________________________________________________ 1.2.6.2 Métodos públicos CanConvertFrom CanConvertTo ConvertFrom ConvertFromInvariantString (se hereda de TypeConverter) ConvertFromString (se hereda de TypeConverter) ConvertTo ConvertToInvariantString (se hereda de TypeConverter) ConvertToString (se hereda de TypeConverter) CreateInstance (se hereda de TypeConverter) Equals (se hereda de Object) GetCreateInstanceSupported (se hereda de TypeConverter) GetHashCode (se hereda de Object) GetProperties (se hereda de TypeConverter) GetPropertiesSupported (se hereda de TypeConverter) GetStandardValues GetStandardValuesExclusive (se hereda de TypeConverter) GetStandardValuesSupported GetType (se hereda de Object) IsValid (se hereda de TypeConverter) 42 Sobrecargado. Sobrecargado. Sobrecargado. Sobrecargado. Convierte el valor a un tipo de este conversor, utilizando la referencia cultural invariable. Sobrecargado. Convierte el texto especificado a un objeto. Sobrecargado. Sobrecargado. Convierte el valor especificado a una representación de cadena invariable de la referencia cultural. Sobrecargado. Convierte el valor especificado a una representación de cadena. Sobrecargado. Vuelve a crear un Object dado un conjunto de valores de propiedad del objeto. Sobrecargado. Determina si dos instancias de Object son iguales. Sobrecargado. Devuelve si al cambiar un valor de este objeto es necesario llamar a CreateInstance para crear un nuevo valor. 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. Sobrecargado. Devuelve una colección de propiedades para el tipo de matriz especificado por el valor del parámetro. Sobrecargado. Devuelve si este objeto admite propiedades. Sobrecargado. Sobrecargado. Devuelve si la colección de valores estándar devueltos por GetStandardValues es una lista exclusiva. Sobrecargado. Obtiene el objeto Type de la instancia actual. Sobrecargado. Devuelve si el valor de objeto dado es válido para este tipo. Textos Universitarios / Serie Docencia ________________________________________________________________________ ToString (se hereda de Object) Devuelve un objeto String que representa al objeto Object actual. 1.2.6.3 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. GetConvertFromException (se hereda de Devuelve una excepción que se va a iniciar cuando no puede realizarse una conversión. TypeConverter) Devuelve una excepción que se va a iniciar GetConvertToException (se hereda de cuando no puede realizarse una conversión. TypeConverter) MemberwiseClone (se hereda de Object) Crea una copia superficial del objeto Object actual. Ordena una colección de propiedades. SortProperties (se hereda de TypeConverter) Ejemplos C# String strColor = “#FF00FF” ColorConverter colorConverter = new ColorConverter(); Color myClr = (Color)colorConverter.ConvertFromString(strColor); Con la finalidad de hacer la tarea de conversión de colores en diferentes formatos más fácil, veamos cuales son sus miembros: 1.2.7 Clase ColorTranslator8 Requisitos Espacio de nombres: System.Drawing Convierte colores a y de estructuras Color GDI+. No se puede heredar esta clase. 8 Traducción de la referencia en línea de MSDN (Microsoft Developer Network) por J.C. Paz http://msdn.microsoft.com/library/en-us/cpref/html/frlrfsystemdrawingcolortranslatorclasstopic.asp junio 3 de 2006 43 Jenaro C. Paz ________________________________________________________________________ 1.2.7.1 Métodos públicos FromHtml FromOle FromWin32 ToHtml ToOle ToWin32 Convierte la representación de un color HTML en una estructura Color GDI+. Convierte el valor de un color OLE en una estructura Color GDI+. Convierte el valor de un color de Windows en una estructura Color GDI+. Convierte la estructura Color especificada en una representación de cadena de un color HTML. Convierte la estructura Color especificada en un color OLE. Convierte la estructura Color especificada en un color de Windows. Tabla 1.8. Miembros de la Clase ColorTranslator 44 Textos Universitarios / Serie Docencia ________________________________________________________________________ Ejemplos C# // Crear una representacion en cadena de caracteres de un color HTML string htmlColor = "Blue"; // Traducir htmlColor a una estructura Color de GDI+ Color myColor = ColorTranslator.FromHtml(htmlColor); // rellenar un rectangulo con myColor. g.FillRectangle(new SolidBrush(myColor),0,0,100,100); // Crear una representacion entera de un color OLE int oleColor = 0xFF00; // Traducir htmlColor a una estructura Color de GDI+ Color myColor = ColorTranslator.FromOle(oleColor); // rellenar un rectangulo con myColor. g.FillRectangle(new SolidBrush(myColor),10,30,200,100); // Crear una representacion entera de un color Windows. int winColor = 0xA000; // Traducir winColor a una estructura Color de GDI+ Color myColor = ColorTranslator.FromWin32(winColor); // rellenar un rectangulo con myColor. g.FillEllipse(new SolidBrush(myColor),10,30,200,100); // Crear una instancia de la estructura Color. Color myColor = Color.Red; // Traducir myColor a un color HTML. string htmlColor = ColorTranslator.ToHtml(myColor); // Crear una instancia de la estructura Color. Color myColor = Color.Red; // Traducir myColor a un color OLE. int oleColor = ColorTranslator.ToOle(myColor); // Crear una instancia de la estructura Color. Color myColor = Color.Red; // Traducir myColor a un color Win32. int winColor = ColorTranslator.ToWin32(myColor); 45 Jenaro C. Paz ________________________________________________________________________ 46