Tra Ducci On

75
15.1 Introduction 15.2 Menus 15.3 MonthCalendar Control 15.4 DateTimePicker Control 15.5 LinkLabel Control 15.6 ListBox Control 15.7 CheckedListBox Control 15.8 ComboBox Control 15.9 TreeView Control 5.10 ListView Control 5.11 TabControl Control 5.12 Múltiple Document Interface (MDI) Windows 5.13, Visual Inheritance 5.14 User-Defined Controls 5.15 Wrap-Up Summary | Terminology | Self-Review Exercises | Answers to Self-Review Exercises | Exercise 15.1 Introducción En este capítulo se continúa el estudio de interfaces gráficas de usuario. Empezamos con los menús, que presentan los usuarios con comandos organizados lógicamente (u opciones). A continuación, analizamos cómo las fechas y horas de entrada y de visualización utilizando el control MonthCalendar y DateTimePicker. Mostramos cómo desarrollar menús con las herramientas proporcionadas por Visual Studio. También introducimos Li nkLabels potentes componentes GUI que permiten al usuario a visitar uno de varios destinos, como un archivo en la máquina actual o una página web, haciendo clic en el ratón. Demostramos cómo manipular una lista de valores a través de un Li stBox y cómo combinar varias casillas de verificación en una CheckedListBox. También creamos listas desplegables usando ComboBoxes y mostrar datos jerárquicamente con un control TreeView. Aprenderás dos importantes controles GUI elementos de lengüeta otlier y la interfaz de múltiples documentos (MDI) de Windows. Estos componentes le permiten crear programas del mundo real con sofisticadas interfaces gráficas de usuario. Visual Studio proporciona un amplio conjunto de componentes de interfaz gráfica de usuario, algunos de éstos se discuten en este (y el anterior) capítulo. Visual Studio también le permite diseñar con ¬ controles personalizados y agregarlos al cuadro de herramientas, como lo demostramos en el último ejemplo de este capítulo. Las técnicas presentadas aquí constituyen las bases para la creación de interfaces gráficas de usuario más sustancial y controles personalizados.

Transcript of Tra Ducci On

Page 1: Tra Ducci On

15.1 Introduction

15.2 Menus

15.3 MonthCalendar Control

15.4 DateTimePicker Control

15.5 LinkLabel Control

15.6 ListBox Control

15.7 CheckedListBox Control

15.8 ComboBox Control

15.9 TreeView Control

5.10 ListView Control

5.11 TabControl Control

5.12 Múltiple Document Interface (MDI) Windows

5.13, Visual Inheritance

5.14 User-Defined Controls

5.15 Wrap-Up

Summary | Terminology | Self-Review Exercises | Answers to Self-Review Exercises | Exercise

15.1 IntroducciónEn este capítulo se continúa el estudio de interfaces gráficas de usuario. Empezamos con los menús, que presentan los usuarios con comandos organizados lógicamente (u opciones). A continuación, analizamos cómo las fechas y horas de entrada y de visualización utilizando el control MonthCalendar y DateTimePicker. Mostramos cómo desarrollar menús con las herramientas proporcionadas por Visual Studio. También introducimos Li nkLabels potentes componentes GUI que permiten al usuario a visitar uno de varios destinos, como un archivo en la máquina actual o una página web, haciendo clic en el ratón.

Demostramos cómo manipular una lista de valores a través de un Li stBox y cómo combinar varias casillas de verificación en una CheckedListBox. También creamos listas desplegables usando ComboBoxes y mostrar datos jerárquicamente con un control TreeView. Aprenderás dos importantes controles GUI elementos de lengüeta otlier y la interfaz de múltiples documentos (MDI) de Windows. Estos componentes le permiten crear programas del mundo real con sofisticadas interfaces gráficas de usuario.

Visual Studio proporciona un amplio conjunto de componentes de interfaz gráfica de usuario, algunos de éstos se discuten en este (y el anterior) capítulo. Visual Studio también le permite diseñar con ¬ controles personalizados y agregarlos al cuadro de herramientas, como lo demostramos en el último ejemplo de este capítulo. Las técnicas presentadas aquí constituyen las bases para la creación de interfaces gráficas de usuario más sustancial y controles personalizados.

15.2 MenúsLos menús proporcionan grupos de comandos relacionados para aplicaciones de Windows. Aunque estos comandos dependen del programa, algunos-como abrir y guardar-son comunes a muchas aplicaciones. Los menús son una parte integral de interfaces gráficas de usuario, ya que se organizan comandos sin "engordar" la GUI.

En la figura. 15,1, un amplio menú pérdida de interés Visual C # 2008 Express Edition enumera varios comandos (llamados elementos de menú), además de submenús (menús dentro de un menú). Tenga en cuenta que la

Page 2: Tra Ducci On

Figura 15.1 | Menús, submenús y elementos de menú.

menús de nivel superior aparecen en la parte izquierda de la figura, mientras que ningún artículo submenús o menú se muestran a la derecha. El menú que contiene un elemento de menú se llama ese padre menú de Opción de menú. Un elemento de menú que contiene un submenú está considerado como el padre de ese submenú.

Los menús pueden tener Alt atajos de teclado (también llamados accesos directos o combinaciones de teclas de acceso), los que se accede pulsando la tecla Alt y la letra subrayada (por ejemplo, Alt F normalmente se expande el menú Archivo). Los elementos del menú pueden tener combinaciones de teclas, así (combinaciones de Ctrl, Shift, Alt, Fl, F2, teclas de letras, y así sucesivamente). Algunos elementos de menú muestran marcas de verificación, por lo general indica que múltiples opciones en el menú se pueden seleccionar a la vez.

Para crear un menú, abra el cuadro de herramientas y arrastre un control MenuStrip hasta el formulario. Esto crea una barra de menú en la parte superior del formulario (por debajo de la barra de título) y coloca un MenuStri p icono en la bandeja de componentes. Para seleccionar el MenuStrip, haga clic en este icono. Ahora puede usar el modo de diseño para crear y editar menús de la aplicación. Los menús, como otros controles, tienen propiedades y eventos, que se puede acceder a través de la ventana Propiedades.

Para agregar elementos de menú al menú, haga clic en el cuadro de texto Escriba aquí (Fig. 15.2) y escriba el nombre del elemento del menú. Esta acción agrega una entrada en el menú de tipo también! StripMenuItem. Después de pulsar la tecla Enter, se añade el elemento de nombre de menú a la carta. Entonces más Escriba aquí cuadros de texto aparece, allowingyou agregar elementos por debajo o al lado de la opción de menú inicial (Fig. 15.3).

Para crear un acceso directo de acceso (o combinación de teclas bordo), escriba un signo (&) befo vuelve el personaje que subrayar. Por ejemplo, para crear el elemento de menú Archivo con la letra F subrayó, escriba & Fi 1 e. Para mostrar un signo, && tipo. Para añadir otras teclas de acceso directo

Page 3: Tra Ducci On

Figura 15.2 I Edición de menús en Visual Studio.MM

Figura 15.3 | Agregar ToolStripMenuItems a un MenuStrip.

(Por ejemplo, <Ctrl>-F9) para los elementos de menú, establezca la propiedad ShortcutKeys de la herramienta de StripMenuItems apropiados. Para ello, seleccione la flecha hacia abajo a la derecha de esta propiedad en la ventana Propiedades. En la ventana que aparece (Fig. 15.4), utilice las casillas de verificación y desplegables

Lugar y carácter antes de una letra para resaltar que en el menú, por lo que el carácter puede ser utilizado como un acceso directo

Cuadros de texto - para añadir elementos al menú

Page 4: Tra Ducci On

Figura 15.4 | Establecer teclas de acceso directo de un elemento de menú.

lista para seleccionar las teclas de acceso directo. Cuando haya terminado, haga clic en otra parte de la pantalla. Puede ocultar las teclas de método abreviado mediante el establecimiento de ShowShortcutKeys propiedad en false y se puede modificar la visualización de las teclas de control en el elemento de menú mediante la modificación de la propiedad ShortcutKeyDi splayString.

Look-and-feel Observación 15,1

Los botones pueden tener accesos directos de acceso. Coloque el símbolo & inmediatamente antes del carácter deseado en el texto del botón de 's. Para pulsar el botón utilizando su clave de acceso en la

aplicación en ejecución, el userpresses Alt y el carácter subrayado. Si el subrayado no es visible cuando se ejecuta la aplicación, pulse la tecla Alt para que aparezca el subrayado.

Puede eliminar un elemento de menú al seleccionar con el ratón y pulsar la tecla Suprimir. Los elementos de menú se pueden agrupar lógicamente por las barras separadoras, que se insertan haciendo clic derecho en el menú y seleccionar Insertar separador o escribiendo "-" el texto de un elemento de menú.

Además del texto, Visual Studio le permite añadir fácilmente cuadros de texto y ComboBoxes (listas desplegables) como elementos de menú. Al agregar un elemento en el modo de diseño, te habrás dado cuenta de que antes de entrar en el texto de un nuevo elemento, se le proporciona una lista desplegable. Al hacer clic en la flecha hacia abajo (Fig. 15.5) le permite seleccionar el tipo de elemento para añadir-Menu-Artículo (de typeToolStripMenuItem, el valor predeterminado), ComboBox (de tipo también! StripComboBox) y TextBox (del tipo ToolStripTextBox). Nos centramos en ToolStripMenuItems. [Nota: Si usted ve esta lista desplegable para los elementos del menú que no están en el nivel superior, aparece una cuarta opción, que le permite insertar una barra de separación.]

Herramienta Stri pMenuItems generar un evento O ick cuando se selecciona. Para crear un controlador de eventos Click vacía, haga doble clic en el elemento de menú en el modo de diseño. Acciones comunes en respuesta a estos eventos incluyen mostrar cuadros de diálogo y el establecimiento de propiedades. Menú-piedades comunes y un evento común se resumen en la figura. 15.6.

Page 5: Tra Ducci On

Figura 15.5 Opciones de Menu-item

MenuStrip and Tool Stri pMenuIteni properties and an event

Description

MenuStrip Properties

Menultems

HasChildren

RightToLeft

ToolStripMenuItem Properties Checked

CheckOnClick

índex

Menultems

Contiene los elementos de menú de nivel superior para este MenuStrip.

Indica si MenuStrip Tiene Todos Los Controles Secundarios (Menú Artículos).

Causas de texto para mostrar, de derecha a izquierda. Esto es útil para los idiomas que se leen de derecha a izquierda.

Indica si un elemento del menú está marcado. El valor predeterminado es false, lo que significa que el elemento de menú está desactivada.

Indica que un elemento de menú debe aparecer marcado o no, ya que se hace clic.

Especifica la posición de los elementos en su menú principal. Un valor de 0 lugares del Menultem al principio del menú.

Enumera los elementos de submenú de un elemento de menú determinado.

MenuStrip ToolStripMenuItem y Description

Page 6: Tra Ducci On

propiedades y un evento

ShortcutKey-DisplayString

ShortcutKeys

ShowShortcutKeys

text

Common ToolStripMenuItem Event Click

Especifica el texto que debe aparecer al lado de un elemento de menú para una tecla de acceso directo. Si se deja en blanco, se mostrarán los nombres de las teclas. De lo contrario, el texto de esta propiedad se muestra en la tecla de acceso directo.

Especifica la tecla de acceso directo para el elemento de menú (por ejemplo, <Ctrl>-F9 es equivalente a hacer clic en un elemento específico).

Indica si se muestra una tecla de acceso directo al lado del texto del menú. El valor predeterminado es true, lo que muestra la tecla de acceso directo.

Especifica el texto de los elementos del menú. Para crear y acceder a accesos directos, precederá a un personaje con Y (por ejemplo, de archivos y especificar un menú llamado archivo con la letra F subrayado).

Se genera cuando un elemento se hace clic o se usa una tecla de acceso directo. Este es el caso por defecto cuando el menú se hace doble clic en el diseñador

Fig15.6 | MenuStrip y propiedades StripMenuItem de herramientas y un evento. (Parte 2 de 2).

Look-and-feel 15.2 Observación

Se trata de un convenio para poner puntos suspensivos (...) después del nombre de un elemento de menú (por ejemplo, Guardar como ...) que requiere que el usuario proporcione más información, normalmente a través de un diálogo. Un elemento de menú que produce una acción inmediata sin preguntar al usuario para obtener más información (por ejemplo, guardar) no debe tener puntos suspensivos después de su nombre.

Clase MenuTestForm (Fig. 15-7) crea un menú sencillo en un formulario. El formulario tiene un menú de archivos de nivel superior con unos elementos de menú (que muestra un cuadro de mensaje) y Salir (que termina el programa). El programa también incluye un menú Formato, que contiene los elementos de menú que cambian el formato del texto en una etiqueta. El menú Formato tiene submenús color y la fuente, que cambian el color y la fuente del texto en la etiqueta.

Para crear la interfaz gráfica de usuario, comience arrastrando el MenuStrip de la caja de herramientas hasta el formulario. A continuación, utilice el modo de diseño para crear la estructura del menú se muestra en los resultados de la muestra. El menú File (fileToolStripMenuItem) tiene elementos de menú sobre (aboutToolStripMenu ¬ artículo) y Salir (exitToolStripMenuItem), el menú Formato (formatTool Stri pMenuItem) tiene dos submenús. El primer submenú Color (colorToolStripMenuItem), contiene elementos de menú Negro (blackToolStripMenuItem), Azul (blueToolStripMenuItem), Rojo (redToolStripMenuItem) y Green (greenToolStripMenuItem). El segundo submenú, Font (fontToolStripMenuItem), contiene elementos de menú Times New Roman (timesToolStripMenultem), Courier (courieToolStripMenuItem), Comic Sans (comicToolStripMenu del elemento-), una barra de separación (dashToolStripMenuItem), Negrita (boldToolStripMenuItem) y Cursiva (italicToolStripMenuItem).

El elemento de menú Acerca de en el menú Archivo muestra un cuadro de mensaje cuando se hace clic (líneas 20-25). El elemento de menú Salir cierra la aplicación a través de método estático Exit de la clase.

Page 7: Tra Ducci On

Aplicación (línea 31). Métodos estáticos de control de ejecución del programa de clase de aplicación. Método de salida hace que nuestra aplicación termine.

Page 8: Tra Ducci On
Page 9: Tra Ducci On
Page 10: Tra Ducci On

Figura 15.7 | Menús para cambiar la fuente del texto y el color. (Parte 4 de 4 -)

Hicimos los elementos del submenú color (Negro, Azul, Rojo y Verde) mutuamente excluyentes: el usuario puede seleccionar sólo uno a la vez (se explica cómo hicimos esto en breve). Para indicar que se selecciona un elemento de menú, vamos a establecer la propiedad Checked de cada elemento de menú de color en true. Esto hace que un cheque a aparecer a la izquierda de un elemento de menú.

Cada elemento de menú Color tiene su propio controlador de eventos Click. El controlador de métodos para el color Negro es blackToolStripMenuItem_Click (líneas 45-54). Del mismo modo, los controladores de eventos para los colores azul, rojo y verde son blueToolStripMenuItem_Click (líneas 57-66), redTool-StripMenuItem_Click (líneas 69-78) y greenToolStn'pMenuItem_Click (líneas 81-90), respectivamente. Cada elemento del menú color debe ser mutuamente excluyentes, por lo que cada controlador de eventos llamamétodo clearColor (líneas 35-42) antes de su correspondiente propiedad Checked en true. Método clearColor establece la propiedad Checked de cada Menultem color falso, lo que impide más de una opción de menú que se seleccione a la vez. En el diseñador, nos propusimos inicialmente la propiedad Checked del elemento de menú Negro de verdad, porque en el inicio del programa, el texto en el formulario es negro.

Software Engineering Observación 15,1

La exclusión mutua de los elementos de menú no se hace cumplir por el MenuStrip, incluso cuando el "^ propiedad Checked es cierto. Usted debe programar este comportamiento.

El menú Fuente contiene tres elementos de menú de fuentes (Courier, Times New Roman y Comic Sans) y dos elementos de menú de estilos de fuente (negrita y cursiva). Hemos añadido una barra de separación entre la fuente y los elementos de menú al estilo de la fuente para indicar que se trata de opciones distintas. Un objeto Font puede especificar sólo una fuente a la vez, pero puede establecer estilos múltiples a la vez (por ejemplo, una fuente puede ser a la vez negrita y cursiva). Hemos establecido los elementos del menú de fuente para mostrar los controles. Al igual que con el menú de color, debemos hacer cumplir la exclusión mutua de estos artículos en nuestros controladores de eventos.

Page 11: Tra Ducci On

Los controladores de eventos para la fuente del menú artículos Times Roman, Courier y ComicSans son timesToolStripMenuItem_Click (líneas 102 a 112), courierToolStn'pMenuItem_Click (líneas 115-125) y comicToolStripMenuItem_Click (líneas 128 a 138), respectivamente. Estos controladores de eventos se comportan de una manera similar a la de los controladores de eventos para los elementos de menú de color. Cada controlador de eventos borra las propiedades Checked para todos los elementos del menú de fuente llamando al método ClearFont (líneas 93-99), a continuación, establece la propiedad Checked del elemento de menú que provocó el evento en true. Esto refuerza la exclusión mutua de los elementos del menú de fuente. En el diseñador, nos propusimos inicialmente la propiedad Checked Times New Roman ítem del menú en true, porque esta es la fuente original del texto en el formulario. Los controladores de eventos para los elementos de menú en negrita y cursiva (líneas 141-163) utilizan la lógica binaria OR exclusiva (A) del operador para combinar estilos de fuente, como ya comentamos en el capítulo 14.

15.3 Control de MonthCalendarMuchas aplicaciones deben realizar cálculos de fecha y hora. El. NET Frameworkvides dos controles que permiten a una aplicación recuperar la fecha y hora-las informaciones controles MonthCalendar y DateTimePicker (Sección 15.4).

El MonthCalendar (Fig. 15.8) de control muestra un calendario mensual en el formulario. El usuario puede seleccionar una fecha en el mes que se muestra o puede utilizar las flechas previstas para desplazarse hasta un mes más. Al seleccionar una fecha, aparece resaltado. Fechas múltiple puede

Fig. 15.8 | MonthCalendar control.

15.4 DateTimePicker control

puede seleccionar pulsando las fechas en el calendario mientras mantiene pulsada la tecla Mayúsculas. El evento predeterminado para este control se DateChanged, que se genera cuando se selecciona una nueva fecha. Propiedades que se incorporan, permiten modificar la apariencia del calendario, ¿cuántas fechas se pueden seleccionar a la vez, y las fechas mínimas y máximas que se pueden seleccionar. Propiedades MonthCalendar y un evento común se resumen en la figura. 15.9.

Page 12: Tra Ducci On

MonthCalendarproperties and an event

Description

MonthCalendar PropertiesFirstDayOfWeek

MaxDateMaxSelectionCountMinDateMonthlyBoldedDatesSelectionEndSelectionRangeSelectionStartCommon MonthCalendar EventDateChanged

Establece qué día de la semana es la primera muestra de cada semana en el calendario.

La última fecha en la que se puede seleccionar.El número máximo de fechas que se pueden seleccionar a la vez.La primera fecha en la que se puede seleccionar.Una serie de fechas que aparecen en negrita en el calendario.La última de las fechas seleccionadas por el usuario.Las fechas seleccionados por el usuario.La primera de las fechas seleccionadas por el usuario.

Se genera cuando se selecciona una fecha en el calendario.

Figura 15.9 | propiedades MonthCalendar y un evento.

15.4 control DateTimePicker

El control DateTimePicker (ver salida. Fig. 15.11) es similar al control MonthCalendar pero muestra el calendario cuando se selecciona una flecha hacia abajo. El DateTimePicker se puede utilizar para recuperar la información de fecha y hora desde el usuario. El valor de una propiedad DateTimePicker almacena un objeto DateTime, que siempre contiene información de fecha y hora. Puede recuperar la información de la fecha solo mediante la propiedad Fecha y puede recuperar sólo la información de tiempo mediante el uso de la propiedad TimeOfDay.

El DateTimePicker también es más personalizable que un control MonthCalendar más propiedades se proporcionan para modificar la apariencia del calendario desplegable. Formato de la propiedad especifica opciones de selección del usuario utilizando el DateTimePicker Formato enumeración. Los valores de esta enumeración es larga (muestra la fecha en formato largo, como en Jueves, 10 de julio 2008), Short Time (muestra la fecha en formato corto, como en el 7/10/2008), (muestra un valor de tiempo, como en 5:31:02 PM) y Custom (indica que se usará un formato personalizado). Si se utiliza el valor en aduana, la presentación en el DateTimePicker se especifica utilizando CustomFormat propiedad. El evento predeterminado para este control se ValueChanged, que se produce cuando se cambia el valor seleccionado (ya sea una fecha o una hora). Propiedades DateTimePicker y un evento común se resumen en la figura. 15.10

DateTimePickerproperties and an event

Description

DateTimePicker Properties CalendarForeColorCalendarMonth-BackgroundCustomFormatDateFormat

MaxDateMinDateShowCheckBox

ShowUpDown

TimeOfDayValueCommon DateTimePicker EventValueChanged

Establece el color del texto para el calendario.Establece el color de fondo del calendario.Establece la cadena de formato personalizado para las opciones de los usuarios.La fecha.Establece el formato de la fecha y / u hora se utiliza para las opciones de los usuarios.La fecha y la hora máxima que se puede seleccionar.La fecha y la hora mínimo que se puede seleccionar.Indica si un CheckBox debe aparecer a la izquierda de la fecha y hora seleccionada.Indica si el control muestra botones arriba y abajo. Help-ful cuando se utiliza el DateTimePicker para seleccionar un tiempo de los botones se pueden utilizar para aumentar o disminuir la hora, minuto y segundo.La hora.Los datos seleccionados por el usuario.Se genera cuando cambia la propiedad Value, incluso cuando el usuario selecciona una nueva fecha u hora.

Figura 15.10 | propiedades DateTimePicker y un evento.

Page 13: Tra Ducci On

La figura 15.11 muestra cómo utilizar el control DateTimePicker para seleccionar el tiempo de bajada de un elemento. Muchas empresas utilizan esta funcionalidad. Por ejemplo, varias compañías de alquiler de DVD en línea especifican el día una película que se envía y el tiempo estimado que va a llegar a su casa. En esta aplicación, el usuario selecciona un día de bajada y, a continuación se muestra una fecha estimada de llegada. La fecha es siempre dos días después de drop-off, tres días si se alcanza un domingo (el correo no se entrega los domingos).

Fig. 15.1 Demonstrating DateTimePicker. (Part 2 of 3.

692 Chapter 15 Graphical User Interfaces with Windows Forms: Part 2

Page 14: Tra Ducci On

Figura 15.11 | Demostrando DateTimePicker. (Parte 3 de 3).

El DateTimePicker (dateTimePickerDropOff) tiene la propiedad formato establecida a largo, por lo que el usuario puede seleccionar una fecha y no una vez en esta aplicación. Cuando el usuario selecciona una fecha, se produce el evento ValueChanged. El controlador de eventos para este evento (líneas 18-35) recupera primero la fecha seleccionada de la propiedad Value del DateTimePicker (línea 21). Líneas 24-26 usan la propiedad DayOfWeek de la estructura DateTime para determinar el día de la semana en que cae la fecha seleccionada. Los valores diarios se representan mediante la enumeración DayOfWeek. Líneas 29-30 y 33-34 método AddDays uso DateTi de mí para aumentar la fecha por dos días o tres días, respectivamente. La fecha resultante se muestra en formato largo con el método ToLongDateString.En esta aplicación, no queremos que el usuario sea capaz de seleccionar un día de bajada antes de la fecha actual, o uno que es más de un año en el futuro. Para cumplir esto, nos pusimos MinDate del DateTimePi cker y propiedades MaxDate cuando se carga el formulario (líneas 39 y 42). Hoy en día la propiedad devuelve el día actual y AddYears método (con un argumento de l) se utiliza para especificar una fecha de un año en el futuro.Vamos a echar un vistazo más de cerca a la salida. Esta aplicación se inicia mediante la visualización de la fecha actual (fig. 15.11 (a)). En la figura. 15.11 (b), se seleccionó el 12 de julio. En la figura. 15,1 l (c), se muestra la fecha estimada de llegada como el l4. Figura 15.11 (d) muestra que el 12, después de que se ha seleccionado, se resalta en el calendario.

15.5 LinkLabel control

El control LinkLabel muestra vínculos a otros recursos, como archivos o páginas web (Fig. 15.12). A LinkLabel aparece como texto subrayado (de color azul por defecto). Cuando se mueve el ratón sobre el enlace, el puntero cambia a una mano, lo que es similar al comportamiento de un hipervínculo en una página web. El enlace puede cambiar de color para indicar si todavía no se visita, visitó previamente o activa. Al hacer clic, el Li nkLabel genera un evento LinkClicked (ver fig. 15.13). Clase LinkLabel se deriva de la clase Label y por lo tanto hereda toda la funcionalidad de la clase de la etiqueta.

Look-and-feel Observación 15,3A LinkLabel es el control preferido para indicar que el usuario puede hacer clic en un enlace para saltar a un recurso, como una página web, aunque otros controles pueden realizar tareas similares.

Figura 15.12 | control LinkLabel en el programa en ejecución.

Page 15: Tra Ducci On

LinkLabel properties and an event DescriptionCommon Properties ActiveLinkColorLinkAreaLinkBehavior

LinkColor

LinkVisited

Text UseMnetnonic

VisitedLinkColor

Common EventLinkClicked

Especifica el color del vínculo activo cuando se hace clic.Especifica qué parte del texto en el LinkLabel es parte del enlace.Especifica el comportamiento del enlace, por ejemplo, cómo aparece el vínculo cuando se coloca el ratón sobre él.Especifica el color original de los enlaces antes de que hayan sido visitados. El color por defecto es por el sistema, y es generalmente de color azul.Si es cierto, el enlace aparece como si se ha visitado (el color cambia a lo especificado por la propiedad VisitedLinkColor). El valor predeterminado es false.Especifica el texto del control.Si es verdad, y el carácter de la propiedad Text actúa como un acceso directo (similar al atajo Alt en los menús).Especifica el color de los enlaces visitados. El color por defecto es el sistema y suele ser de color púrpura.(Argumentos Evento LinkLabel LinkClickedEventArgs)Se genera cuando se hace clic en el enlace. Este es el caso por defecto cuando el control se hace doble clic en el modo de diseño.

Figura 15.13 | propiedades LinkLabel y un evento.

Clase LinkLabelTestForm (Fig. 15.14) utiliza tres LinkLabels tolinkto elC: unidad, el sitio Deitel (. Www. Deitel com) y la aplicación Bloc de notas, respectivamente. Las propiedades del texto del LinkLabel'sdriveLinkLabel, deitelLinkLabel y notepadLinkLabel describen el propósito de cada vínculo.

La controladores de eventos para los LinkLabels llaman al método Start de la clase Process (System.Diagnosties espacio de nombres), lo que le permite ejecutar otros programas o documentos de carga o en los sitios web de una aplicación. Método Start puede tomar un argumento, el archivo que desea abrir, o dos argumentos, la aplicación se ejecute y sus argumentos de línea de comandos. Argumentos Método de inicio pueden estar en la misma forma que si se abonaran como entrada para el comando Ejecutar de Windows (Inicio> Ejecutar ...). Para las aplicaciones que se conocen a Windows, no se necesitan nombres completos de rutas, y la extensión del archivo a menudo se pueden omitir. Para abrir un archivo de un tipo que Windows lo reconoce (y sabe cómo manejar), sólo tiene que utilizar el nombre de ruta completo del archivo. Por ejemplo, si un pase al método a. doc de Microsoft Word, Windows se abrirá en Microsoft Word. El sistema operativo Windows tiene que ser capaz de utilizar la aplicación asociada con la extensión del fichero dado para abrir el archivo.

Page 16: Tra Ducci On
Page 17: Tra Ducci On

Figura 15.14 | LinkLabels utilizados para vincular a una unidad, una página web y una aplicación. (Parte 2 de 2).

El controlador de eventos para el evento LinkClicked de driveLinkLabel busca la unidad C: (líneas 19-26). La línea 23 establece la propiedad LinkVisited en true, lo que cambia el color del enlace de azul a morado (los colores LinkVisited se pueden configurar a través de la ventana de pro-piedades en Visual Studio). El controlador de eventos pasa @ "C: \" con el método Start (línea 25), que abre una ventana de Windows Explorer. El símbolo @ que pusimos antes de "C: \" indica que todos los caracteres de la cadena deben ser interpretados literalmente-lo que se conoce como una cadena literal. Por lo tanto, la barra invertida dentro de la cadena no se considera que es el primer carácter de una secuencia de escape. Esto simplifica cadenas que representan las rutas de directorio, ya que no es necesario utilizar \ \ para cada carácter \ en el camino.El controlador de eventos para el evento LinkClicked de Deitel LinkLabel (líneas 29-36) se abre la página web www.deitel. Com en el navegador web predeterminado del usuario. Esto lo logramos haciendo pasar la dirección de la página Web como una cadena (línea 35), que se abre la página web en una nueva ventana del navegador o pestaña. Línea 33 establece la propiedad LinkVisited en true.El controlador de eventos para el evento LinkClicked de notepadLinkLabel (líneas 39-48) se abre la aplicación Bloc de notas. Línea 43 establece la propiedad LinkVisited en true para que el vínculo aparece como un vínculo visitado. Línea 47 pasa por el argumento de la "libreta" al método Start, que se ejecuta notepad.exe. Tenga en cuenta que, en la línea 47, ni la ruta completa ni el. Exe se requiere a Windows reconoce automáticamente el argumento dado con el método Start como un archivo ejecutable.

15.6 control ListBox

El control ListBox permite al usuario ver y seleccionar entre múltiples elementos en una lista. Lista-Las cajas son entidades estáticas GUI, lo que significa que los usuarios no pueden editar directamente en la lista de materiales. El usuario puede estar provisto de cuadros de texto y botones con los que para especificar los elementos que se añade a la lista, pero las adiciones reales deben ser realizados en el código. El CheckedList ¬ caja de control (Sección 15.7) se extiende un ListBox mediante la inclusión de casillas de verificación junto a cada elemento de la lista. Esto permite a los usuarios realizar controles de elementos múltiples a la vez, ya que es posible con los controles CheckBox. (Los usuarios también pueden seleccionar elementos múltiples de un ListBox estableciendo la propiedad SelectionMode del control ListBox, que se discute en breve.) Figura 15.15 muestra un Li stBox y CheckedListBox. En ambos controles, barras de desplazamiento aparecen si el número de elementos supera el

Page 18: Tra Ducci On

área visible del control ListBox.Figura 15.16 listas comunes de propiedades y métodos ListBox y un evento común. La propiedad SelectionMode determina el número de elementos que se pueden seleccionar. Esta

Figura 15.15 | ListBox CheckedListBox y en un Form.

ListBox properties, methods and an event Description

Common Properties

ítems

MultiColumn

Selectedlndex

Selectedlndices

Selectedltem

Selectedltems

SelectionMode

Sorted

Common Methods

ClearSelected

GetSelected

Common EventSel ectedlndexChanged

La colección de elementos del ListBox.Indica si el ListBox puede mostrar varias columnas. Varias columnas eliminar barras de desplazamiento vertical de la pantalla.

Devuelve el índice del elemento seleccionado. Si no hay elementos han sido seleccionados, la propiedad devuelve -1. Si el usuario selecciona objetos múltiples, esta propiedad devuelve sólo uno de los índices seleccionados. Por esta razón, si los artículos múltiples se seleccionan, se debe utilizar Selectedlndices propiedad.

Devuelve una colección que contiene los índices de todos los elementos seleccionados.

Devuelve una referencia al elemento seleccionado. Si se seleccionan múltiples elementos, devuelve el artículo con el número de índice más bajo.

Devuelve una colección del elemento seleccionado (s).

Determina el número de elementos que se pueden seleccionar y los medios a través de los elementos que pueden seleccionar múltiples. Valores ninguno, uno, Multi simple (selección múltiple permite) o MUI ti Extended (selección múltiple permite el uso de una combinación de teclas o clics de ratón y Shift y Ctrlkeys).

Indica si los elementos se ordenan alfabéticamente. Ajuste el valor de esta propiedad en true ordena los elementos. El valor predeterminado es false.

Anula la selección de todos los elementos.

Toma un índice como argumento y devuelve true si se selecciona la opción correspondiente.

Se genera cuando los cambios de índice seleccionado. Este es el valor predeterminado caso cuando el control se hace doble clic en el designen

Page 19: Tra Ducci On

Figura 15.16 | ListBox propiedades, métodos y un evento.

propiedad tiene posibles valores Ninguno, Uno, MultiSimple y MultiExtended (de la enumeración SelectionMode), las diferencias entre estas opciones se explican en la figura. 15.16. El evento SelectedlndexChanged se produce cuando el usuario selecciona un nuevo elemento.Tanto el ListBox y CheckedListBox tiene artículos propiedades Selectedltem y Selectedlndex. Elementos de Propiedad devuelve un colecion de los elementos de la lista. Las colecciones son una forma común para gestionar listas de objetos en el marco. NET. Muchos. NET GUI componente (por ejemplo, ListBoxes) utilizan colecciones para exponer las listas de objetos internos (por ejemplo, los elementos de un ListBox). Se discuten las colecciones en el capítulo 28. La colección devuelta por elementos de propiedad se representa como un objeto de tipo ObjectCollection. Propiedad Selectedltem añadir myListltem cadena a ListBox myListBox. Para agregar varios objetos, puede llamar al método Add tiempos múltiples o llamar al método AddRange para agregar una matriz de objetos. Clases y ListBox CheckedListBox cada llamada al método ToString del objeto sometido a determinar la etiqueta de la entrada del objeto correspondiente en la lista. Esto le permite añadir diferentes objetos a un ListBox o CheckedListBox que luego pueden ser devueltos a través de propiedades selectedItem y SelectedItems.Como alternativa, puede agregar elementos a ListBoxes y CheckedListBoxes visualmente mediante el examen de la propiedad Items en la ventana Propiedades. Al hacer clic en el botón de puntos suspensivos se abre el Editor de la colección de cadenas, que contiene un área de texto para añadir elementos, cada elemento aparece en una línea distinta (Fig. 15.17). Visual Studio se escribe código para agregar estas cadenas de la colección de elementos dentro de un método InitializeComponent.

La figura 15.18 utiliza ListBoxTestForm clase para agregar, quitar y borrar los elementos de ListBox displayListBox. Clase ListBoxTestForm utiliza TextBox inputTextBox para permitir que el usuario escriba un nuevo elemento. Cuando el usuario hace clic en el botón Agregar, el nuevo elemento aparece en displayListBox. Del mismo modo, si el usuario selecciona un elemento y hace clic en Eliminar, se elimina el elemento. Al hacer clic en Borrar elimina todas las entradas de displayListBox. El usuario termina la aplicación haciendo clic en Salir.El controlador de eventos clickaddButton_Cl (líneas 20-24) Método calis Agregar de los elementos recolección en el ListBox. Este método toma un ng stri como el elemento a añadir a displaylistBox. En este caso, la cadena que se utiliza es la entrada del usuario desde el inputTextBox (línea 22). Después se añade el artículo, inputTextBox.Text se borra (línea 23).El controlador de eventos removeButton_Click (líneas 27-33) utiliza el método RemoveAt para eliminar un elemento del ListBox. Controlador de eventos removeButton_Click primero utiliza Selectedlndex propiedad para determinar el índice que se ha seleccionado. Si Selectedlndex no es -1 (es decir, se selecciona un elemento), líneas 31-32 eliminar el elemento que se corresponde con el índice seleccionado.

Figura 15.17 | Editor de la colección de cadenas.

El controlador de eventos clearButton_Click (líneas 36-39) llamada al método Clear de la colección de elementos (linea 38). Esto elimina todas las entradas de displayListBox. Por último, controlador de eventos exitButton_CIick (lineas 32-45) finaliza la aplicación llamando al método Applicación. Exit (linea 44).

Page 20: Tra Ducci On
Page 21: Tra Ducci On

. figura 15.18 | Programa que añade, elimina y borrar elementos ListBox. (Parte 2 de 2).

Control de CheckedListBox

El control CheckedListBox deriva de ListBox y displaysa CheckBox con cada elemento. Los artículos se pueden agregar a través de métodos Add y AddRange o mediante el Editor de la colección de cadenas. CheckedListBoxes permiten múltiples elementos que deben controlarse, pero la selección de tema es más restrictiva. Los únicos valores de la propiedad SelectionMode son None y uno. Se permite una única selección, mientras que ninguno permite ninguna selección. Tenga en cuenta que debido a que un artículo debe de seleccionar a comprobar, debe establecer la SelectionMode ser Uno, si desea permitir usua-rios para comprobar los elementos. Así, alternando SelectionMode bienes entre uno y ninguno pasa efectivamente entre activar y desactivar la capacidad del usuario para comprobar los elementos de lista. Propiedades comunes, eventos y métodos de CheckedListBoxes aparecen en la figura. 15.19.

Error común de programación 15.1El IDE muestra un mensaje de error si se intenta establecer la propiedad SelectionMode para Multi-Simple o Multiextendido en la ventana Propiedades de un CheckedListBox. Si este valor se establece mediante programación, se produce un error de tiempo de ejecución.

ItemCheck evento se produce cada vez que comprueba un usuario activa o desactiva un elemento CheckedListBox. Propiedades argumento del evento CurrentValue y NewValue CheckStatevalúes retorno para el estado actual y el nuevo de la partida, respectivamente. Una comparación de estos valores permite determinar si el elemento CheckedListBox fue marcado o no. El control ListBox facturado conserva las Selectedltems y propiedades Selectedlndices (se les hereda de la clase ListBox). Sin embargo, también incluye propiedades Checkedltems y Checkedlndices, que devuelven información acerca de los elementos comprobados e índices.

Page 22: Tra Ducci On

CheckedListBox properties, a method and events

Description

Common Properties

Checkedltems

CheckedlndicesCheckOnClick

SelectionMode

Common MethodGetltemChecked

Common EventItemCheck

ItemCheckEventArgs PropertiesCurrentValueIndexNewValue

(Todas las propiedades ListBox, métodos y eventos son heredados por CheckedLi stBox.)Contiene la colección de elementos que se comprueban. Esto es distinto de la opción seleccionada, que se destaca (pero no comprobado necesariamente). [Nota: No puede haber a lo sumo un elemento seleccionado en un momento dado.]Retorna índices de todos los elementos seleccionados.Cuando es true y el usuario hace clic en un elemento, el elemento es a la vez seleccionada y activada o desactivada. De forma predeterminada, esta propiedad es false, que menas que el usuario debe seleccionar un elemento y, a continuación, haga clic de nuevo para marcar o desmarcar ella.

Determina si los elementos se pueden comprobar. Los posibles valores son Uno (permite múltiples controles que se colocan) o None (no permite que los controles sean colocados).Toma un índice y devuelve true si el elemento correspondiente está activado.(Evento argumentos ItemCheckEventArgs) Se genera cuando un elemento está activado o desactivado.Indica si el elemento actual está marcado o no. posible

Los valores son cuadros, desenfrenado e indeterminado.Devuelve el índice del elemento que cambió de base cero.Especifica el nuevo estado del elemento.

Figura 15.19 | propiedades CheckedListBox, un método y eventos.

En la figura. 15.20, clase CheckedListBoxTestForm utiliza un CheckedListBox y ListBox para mostrar la selección de un usuario de libros. El CheckedLi TBox permite al usuario seleccionar títulos mul ¬ ples. En el Editor de la colección de cadenas, se añadieron elementos para algunos libros Deitel: C + +, Java ™, Visual Basic, Internet & WW, Perl, Python, Internet Wi-Fi y Java Avanzado (la HTP acrónimo de "How to Program"). El ListBox (llamado display-ListBox) muestra la selección del usuario. En las imágenes que acompañan a este ejemplo, el CheckedListBox aparece a la izquierda, el ListBox a la derecha.Cuando los controles usuario activa o desactiva un elemento en inputCheckedListBox, un evento ocurre y ItemCheck inputCheckedListBox_ItemCheck controlador de eventos (líneas 19-31) ejecuta. Un caso .. declaración. (líneas 27-30) determina si el usuario activada o desactivada en un elemento del CheckedListBox. La línea 27 utiliza la propiedad NewValue para determinar si el artículo se está comprobando (CheckState. Checked). Si el usuario selecciona un elemento, la línea 28 añade

Page 23: Tra Ducci On
Page 24: Tra Ducci On

Figura 15.20 | CheckedListBox y el cuadro de lista utilizado en un programa para mostrar una selección del usuario.

la entrada marcada con el ListBox displayListBox. Si el usuario desmarca un elemento, la línea 30 elimina el elemento correspondiente de di spl ayli stBox. Este controlador de eventos fue creado para seleccionar el CheckedListBox en modo de diseño, se muestran los eventos del control en la ventana adecuada ¬ lazos y haga doble clic en el evento ItemCheck.

15.8 Control de ComboBox

El control ComboBox combina las características de texto con una lista, una lista desplegable GUI componente que contiene una lista de la que se puede seleccionar un valor. Un ComboBox suele aparecer como un cuadro de texto con una flecha hacia abajo a la derecha. Por defecto, el usuario puede introducir texto en el texto ¬ Caja o haga clic en la flecha hacia abajo para mostrar una lista de elementos predefinidos. Si un usuario elige un ele ¬ ción de esta lista, ese elemento se muestra en el cuadro de texto. Si la lista contiene más elementos que se pueden mostrar en la lista desplegable, aparece una barra de desplazamiento. El número máximo de elementos que una lista desplegable puede mostrar al mismo tiempo se establece por la propiedad MaxDropDownltems. La figura 15.21 muestra un ComboBox muestra en tres estados diferentes.Al igual que con el control ListBox, puede agregar objetos a elementos de la colección mediante programación, utilizando métodos Añadir y AddRange o visual, con el editor de la colección de cadenas. Figura 15.22 se enumeran las propiedades comunes y un evento común de la clase ComboBox.

Figura 15.21 | demostración ComboBox.

Page 25: Tra Ducci On

Figura 15.22 | propiedades ComboBox y un evento. (Parte 2 de 2)

Look-and-feel Observación 15,4Utilice un ComboBox para ahorrar espacio en una GUI. Una desventaja es que, a diferencia de un ListBox, el usuario no puede ver los elementos disponibles sin necesidad de expandir la lista desplegable.

Propiedad DropDownStyle determina el tipo de ComboBox y se representa como un valor de la enumeración ComboBoxStyle, que contiene valores simples, desplegable y DropDownList. Simple opción no muestra una flecha desplegable. En su lugar, aparece una barra de desplazamiento al lado del control, lo que permite al usuario seleccionar una opción de la lista. El usuario también puede introducir una selección. Estilo desplegable (por defecto) muestra una lista desplegable en la flecha hacia abajo se hace clic en (o se pulsa la tecla de flecha hacia abajo). El usuario puede introducir un nuevo elemento en el cuadro combinado. El último estilo es DropDownList, que muestra una lista desplegable, pero no permite que el usuario escriba en el cuadro de texto.

El control ComboBox tiene propiedades ítems (acumulación), Selectedltem y Select-edlndex, que son similares a las propiedades correspondientes en ListBox. No puede haber a lo sumo un elemento seleccionado en un ComboBox. Si no se seleccionan elementos, entonces Selectedlndex es -1. Cuando cambia el elemento seleccionado, se produce un evento ectedlndexChanged Sel.Clase ComboBoxTestForm (Fig. 15.23) permite a los usuarios seleccionar una forma de drawCircle, elipse, cuadrada o circular (en versiones con o sin relleno), mediante el uso de un ComboBox. El ComboBox en este ejemplo no se puede editar, por lo que el usuario no puede escribir en el cuadro de texto.

Look-and-feel Observación 15,5Haga una lista (como ComboBoxes) editable sólo si el programa está diseñado para aceptar los elementos presentados usuario. De lo contrario, el usuario puede intentar introducir un elemento personalizado que es inadecuada para los fines de su aplicación.

ComboBox propertiesand an event

Description

Common PropertiesDropDownStyle

ítemsMaxDropDownltems

Selectedlndex

SelectedltemSorted

Common EventSelectedlndexChanged

Determina el tipo de ComboBox. Valor simple significa que la parte de texto es editable y la parte de lista es siempre visible. Desplegable Valor (por defecto) significa que la parte de texto es editable pero el usuario debe hacer clic en un botón de flecha para ver la parte de lista. Valor desplegableList significa que la parte de texto no es editable y el usuario debe hacer clic en el botón de la flecha para ver la parte de lista.La colección de los elementos del control ComboBox.Especifica el número máximo de elementos (entre 1 y 100) que la lista desplegable puede mostrar. Si el número de elementos supera el número máximo de elementos a mostrar, aparecerá una barra de desplazamiento.Devuelve el índice del elemento seleccionado. Si no hay ningún elemento seleccionado, se devuelve -1.Devuelve una referencia al elemento seleccionado.Indica si los elementos se ordenan alfabéticamente. Ajuste el valor de esta propiedad en true ordena los elementos. El valor predeterminado es false.

Se genera cuando cambia el índice seleccionados (por ejemplo, cuando un diferente elemento está seleccionado). Este es el caso por defecto cuando el control se hace doble clic en el diseñador.

Page 26: Tra Ducci On
Page 27: Tra Ducci On

. figura 15.23 | ComboBox utiliza para dibujar una forma seleccionada. (Parte 3 de 3).

Después de crear imageComboBox ComboBox, que sea editable estableciendo su DropDownStyle en DropDownList en la ventana Propiedades. A continuación, agregar artículos Círculo, Cuadrado, elipse, pastel, círculo relleno, relleno de la plaza, y elipse Lleno Lleno Pie de la colección de elementos mediante el Editor de la colección de cadenas. Cada vez que el usuario selecciona un elemento de imageComboBox, un evento SelectedlndexChanged ocurre y controlador de eventos ImageCombo-Box_SelectedIndexChanged (líneas 19-66) ejecuta. Las líneas 23 a 29 crean un objeto Graphics, una pluma y un Sol i dBrush, que se utiliza para dibujar en el formulario. El objeto Graphics (línea 23) permite una pluma o un pincel para dibujar sobre un componente, usando uno de varios métodos Graphics. El objeto Pen (línea 26) es utilizado por métodos DrawEllipse, DrawRectangle y DrawPie (líneas 38, 41, 44 y 47) para dibujar los contornos de sus correspondientes formas. El objeto SolidBrush (línea 29) es utilizado por métodos Fi 11 Ellipse, FillRectangle y FillPie (líneas 50, 53-54, 57 y 60-61) para llenar sus correspondientes formas sólidas. Línea 32 colores de toda la forma blanca, a través de Gráficos método Clear.La aplicación dibuja una forma basada en el índice del elemento seleccionado. El interruptor de declaración (líneas 35-63) utiliza imageComboBox. Selectedlndex para determinar qué elemento del seleccionado por el usuario. Gráficos método DrawEllipse (line 38) realiza un Pen, el x-e-j / coordenadas del centro y la anchura y la altura de la elipse para dibujar. El origen del sistema de coordenadas está en la esquina superior izquierda del formulario, los aumentos de x-coordenada a la derecha, y el j / coordenada aumenta hacia abajo. Un círculo es un caso especial de una elipse (con la anchura y altura igual). Línea 38 dibuja un círculo. Línea 44 dibuja una elipse que tiene diferentes valores de anchura y altura.Clase método DranRectangle Gráficos (line 41) realiza un Pen, el x-y ^-coordenadas de la esquina superior izquierda y el ancho y la altura del rectángulo para dibujar. Método DrawPie (line 47) dibuja un pastel como parte de una elipse. La elipse está limitada por un ángulo ¬ rect. Método DrawPie toma una pluma, la x-e y-coordenadas de la esquina superior izquierda del rectángulo, el ancho y la altura, el ángulo de inicio (en grados) y el ángulo de barrido (en grados) de la torta. Aumentar los ángulos de las agujas del reloj. El FUI Elipse (líneas 50 y 57), Fill-Rectangle (línea 53-54) y FUI Pie (línea 60-61) los métodos son similares a sus contrapartes sin cubrir, excepto que se toman un pincel (por ejemplo, SolidBrush) en lugar de un Pen. Algunas de las formas dibujadas se ilustran en las capturas de pantalla de la figura. 15.23.

Page 28: Tra Ducci On

15.9 Control TreeView

El control TreeView muestra los nodos jerárquicamente en un árbol, tradicionalmente, los nodos son objetos que contienen valores y pueden referirse a otros nodos. Nodo Aparente contiene nodos secundarios, e los nodos secundarios pueden ser los padres a otros nodos. Dos nodos secundarios que tienen el mismo nodo padre se consideran nodos hermanos. Un árbol es un conjunto de nodos, normalmente organizados en forma jerárquica. El primer nodo principal de un árbol es el nodo raíz (un TreeView puede tener múltiples raíces). Por ejemplo, el sistema de archivos de un ordenador se puede representar como un árbol. El directorio de nivel superior (C :) tal vez sería la raíz, cada subcarpeta de C: sería un nodo secundario e cada carpeta niño podría tener sus propios hijos. Controles TreeView son útiles para mostrar la información jerárquica, tales como la estructura de archivos que acabamos de mencionar. Cubrimos nodos y árboles en mayor detalle en el Capítulo 26, Estructuras de datos. La figura 15.24 muestra un control TreeView muestra en un formulario.Un nodo padre se puede expandir o contraer haciendo clic en el cuadro de más o menos el cuadro a su izquierda. Los nodos sin hijos no tienen estas cajas.Los nodos de un TreeView son instancias de la clase TreeNode. Cada TreeNode tiene una colección de nodos (tipo TreeNodeCollectiori), que contiene una lista de otros TreeNodes-conocidos como sus hijos. La propiedad Parent devuelve una referencia al nodo padre (o Nuil si el nodo es un nodo raíz). La figura 15.25 y la fig. 15.26 enumerar las propiedades comunes de TreeViews e TreeNodes, métodos TreeNode comunes y un evento TreeView común.

Figura 15.24 | TreeView muestra un simple árbol

. figura 15.25 | propiedades TreeView y un evento.

TreeViewpropertiesand an event

Description

Comrnon Properties

CheckBoxes

ImageListNodes

selectedNode

Common Event (Event argumento TreeViewEventArgs)AfterSel ect

Indica si las casillas de verificación aparecen junto a los nodos ^ Un valor de true muestra CheckBoxes. El valor predeterminado es false.Especifica un objeto ImageList que contiene los iconos de nodo. Una lista de objetos de imagen es una colección que contiene los objetos de imagen.Muestra la colección de TreeNodes en el control de morir. Contiene métodos Añadir (añade aTreeNode objeto), Clear (borra toda la colección) y Eliminar (elimina un nodo específico). Eliminación de un nodo padre elimina todos sus hijos.El nodo seleccionado.

Generada después de los cambios nodo seleccionado. Este es el evento predeterminado cuando el control se hace doble clic en el designen

Page 29: Tra Ducci On

Figura 15.26 | propiedades y métodos TreeNode. (Parte 2 de 2).

Para agregar nodos a TreeView visualmente, haga clic en los puntos suspensivos junto a la propiedad de nodos en la ventana Propiedades. Se abrirá el Editor TreeNode (Fig. 15.27), que muestra un árbol vacío que representa el TreeView. Hay botones para crear una raíz y agregar o eliminar un nodo. A la derecha están las propiedades del nodo actual. Aquí puede cambiar el nombre del nodo.Para agregar nodos mediante programación, primero cree un nodo raíz. Crear un nuevo objeto TreeNode y pasarlo una cadena para mostrar. A continuación, llamar al método Add para agregar esta nueva TreeNode a la colección de nodos de TreeView. Por lo tanto, para agregar un nodo raíz para TreeViewmyTreeView, escribirmyTreeView.Nodes.Add (nueva TreeNode (rootLabel '));donde myTreeView es el ew TreeVi a la que estamos añadiendo nodos y rootLabelh el texto a mostrar en myTreeView. Para agregar a los niños a un nodo raíz, añadir nuevos TreeNodes a su colección de nodos. Seleccionamos el nodo raíz apropiado de la TreeView escribiendo

TreeNode propertiesand methods

Description

Common PropertiesCheckedFirstNode

FullPathImagelndex

LastNode

NextNode

Nodes

PrevNode

SelectedlmagelndexTextCollapseExpandExpandAllGetNodeGount

Indica si el TreeNode se comprueba (propiedad CheckBoxes se debe establecer en true en el TreeView primario).Específica el primer nodo de la colección de nodos (es decir, el primer hijo en el árbol).Indicares el camino del nodo, a partir de la raíz del árbol.Especifica el índice de la imagen que se muestra cuando está seleccionado el nodo.Especifica el último nodo de la colección de nodos (es decir, que el último hijo en el árbol).Nodo relacionado Siguiente.

Colección de TreeNodes contenidos en el nodo actual (es decir, todos los hijos del nodo actual). Contiene métodos Añadir (añade un objeto de nodo de árbol), Clear (borra toda la colección) y Eliminar (elimina un nodo específico). Eliminación de un nodo padre elimina todos sus hijos.Nodo relacionado anterior.

Especifica el índice de la imagen a usar cuando se selecciona el nodo.Especifica el texto TreeNodes.Contrae un nodo.Se expande un nodo.Expande todos los hijos de un nodo.Devuelve el número de nodos secundarios.

Page 30: Tra Ducci On

Figura 15.27 | Editor TreeNode.myTreeView.Nodes [myindex]donde myindex es el índice del nodo raíz en la colección de nodos myTreeViews. Añadimos nodos a nodos secundarios por el mismo proceso por el cual hemos añadido nodos raíz a myTreeView. Para agregar un hijo al nodo raíz en el índice myindex, escribirmyTreeView.Nodes [mylndex ~ \ Nodes.Add (nueva TreeNodeC ChildLabel)).;ClassTreeViewDi rectoryStructu Reforma (Fig. 15.28) utiliza un TreeView para mostrar el contenido de un directorio elegido por el usuario. Un cuadro de texto y un botón se utilizan para especificar el directorio. En primer lugar, escriba la ruta completa del directorio que desea mostrar. A continuación, haga clic en el botón para establecer el directorio especificado como el nodo raíz en el TreeView. Cada subdirectorio de este directorio se convierte en un nodo secundario. Esta disposición es similar a la utilizada en el Explorador de Windows. Las carpetas se pueden expandir o contraer haciendo clic en las casillas de más o menos que aparecen a su izquierda.

Page 31: Tra Ducci On
Page 32: Tra Ducci On

Cuando el usuario hace clic en el botón ENTER, todos los nodos directoryTreeView se borran (línea 68). A continuación, la ruta introducida en inputTextBox se utiliza para crear el nodo raíz. Línea 76 añade el directorio de di rectoryTreeView como el nodo raíz, y las líneas 79-80 llamada al método PopulateTreeView (líneas 21-62), que tiene un directorio (una cadena) y un nodo principal. Método PopulateTreeView luego crea nodos secundarios correspondientes a los subdirectorios del directorio que recibe como argumento.PopulateTreeView Método (líneas 21-62) obtiene una lista de los subdirectorios, utilizando el método de GetDirectories Directorio clase (espacio de nombres System.IO) en las líneas 25-26. GetDirectories método toma una cadena (el directorio actual) y devuelve una matriz de cadenas (los subdirectorios). Si un directorio no es accesible por razones de seguridad, una UnauthorizedAccessException es lanzada. Líneas 58-61 detectar esta excepción y añadir un nodo que contiene "Acceso denegado" en lugar de mostrar los subdirectorios.Si hay subdirectorios accesibles, líneas 42-43 método de uso GetFileNameWithout-Extensi el Camino de clase para aumentar la legibilidad al acortar la ruta completa a poco el nombre del directorio. La clase Path proporciona funcionalidad para trabajar con cadenas que son las rutas de archivo o directorio. A continuación, cada cadena de la directoryArray se utiliza para crear un nuevo nodo secundario (línea 46). Utilizamos el método Add (línea 49) para añadir cada nodo hijo al padre. Entonces PopulateTreeView método se llama de forma recursiva en todos (línea 52) subdirectorio, que finalmente llena el TreeView con toda la estructura de directorios. Tenga en cuenta que nuestro algoritmo recursivo puede provocar un retraso en el programa carga directorios grandes. Sin embargo, una vez que los nombres de las carpetas se agregan a la colección de nodos apropiados, se pueden expandir y contraer sin demora. En la siguiente sección, se presenta un algoritmo alternativo para resolver este problema.

15.10 ListView

El control ListView es similar a un control ListBox en que ambas listas de visualización de la cual el usuario puede seleccionar uno o más elementos (un ejemplo de un ListView se pueden encontrar en la fig. 15-31). ListView es más versátil y puede mostrar los elementos en diferentes formatos. Por ejemplo, un ListView puede mostrar iconos junto a los elementos de la lista (controlada por la propiedad ImageList) y muestran los detalles de los elementos de las columnas. Propiedad MultiSelect (a bool) determina si los elementos multiples pueden ser seleccionados. CheckBoxes pueden incluirse mediante el establecimiento de CheckBoxes propiedad (un bool) en true, haciendo la apariencia de la ListView similar a la de un CheckedListBox. La propiedad View especifica la disposición del ListBox. Activación de la propiedad determina el método por el cual el usuario selecciona un elemento de la lista. Los detalles de estas propiedades y el evento ItemActivate se explican en la figura. 15.29.ListView permite definir las imágenes utilizadas como iconos de elementos ListView. Para visualizar las imágenes, se requiere un componente ImageList. Crear una arrastrándolo a un formulario desde el Cuadro de herramientas. A continuación, seleccione la propiedad de Imágenes en la ventana Propiedades para mostrar el Editor de la colección de imágenes (Fig. 15.30). Aquí puedes ver las imágenes que desea agregar a la ImageList, que contiene una serie de imágenes. Adición de imágenes de esta manera les incrusta en la aplicación (como los recursos), por lo que no necesitan ser incluidos por separado con la aplicación publicada. Ellos no son sin embargo parte del proyecto. En este ejemplo,

Page 33: Tra Ducci On

ListView properties and an event DescriptionCommon PropertiesActivation

CheckBoxes

LargelmageList

ítemsMultiSelect

SelectedltemsSmallImageList

View

Common Event ItemActivate

Determina el usuario activa un elemento. Esta propiedad tiene un valor de la enumeración ItemActivation. Los valores posibles son OneCl ick (un clic de activación), TwoClick (doble clic activación, elemento cambia de color cuando se selecciona) y Standard (doble clic acti ¬ vación, elemento no cambia de color).Indica si los elementos aparecen con casillas de verificación. True muestra casillas de verificación. El valor predeterminado es false.Especifica el ImageList que contiene grandes iconos de la pantalla.Devuelve la colección de ListViewItems en el control.Determina si la selección múltiple está permitida. El valor predeterminado es true, lo que permite la selección múltiple.Obtiene la colección de elementos seleccionados.Especifica el ImageList que contiene los iconos pequeños para su visualización.Determina la apariencia de ListViewItems. Los valores posibles son LargeIcon (gran icono en pantalla, los elementos pueden estar en varias columnas), icono pequeño (pequeño icono que se muestra, los elementos pueden estar en varias columnas), List (pequeños iconos que aparecen, los elementos aparecen en una sola columna), Detalles (como Lista, pero varias columnas de información puede ser visualizado por artículo) y Ti le (iconos grandes aparecen, información suministrada a la derecha del icono, válida sólo en Windows XP o posterior).Se genera cuando se activa un elemento del ListView. No contiene la específica de qué elemento se activa.

Figura 15.29 | propiedades ListView y un evento.

. figura 15.30 | Imagen ventana Editor de la colección de un componente ImageList.

hemos añadido imágenes al ImageList mediante programación más bien de usar el Image Editor Colección para que pudiéramos utilizar los recursos de imagen. Después de crear una ImageList vacío, agregue el archivo y la carpeta de imágenes de iconos para el proyecto como recursos. A continuación, establezca la propiedad SmallImageLista del ListView al nuevo objeto ImageList. SmallImageList propiedad especifica la lista de imágenes de los iconos pequeños. LargelmageList propiedad establece el ImageList de iconos grandes. Los elementos de una Li STVI ew son cada tipo ListViewItem. Los iconos de los elementos de ListView se seleccionan mediante el establecimiento de la propiedad Imagelndex del elemento con el índice correspondiente.Clase ListViewTestForm (Fig. 15.31) muestra los archivos y carpetas en un ListView, junto con pequeños iconos que representan cada archivo o carpeta. Si un archivo o carpeta es inaccesible debido a la configuración de permisos, aparece un cuadro de mensajes. El programa analiza el contenido del directorio que se busca, en lugar de indexar toda la unidad a la vez.Método ListViewTestForm_Load (líneas 114-123) controla el evento Load del formulario. Cuando se carga la aplicación, se añaden las carpetas y archivos imágenes de iconos de la colección de imágenes de FolderlmageList archivo (líneas 117-118). Dado que la propiedad SmallImageList del ListView se establece en este ImageList, la ListView puede mostrar

Page 34: Tra Ducci On

estas imágenes como iconos de cada elemento. Debido a que el icono de la carpeta se añadió por primera vez, tiene el índice de matriz 0, y el icono del archivo tiene índice de matriz 1. La aplicación también carga su directorio personal en el ListView cuando se carga por primera vez (línea 121) y muestra la ruta del directorio (línea 122).

Page 35: Tra Ducci On
Page 36: Tra Ducci On

Figura 15.31 I ListView mostrar archivos y carpetas. (Parte 4 de 4).

Método TheLoadFilesInDirectory (líneas 64-111) rellena browserListView con el directorio que se le pasa (currentDirectoryValue). Borra browserListView y añade el elemento "subir un nivel". Cuando el usuario hace clic en este elemento, el programa intenta subir un nivel (vemos como poco). Entonces, el método crea un objeto Directorylnfo inicializado con el currentDirectory string (líneas 75-76). Si no se le da permiso para navegar por el directorio, se produce una excepción (y atrapado en la línea 105). Método LoadFilesInDirectory funciona de manera diferente método PopulateTreeView en el programa anterior (Fig. 15.28). En lugar de cargar todas las carpetas en el disco duro, el método LoadFilesInDirectory sólo carga las carpetas en el directorio actual.Clase Directorylnfo (namespace System. 10) nos permite explorar o manipular la estructura de directorios fácilmente. CetDirectories método (línea 80) devuelve una matriz de objetos Directorylnfo contienen los subdirectorios del directorio actual. Del mismo modo, GetFiles método (línea 80) devuelve una matriz de objetos FiTelnfo clase que contiene los archivos en el directorio actual. Nombre de la propiedad (tanto de clase y la clase Directorylnfo Filelnfo) sólo contiene el directorio o nombre de archivo, tales como la temperatura del lugar de C: \ MiCarpeta \ temp. Para tener acceso al nombre completo, utilice FulName propiedad.Las líneas 84 a 91 y las líneas 94-101 iterar a través de los subdirectorios y archivos del directorio actual ¬ renta y agregarlos a browserListView. Líneas 90 y 100 establecen las propiedades Imagelndex de los elementos de nueva creación. Si un artículo es un directorio, establecemos su icono a un icono del directorio (índice 0), si un elemento es un archivo, establecemos su icono a un icono de archivo (índice 1).

Page 37: Tra Ducci On

Método browserListView_Click (líneas 23-61) responde cuando el usuario hace clic en el control browserListView. Línea 26 comprueba si se ha seleccionado nada. Si se ha hecho una selección, línea 29 determina si el usuario eligió el primer elemento de browserListView. El primer elemento de browserListView siempre subir un nivel, si se selecciona, el programa intenta subir un nivel. Las líneas 32 a 33 crean un objeto Directorylnfo para el directorio actual ¬ toria. Línea 36 pruebas de propiedad Parent para asegurarse de que el usuario no está en la raíz del árbol de directorios. Padres propiedad indica el directorio padre como objeto Directorylnfo, si no existe ningún directorio padre; Parent devuelve el valor nulo. Si el directorio padre existe, líneas 38 a 39 pasan el nombre completo del directorio superior a los LoadFilesInDirectory.Si el usuario no ha seleccionado el primer elemento de browserListView, líneas 44-56 permiten al usuario seguir navegando a través de la estructura de directorios. Línea 47 crea cadena elegida y le asigna el texto del elemento seleccionado (el primer elemento de Selectedltems colección). Líneas 50-51 determinar si el usuario selecciona un directorio válido (en lugar de un archivo). Usando el método Combine de ruta de la clase, el programa combina cadenas currentDirectory y elegido para formar la nueva ruta de directorio. Tenga en cuenta que el método Combine añade automáticamente una barra invertida (\), si es necesario, entre las dos piezas. Este valor se pasa al método Exists de la clase de Di rectoría. Método Exists devuelve true si el parámetro de cadena es un directorio válido. Si es así, el programa pasa a la cadena con el método LoadFilesInDirectory (líneas 53-54). Por último, DISPLAYLABEL se actualiza con el nuevo directorio (línea 59).Este programa se carga rápidamente, porque se indexa sólo los archivos en el directorio actual. Esto significa que se puede producir un pequeño retraso cuando se carga un nuevo directorio. Además, los cambios en la estructura de directorios se pueden mostrar mediante la recarga de un directorio. El programa anterior (fig. 15.28) puede tener un gran retraso inicial, como se carga una estructura de directorio completo. Este tipo de compensación es típico en el mundo del software.

Software Engineering Observación 15,2En el diseño de las aplicaciones que se ejecutan durante largos periodos de tiempo, puede optar por un gran retraso inicial para mejorar el rendimiento durante el resto del programa. Sin embargo, en las aplicaciones que se ejecutan durante períodos cortos, los desarrolladores prefieren tiempos de carga rápidos y retrasos iniciales pequeños después de cada acción.

15.11 control TabControl

El TabControl crea ventanas con fichas, como las que hemos visto en Visual Studio (Fig. 15.32). Esto le permite especificar más información en el mismo espacio en un formulario y le permite a los datos mostrados grupo lógicamente.

. figura 15.32 | ventanas con fichas en Visual Studio

Page 38: Tra Ducci On

Fig. 15.34 | TabPages added to a TabControl.

los elementos de la caja de herramientas. Para ver diferentes TabPages, haga clic en la ficha correspondiente (ya sea en modo de ejecución o diseño). Las propiedades comunes y un evento común de TabControls se describen en la figura. 15.35.Cada TabPage genera un evento Click cuando se hace clic en su ficha. Los controladores de eventos para este evento se pueden crear haciendo doble clic en el cuerpo del TabPage.Clase UsingTabsForm (Fig. 15.36) utiliza un TabControl para mostrar distintas opciones relativas al texto en una etiqueta (Color, Tamaño y mensaje). El último TabPage muestra un mensaje sobre, que describe el uso de TabControls.

TabControl properties and an event DescriptionCommon PropertiesImageListItemSizeMultiline

SelectedlndexSelectedTabTabCountTabPages

Common EventSelectedlndexChanged

Especifica las imágenes que se muestran en pestañas.Especifica el tamaño de la pestaña.Indica si varias filas de pestañas se pueden mostrar.Índice del TabPage seleccionado.El TabPage seleccionado.Devuelve el número de páginas de ficha.Colección de TabPages dentro del TabControl.Se genera cuando cambia Selectedlndex (es decir, se selecciona otro TabPage).

. figura 15.35 | Propiedades de los controles Tab y un evento.

Page 39: Tra Ducci On
Page 40: Tra Ducci On

Figura 15.36 | TabControl utiliza para mostrar diversos ajustes de fuente. (Parte 2 de 2).

El textOptionsTabControl y colorTabPage, sizeTabPage, messageTabPage y aboutTabPage se crean en el diseñador (como se describió anteriormente). El colorTabPage contiene tres componentes RadioButton para los colores negro (blackRadioButton), rojo (redRadioButton) y verde (greenRadioButton). Este TabPage se muestra en la figura. 15.36 (a). El controlador de eventos Check-cambiar para cada RadioButton cambios el color del texto en DISPLAYLABEL (líneas 22, 29 y 36). El sizeTabPage (Fig. 15.36 (b)) tiene tres componentes RadioButton, correspondientes a los tamaños de fuente 12 (sizel2RadioButton), 16 (sizel6RadioButton) y 20 (talla 20RadioButton), que cambian el tamaño de fuente de DISPLAYLABEL-líneas 44, 52 y 60, respectivamente. El messageTabPage (Fig. 15.36 (c)) contiene dos componentes RadioButton para los mensajes Hello (helloRadioButton) y Adiós! (goodbyeRadioButton). Los dos componentes RadioButton determinan el texto en DISPLAYLABEL (líneas 67 y 74, respectivamente). El aboutTabPage (Fig. 15.36 (d)) contiene una etiqueta (messageLabel) que describe el propósito de TabControls

Page 41: Tra Ducci On

Software Engineering Observación 15,3A TabPage puede actuar como contenedor de un único grupo lógico de RadioButtons, haciendo cumplir su exclusividad mutua. Para colocar grupos RadioButton múltiples dentro de un único TabPage, debe agrupar RadioButtons en paneles o GroupBoxes contenidos en el TabPage.

15.12 Interfaz de múltiples documentos (MDI) de WindowsEn los capítulos anteriores, hemos construido sólo para aplicaciones de interfaz de único documento (SDI). Estos programas (incluido el Bloc de notas y Paint de Microsoft) pueden apoyar sólo una ventana abierta o un documento a la vez. Aplicaciones SDI suele tener limitadas capacidades-Paint y Bloc de notas, por ejemplo, tienen limitada la imagen y características de edición de texto. Para editar varios documentos, el usuario debe ejecutar otra instancia de la aplicación SDI.Muchas aplicaciones complejas de múltiples programas de documento de interfaz (MDI), que permiten a los usuarios editar varios documentos a la vez (por ejemplo, productos de Microsoft Office). Programas MDI también tienden a ser más complejos-Paint Shop Pro y Photoshop tienen un mayor número de funciones de edición de imágenes que hace pintura.Ventana principal de un programa de MDI se llama la ventana padre, y cada ventana dentro de la aplicación se conoce como una ventana secundaria. Aunque una aplicación MDI puede tener muchas ventanas secundarias, cada una tiene una sola ventana padre. Por otra parte, un máximo de una ventana secundaria puede estar activo a la vez. Ventanas secundarias no pueden ser los mismos padres y no puede ser trasladado fuera de su padre. De lo contrario, una ventana niño se comporta como cualquier otra ventana (con respecto a la de cierre, lo que minimiza, cambio de tamaño, y así sucesivamente). Una ventana secundaria es funcionalmente puede diferir de la de otras ventanas secundarias de la controladora. Por ejemplo, una ventana secundaria podría permitir al usuario editar imágenes, otro puede permitir al usuario editar el texto y una tercera puede mostrar gráficamente el tráfico de red, pero todos podrían pertenecer a la misma MDI. Figura 15.37 depiets una aplicación MDI muestra con dos ventanas secundarias.Para crear un formulario MDI, cree un nuevo formulario y establezca su propiedad IsMdiContainer en true. El formulario cambia de aspecto, como en la figura. 15.38.A continuación, cree una clase Form hijo que se añade a la Forma. Para ello, haga clic en el proyecto en el Explorador de soluciones, seleccione Proyecto> Agregar Windows Forms ... y el nombre del archivo. Edite el formulario como desee. Para agregar el formulario hijo al padre, debemos crear un nuevo objeto de formulario secundario, establezca su propiedad MdiParent al formulario padre y llame método Show del formulario hijo. En general, para agregar un formulario hijo a un padre, escribir

ChildFormClass childForm = New ChildFormClassQ ', childForm.Mdi Parent = parentForm; childForm.howQ ;

. figura 15.37 | ventana padre MDI y ventanas secundarias MDI.

Page 42: Tra Ducci On

. figura 15.38 | SDI y formularios MDI.En la mayoría de los casos, el Formulario de padre crea el niño, por lo que la referencia ParentForm es esta. El código para crear un niño lo general se encuentra en el interior de un controlador de eventos, que crea una nueva ventana en respuesta a una acción del usuario. Selecciones de menú (como Archivo, seguido por una opción de submenú Nuevo, seguido por una opción de submenú Ventana) son técnicas comunes para la creación de nuevas ventanas secundarias.Clase propiedad Form MdiChildren devuelve una matriz de referencias formulario secundario. Esto es útil si la ventana padre quiere comprobar el estado de todos sus hijos (por ejemplo, asegurándose de que todos son salvos antes de que el padre se cierre). Propiedad ActiveMdiChiTd devuelve una referencia a la ventana secundaria activa, devuelve null si no hay ventanas secundarias activas. Otras características de las ventanas MDI se describen en la figura. 15.39.Ventanas secundarias se pueden minimizar, maximizar y cerrar independientemente de la ventana principal. La figura 15.40 muestra dos imágenes: una que contiene dos ventanas secundarias minimizadas y un segundo que contiene una ventana secundaria maximizada. Cuando el padre se minimiza o se cierra, las ventanas secundarias se minimizan o se cierra también. Observe que la barra de título de la figura. 15.40 (b) es la forma l - [Childl]. Cuando se maximiza una ventana secundaria, el texto de la barra de título se inserta en la barra de título de la ventana principal. Cuando una ventana secundaria se reduce al mínimo o máximo ¬ mized, su barra de título muestra un icono de restauración, que se puede utilizar para volver la ventana secundaria a su tamaño anterior (su tamaño antes de ser minimizada o maximizada).

MDI Form properties, a method and an event Description

Common MDI Child PropertiesIsMdiChiId

Mdi ParentCommon MDI Parent PropertiesActiveMdiChild

IsMdi Container

MdiChildren

Common MethodLayoutMdi

Common EventMdiChiIdActivate

Indica si el formulario es un formulario MDI secundario. Si es cierto, la forma es un MDIhijo (propiedad de sólo lectura).Especifica el formulario MDI primario del niño.Devuelve la forma que es la secundaria MDI activa currendy (devuelve null si no hay niños son activas)

Indica si el formulario puede ser un padre MDI. Si es verdad, el Formulario puede ser un padre MDI. El valor predeterminado es false.Devuelve los niños MDI como una gran variedad de formas.

Determina la visualización de los formularios secundarios en un MDI. El método toma como parámetro una enumeración diseño MDI con los valores posibles Arrangelcons, Cascade, TileHori horizontal y TileVertical. La figura 15.42 muestra los efectos de estos valores.

Se genera cuando un niño de MDI se cierra o se activa.

. figura 15.39 | MDI y MDI secundarios propiedades, métodos y eventos.

Page 43: Tra Ducci On

. figura 15.40 | minimizar y maximizar ventanas secundarias.

C # proporciona una característica que ayuda a que la pista ventanas secundarias están abiertas en un contenedor MDI. MdiWindowListltem propiedad de la clase MenuStrip especifica el menú, en su caso, muestra una lista de ventanas secundarias abiertas. Cuando se abre una nueva ventana secundaria, se añade una entrada a la lista (como en la primera pantalla de la figura 15.41). Si nueve o más ventanas secundarias están abiertas, la lista incluye la opción Más ventanas ..., que permite al usuario seleccionar una ventana de una lista en un cuadro de diálogo.Buenas prácticas en la programación 15.1Cuando las aplicaciones creatingMDI, incluyen un menú que muestra una lista de las ventanas secundarias abiertas. Esto ayuda al usuario a seleccionar una ventana secundaria rápidamente, en lugar de tener que buscar en la ventana principal.Contenedores MDI le permiten organizar la colocación de sus ventanas secundarias. Las ventanas secundarias de una aplicación MDI se pueden arreglar llamando al método LayoutMdi del formulario padre. Método LayoutMdi toma una enumeración MdiLayout, que puede tener Arrangelcons valores, Cascade, TileHorizontal y ventanas en mosaico TileVerticah llenar completamente el padre y no se superponen, tales ventanas se pueden organizar horizontalmente (valor Tile-horizontal) o vertical (valor TileVertical). Ventanas en cascada (valor Cascade)

. figura 15.41 | propiedad MenuItem ejemplo Lista de MDI.

Page 44: Tra Ducci On

superposición-cada uno es el mismo tamaño y muestra una barra de título visible, si es posible. Valor arreglos lcons organiza los iconos de las ventanas minimizadas hijo. Si las ventanas minimizadas se dispersan alrededor de la ventana principal, el valor Arrangelcons ordenadamente en la esquina inferior izquierda de la ventana principal órdenes. La figura 15.42 ilustra los valores de la enumeración MDI-Layout.Clase UsingMDIForm (fig. 15.43) demuestra ventanas MDI. Clase UsingMDIForm utiliza tres ejemplos de la forma hijo ChildForm (Fig. 15.44), cada uno con un cuadro de imagen que muestra una imagen. El formulario MDI principal contiene un menú que permite a los usuarios crear y organizar formularios secundarios.

. figura 15.42 | MdiLayout valores de la enumeración.

Page 45: Tra Ducci On
Page 46: Tra Ducci On

. figura 15.43 I clase de la ventana principal MDI. (Parte 3 de 3).

Formulario MDILa figura 15.43 presenta clase UsingMDIForm el formulario MDI principal de la aplicación. Este formulario, que se creó por primera vez, contiene dos menús de nivel superior. El primero de estos menús, Archivo (fileToolStripMenuItem), contiene un elemento de salida (exitToolStripMenuItem) y un nuevo submenú (newToolStripMenuItem) que consta de elementos para cada ventana hija. El segundo menú, Ventana (windowToolStripMenuItem), proporciona opciones para la colocación de los niños inhaladores de dosis medidas, además de una lista de los niños inhaladores de dosis medidas activas.En la ventana Propiedades, establecemos la propiedad IsMdiContainer del formulario en true, colocar la Forma un padre MDI. Además, hemos creado MdiWi propiedad stltem ndowLi del MenuStri p para wi ndowTool Stri pMenuItem. Esto permite que el menú de la ventana para contener la lista de ventanas MDI niño.

Page 47: Tra Ducci On

El Elemento de menú en cascada (cascadeTool Stri pMenuItem) tiene un controlador de eventos (cascadeToolStripMenuItem_Click, líneas 58-62) que organiza las ventanas secundarias de una manera en cascada. El controlador de eventos llama al método LayoutMdi con el Cascade argumento de la enumeración MdiLayout (línea 61).El Tile Horizontal menú material (tileHorizontalTool Stri pMenuItem) tiene un controlador de eventos (tileHorizontalToolStripMenuItem_Click, líneas 65 a 69) que organiza las ventanas secundarias de una manera horizontal. El controlador de eventos llama al método LayoutMdi con el argumento TileHorizontal de la enumeración MdiLayout (línea 68).Por último, el Tile Vertical menú material (tileVerticalToolStripMenuItem) tiene un controlador de eventos (tileVerticalToolStripMenuItem_Click, líneas 72 a 76) que organiza las ventanas secundarias de una manera vertical. El controlador de eventos llama al método LayoutMdi con el argu ¬ ción Ti1eVertical de la enumeración diseño MDI (línea 75).Formulario MDI secundarioEn este punto, la aplicación sigue siendo incompleta, debemos definir la clase secundaria MDI. Para ello, haga clic en el proyecto en el Explorador de soluciones y seleccione Agregar> Windows Forms .... A continuación, el nombre de la nueva clase en el diálogo como ChildForm (Fig. 15.44). A continuación, se añade un Pic-tureBox (displayPictureBox) para ChildForm. En el constructor de ChildForm, línea 17 establece el texto de la barra de título. Líneas 20-22 recuperar el recurso de imagen adecuada, convertirlo a una imagen y establezca la propiedad Image de displayPictureBox. Las imágenes que se utilizan se pueden encontrar en la subcarpeta Imágenes de directorio de ejemplos de este capítulo.

Una vez definida la clase secundaria MDI, el formulario MDI primario (Fig. 15.43) se pueden crear nuevas ventanas secundarias. Los controladores de eventos en las líneas 16 a 46 crean un nuevo formulario secundario correspondiente a la opción de menú se hace clic. Líneas 22-23, 33-34 y 44-45 crear nuevas instancias de Child-Form. Líneas 24, 35 y 46 establecen la propiedad MDI principal de cada niño en el formulario principal. Líneas 25, 36 y 46 llamada al método Show para mostrar cada formulario secundario.

15.13 herencia visual

Capítulo 11 discute cómo crear clases al heredar de otras clases. También hemos utilizado la herencia para crear formularios que muestran una interfaz gráfica de usuario, mediante la derivación de las nuevas clases se forman a partir del sistema de clases. Windows Forms. Form. Este es un ejemplo de la herencia visual. La clase Form derivada contiene la funcionalidad de su clase de base Form, incluidos los de la clase base propieda-des, los métodos, las variables y los controles. La clase derivada hereda también todos los aspectos visuales-tales como el tamaño, la disposición de los componentes, el espaciado entre los componentes GUI, colores y tipos de letra-de su clase base.Herencia visual permite lograr la coherencia visual en todas las aplicaciones. Por ejemplo, se podría definir un formulario base que contiene el logotipo de un producto, de un color de fondo específico, una barra de menú predefinido y otros elementos. A continuación, puede utilizar el formulario de base de toda la aplicación de la uniformidad y la marca. También se pueden crear controles que heredan de otros controles. Por ejemplo, puede crear un control de usuario personalizado (discutido en la sección 15.14) que se deriva de un control existente.

Page 48: Tra Ducci On

Creación de un formulario BaseClase VisualInheritanceBaseForm (Fig. 15.45) se deriva de la forma. La salida representa el funcionamiento del programa. La interfaz gráfica de usuario contiene dos s Etiqueta con errores de texto, insectos, insectos y Derechos de Autor 2008, por Deitel & Associates, Inc, así como un botón de muestra el texto más. Cuando el usuario pulsa el botón Más información, método 1 earnMoreButton_Cl i ck (líneas 16-22) es invocado. Este método muestra un cuadro de mensaje que proporciona un texto informa-tivo.

Para permitir que otras formas de heredar de Visuallnheri tanceForm, debemos empaquetar VisualInheritanceForm como un archivo. Dll (biblioteca de clases). Haga clic derecho en el nombre del proyecto en el Explorador de soluciones y seleccione Propiedades y, a continuación, seleccione la ficha Aplicación. En el tipo de lista desplegable Salida, cambie la aplicación de Windows en Biblioteca de clases. Construir el proyecto produce

Figura 15.45 | Base Class Herencia Visual From, que hereda de la clase Form, contiene un botón (Más información).

la. dll. Puede configurar un proyecto para ser una biblioteca de clases cuando se crea al seleccionar la plantilla de biblioteca de clases en el cuadro de diálogo Nuevo proyecto. [Nota: Una biblioteca de clases no se puede ejecutar como una aplicación independiente. La pantalla de plasma en figura. 15.45 fueron llevados befo re cambiar el proyecto para ser una biblioteca de clases.]Derivado de un formulario basePara heredar visualmente de Visual InheritanceBaseForm, primero debe crear una nueva aplicación de Windows. En esta aplicación, agregue una referencia al archivo. Dll que acaba de crear (que se encuentra en el bin \ Debug o Bin \ Release de la solución que contiene la fig. 15.45). A continuación, abra el archivo que define la interfaz gráfica de usuario de la nueva aplicación y modificar la línea que define la clase para indicar que el formulario de solicitud debe heredar de la clase Visual InheritanceBase ¬ formulario. La línea de clase-declaración debe aparecer ahora como sigue:

Tenga en cuenta que a menos que haya especificado espacio de nombres Visual heren tanceBase en una usi ng Directiva, debe utilizar el nombre completo VisualInheritanceBase.VisualInheri-tanceBaseForm. En la vista Diseño, Forma de la nueva aplicación debería mostrar ahora los controles heredados de la forma de base (Fig. 15.46). Ahora podemos añadir más componentes al formulario.

Page 49: Tra Ducci On

Clase VisualInheritanceTestForm (Fig. 15.47) es una clase derivada ofVisuallnheri-tanceBaseForm. La salida ilustra la funcionalidad del programa. Los componentes, sus diseños y la funcionalidad de base de clase Visual heren tanceBaseForm (Fig. 15.45) son heredados por VisualInheritanceTestForm. Hemos añadido un botón adicional con el Programa ACERCA DE ESTA texto. Cuando un usuario pulsa este botón, el método aboutButton_Click (Unes 19-25) es invocado. Este método muestra otro cuadro de mensajes que proporciona un texto diferente infor-mativo (líneas 21-24).Si un usuario hace clic en el botón Más Learn, el caso es manejado por el caso de la clase base han-dler learnMoreButton_Click. Debido VisualInheritanceBaseForm utiliza un modificador de acceso privado a declarar sus controles, VisualInheritanceTestForm no puede modificar los controles heredados de la clase Visual heren tanceBaseForm de ninguna manera. Tenga en cuenta que el IDE muestra un pequeño icono en la parte superior izquierda de los controles heredados visual para indicar que se heredan y no se pueden modificar.

. figura 15.46 | Forma demuestra la herencia visual.

Page 50: Tra Ducci On

. figura 15,47 Clase I VisualInheritanceTestForm, que hereda de la clase Visual representación base Herencia, contiene un botón adicional. (Parte 2 de 2).

15.14 Controles definidos por el usuario

El. NET Framework permite crear controles personalizados. Estos controles personalizados aparecer en las Herramientas del usuario y se puede agregar a formularios, paneles o GroupBoxes de la misma manera que agregamos botones, etiqueta s y otros controles predefinidos. La forma más sencilla de crear un control personalizado debe derivar una clase de un control existente, como una etiqueta. Esto es útil si desea agregar funcionalidad a un control existente, en lugar de sustituirlo por uno que proporciona la funcionalidad deseada. Por ejemplo, puede crear un nuevo tipo de etiqueta que se comporta como una etiqueta normal, pero tiene un aspecto diferente. Esto se logra mediante la herencia de la clase Label y redefinición de método OnPaint.

Todos los controles tienen un método OnPaint, que el sistema llama cuando un componente debe ser dibujada (por ejemplo, cuando se cambia el tamaño del componente). Método OnPaint se pasa un objeto Paint-EventArgs que contiene gráficos de propiedad información gráfica son los gráficos objeto utilizado para dibujar y ClipRectangle propiedad define el contorno rectangular del control. Siempre que el sistema genera el evento Paint, clase base de nuestro control atrapa el evento. A través de polimorfismo, el método OnPaint de nuestro control se llama. Aplicación OnPaint de nuestra clase base no se conoce, por lo que debe llamar explícitamente de nuestra aplicación OnPaint antes

Page 51: Tra Ducci On

de ejecutar el código personalizado de pintura. En la mayoría de los casos, usted quiere hacer esto para asegurarse de que el código se ejecuta pintura original, además del código se define en la clase del control personalizado. Alternativamente, si no queremos dejar que el método OnPaint de la clase base ejecutar, nosotros no lo llamamos.Para crear un nuevo control integrado de los controles existentes, utilice UserControT clase. Controles adicionales para un control personalizado se denominan controles constituyentes. Por ejemplo, un programador puede crear un control de usuario compuesto por un botón, una etiqueta y aTextBox, cada uno asociado a algunas funciones (por ejemplo, el botón de ajuste de texto de la etiqueta a la contenida en el cuadro de texto). Los actos UserControl como un contenedor para los controles agregados a ella. El UserControl contiene controles constituyentes, por lo que no determina cómo se muestran estos controles constituyentes. Método OnPaint del control de usuario no puede ser anulado. Para controlar la apariencia de cada control constituyente, debe controlar Paint evento de cada control. El controlador del evento Paint se pasa un objeto PaintEventArgs, que puede ser utilizado para dibujar gráficos (líneas, rectángulos, etc) en los controles constituyentes.Utilizando otra técnica, un programador puede crear un nuevo control que hereda de la clase Control. Esta clase no define ningún comportamiento específico; esta tarea se deja a usted. En cambio, la clase Control se encarga de los temas relacionados con todos los controles, como los eventos y controladores de tamaño. Método OnPaint debe contener una llamada al método OnPaint de la clase base, que llama a los controladores de eventos Paint. A continuación, debe agregar código que dibuja gráficos personalizados dentro del método OnPaint reemplazado al dibujar el control. Esta técnica permite la mayor flexibilidad, pero también requiere la mayoría de la planificación. Todos los tres enfoques se resumen en la figura. 15.48.Creamos un control "reloj" en la figura. 15.49. Se trata de un control de usuario compuesto por una etiqueta y un temporizador cada vez que el contador de tiempo provoca un evento (una vez por segundo en este ejemplo), la etiqueta se actualiza para reflejar la hora actual.Timers (espacio de nombres System.Windows.Forms) son componentes invisibles que residen en un formulario, generar eventos Tick en un intervalo establecido. Este intervalo se establece por intervalo del Timer

Page 52: Tra Ducci On

Custom-control techniques and painteventargs properties Description

Técnicas Custom-ControlHeredar de un control de formularios Windows Forms

Crear un control de usuario

Heredar de la clase Control

PaintEventArgs PropertiesGraphicsClipRectangle

Para ello, puede agregar funcionalidad a un control preexistente. Si reemplaza método OnPaint, llame al método OnPaint de la clase base. Tenga en cuenta que sólo se puede añadir a la apariencia del control original, no rediseñarlo.Puede crear un control de usuario compuesto por múltiples controles preexistentes (por ejemplo, para combinar su funcionalidad). Tenga en cuenta que no se puede reemplazar los métodos OnPaint de controles personalizados. En su lugar, debe colocar código de dibujo en un manejador de sucesos de dolor. Una vez más, tenga en cuenta que sólo se pueden agregar a la apariencia original de los controles, no rediseñarlo

Definir un control nuevo. Reemplazar el método OnPaint, a continuación, llamar al método de la clase base OnPaint e incluyen métodos para dibujar el control. Con este método se puede personalizar el aspecto y la funcionalidad de control.El objeto gráfico controles. Se utiliza para dibujar el control de la dieta.Especifica el rectángulo que indica el límite del control.

. figura 15.48 | diseño de control personalizado. (Parte 2 de 2).

propiedad, que define el número de milisegundos (milésimas de segundo) entre los eventos. De forma predeterminada, los temporizadores están inhabilitados y no generan eventos.

Page 53: Tra Ducci On

. figura 15.49 | Reloj de Control de Usuario definido. (Part2of2.)

Esta aplicación contiene un control de usuario (ClockUserControl) y un formulario que muestra el control de usuario. Comenzamos creando una aplicación de Windows. A continuación, creamos una clase UserControl al proyecto seleccionando Proyecto> Agregar control de usuario.... Aparecerá un cuadro de diálogo desde el que podemos seleccionar el tipo de control para agregar controles de usuario que ya están seleccionados. A continuación, un nombre al archivo (y la clase) ClockUserControl. Nuestro ClockUserControl vacío se muestra como un rectángulo gris.Usted puede tratar este control como un formulario de Windows, lo que significa que usted puede agregar controles mediante las propiedades del conjunto de herramientas y la ventana Propiedades. Sin embargo, en lugar de crear una aplicación, simplemente está creando un nuevo control compuesto por otros controles. Agregue una etiqueta (DISPLAYLABEL) y un temporizador (clockTimer) a UserControl. Establezca el intervalo de temporizador de 1.000 milisegundos y establecer el texto de DISPLAYLABEL con cada evento Tick (líneas 18-22). Para generar eventos, clockTimer debe estar habilitado estableciendo la propiedad Enabled en true en la ventana Propiedades.Estructura DateTime (namespace System) contiene propiedad ahora, que es el tiempo actual. Método ToLongTimeString convierte ahora en una cadena que contiene la hora, minutos y segundos (junto con AM o PM). Usamos esto para establecer el tiempo en di spl ayLabel en la línea 21.Una vez creado, el control del reloj aparece como un elemento en la caja de herramientas. Puede que tenga que cambiar a la forma de la aplicación antes de que el elemento aparezca en la caja de herramientas. Para utilizar el control, basta con arrastrarlo al formulario y ejecutar la aplicación de Windows. Nos dimos el objeto ClockUserControl un fondo blanco para hacer que se destaque en el Formulario. La figura 15.49 muestra la salida del ClockForm, que contiene nuestra ClockUserControl. No hay controladores de eventos en ClockForm, por lo que sólo muestran el código de ClockUserControl.Compartiendo controles personalizados con otros desarrolladoresVisual Studio le permite compartir controles personalizados con otros desarrolladores. Para crear un control de usuario que se puede exportar a otras soluciones, haga lo siguiente:1. Crear un nuevo proyecto de biblioteca de clases.2. Eliminar Classl. cs, inicialmente provista con la aplicación.3. Haga clic derecho en el proyecto en el Explorador de soluciones y seleccione Agregar> Control de usuario .... En el cuadro de diálogo que aparece, el nombre del archivo de control de usuario y haga clic en Agregar.4. Dentro del proyecto, agregar controles y la funcionalidad al control de usuario (Fig. 15.50).5. Genere el proyecto. Visual Studio crea un archivo. Dll para el control de usuario en el directorio de salida (bin / Release). El archivo no es ejecutable; bibliotecas de clases se utilizan para definir las clases que se reutilizan en otras aplicaciones ejecutables.

. figura 15.50 | diseño de control personalizado.

6. Crear una nueva aplicación de Windows.7. En la nueva aplicación de Windows, haga clic en la caja de herramientas y seleccione Elegir elementos.... En el cuadro de diálogo Elegir elementos Caja de herramientas que aparece, haga clic en Examinar.... Busque el archivo. Dll de la biblioteca de clase creada en los pasos 1-5. El artículo aparecerá en el cuadro de diálogo Elegir elementos Caja de herramientas (Fig. 15.51). Si no lo está, consulte este artículo. Haga clic en Aceptar para añadir el artículo a la caja de herramientas. Este control puede ahora ser añadido a la Forma como si se tratara de cualquier otro control (fig. 15.52).

Page 54: Tra Ducci On

. figura 15.51 | Control personalizado añadido a la caja de herramientas.

. figura 15.52 Control personalizado agrega a un formulario.

15.15 RESUMEN

Muchas de las aplicaciones comerciales de hoy en día proporcionan interfaces gráficas de usuario que son fáciles de usar y manipular. Debido a esta demanda de interfaces gráficas de usuario fácil de usar, la capacidad de diseñar GUIs sofisticadas es una habilidad de programación esencial. IDE de Visual Studio hace que el desarrollo GUI fácil y rápido. En los capítulos 14 y 15, se presentaron las técnicas de desarrollo GUI básico de Windows Forms. En el capítulo 15, demostramos cómo crear menús, que proporcionan a los usuarios un acceso fácil a la funcionalidad de una aplicación. Aprendió el DateTimePicker y controles MonthCalendar, que permite a los usuarios a la fecha de entrada y los valores de tiempo. Hemos demostrado LinkLabels, que se utilizan para enlazar el usuario a una aplicación o una página web. Utilizó varios controles que proporcionan listas de datos de los cuadros de lista, el usuario CheckedListBoxes y listviews. Se utilizó el control ComboBox para crear listas desplegables y el control TreeView para mostrar datos en forma jerárquica. A continuación, presentamos complejos interfaces gráficas de usuario que utilizan ventanas con fichas y múltiples interfaces de documentos. El capítulo concluye con las manifestaciones de la herencia visual y la creación de controles personalizados. El siguiente capítulo explora GUI utilizando Windows Presentation Foundation (WPF).

resumen

Sección 15.1 IntroducciónLos menús se presentan los usuarios con varios comandos organizados lógicamente (u opciones).Visual Studio permite diseñar controles personalizados y agregue los controles al cuadro de herramientas.

Menús Sección 15.2Los menús proporcionan grupos de comandos relacionados para aplicaciones de Windows.Menús organizan comandos sin "saturan" la GUI.Un amplio menú enumera varios comandos (llamados elementos de menú), además de submenús (menús dentro de un menú).Un menú que contiene un elemento de menú se llama ese menú principal del menú. Un elemento de menú que contiene un submenú se considera que es el padre de ese submenú.Todos los elementos del menú pueden tener Alt atajos de teclado (también llamados accesos directos o combinaciones de teclas de acceso), los que se accede pulsando la tecla Alt y la letra subrayada.

Page 55: Tra Ducci On

Menús que no están en el nivel superior puede tener teclas de acceso directo también (combinaciones de Ctrl, Shift, Alt, F1, F2, teclas de letras, etc.).Algunos elementos de menú muestran marcas de verificación, lo que indica que las múltiples opciones en el menú se pueden seleccionar a la vez.El control MenuStri p se utiliza para crear menús en una interfaz gráfica de usuario.Menús de nivel superior y sus elementos se representan utilizando el tipo de ToolStripMenuItem.Para crear un acceso directo de acceso, escriba un signo (&) delante del carácter que subrayar.Para añadir otras teclas de acceso directo, establezca la propiedad ShortcutKeys del ToolStripMenuItem.Puede ocultar las teclas de método abreviado mediante el establecimiento de ShowShortcutKeys propiedad en false. Puede modificar la visualización de las teclas de control en el elemento de menú mediante la modificación de la propiedad ShortcutKeyDi spIayStri ng.Propiedad Checked de un elemento de menú se utiliza para mostrar una selección a la izquierda del elemento de menú.

Sección 15.3 MonthCaldario controlEl control MonthCalendar muestra un calendario mensual.• El usuario puede seleccionar una fecha en el mes que se muestra actualmente o utilice las flechas para desplazarse hasta un mes más.• Evento DateChanged de un MonthCalendar se produce cuando se selecciona una nueva fecha.Sección 15.4 control DateTimePicker• El control DateTimePicker se puede utilizar para recuperar la fecha y / o información de tiempo por parte del usuario.• Formato de la Propiedad de la clase DateTimePicker especifica opciones de selección del usuario mediante la enumeración DateTimePickerFormat.• Evento ValueChanged del DateTimePicker se produce cuando se cambia el valor seleccionado (ya sea una fecha o una hora).

Sección 15.5 LinkLabel control• El control LinkLabel muestra vínculos a otros recursos, como archivos o páginas web.• A LinkLabel aparece como texto subrayado (de color azul por defecto). Cuando se mueve el ratón sobre el enlace, el puntero cambia a una mano, lo que es similar a un hipervínculo en una página web.• El enlace puede cambiar de color para indicar si el enlace es nuevo, visitó previamente o activa.• Cuando se hace clic, el LinkLabel genera un evento LinkClicked.

Sección 15.6 ListBox control• El control ListBox permite al usuario ver y seleccionar elementos en una lista.• ListBox propiedad SelectionMode determina el número de elementos que se pueden seleccionar. Esta propiedad cuenta con los valores posibles Ninguno, Uno, Multi Simple y Multi extendido (de la enumeración SelectionMode).• El evento SelectedlndexChanged de la clase ListBox se produce cuando el usuario selecciona un nuevo elemento.• Los elementos de propiedad devuelve todos los elementos de la lista como una colección.• Propiedad Selectedltem devuelve el elemento seleccionado en ese momento.• Utilice el método Add para agregar un elemento a la colección ListBox'sítems.• Puede agregar elementos a ListBoxes y CheckedListBoxes visual mediante el uso de la propiedad Items en la ventana Propiedades.

Sección 15.7 CheckedListBox• El control CheckedListBox extiende un ListBox mediante la inclusión de una casilla de verificación junto a cada elemento.• Los artículos se pueden agregar a través de métodos Añadir y AddRange o mediante el Editor de la colección de cadenas.• CheckedListBoxes implican que varios elementos se pueden seleccionar.• ItemCheck Evento de la clase CheckedListBox ocurre siempre que los controles de un usuario activa o desactiva un elemento CheckedListBox.

Sección 15.8 control ComboBox• El control ComboBox combina las características de texto con una lista desplegable.• Propiedad MaxDropDownltems especifica el número máximo de elementos que puede mostrar a la vez.• Al igual que con el control ListBox, puede agregar objetos a elementos de la colección mediante programación, utilizando métodos Añadir y AddRange o visual, con el editor de la colección de cadenas.• Propiedad DropDownStyle determina el tipo de ComboBox y se representa como un valor de la enumeración ComboBoxStyle, que contiene valores simples, desplegable y DropDownList.• No puede haber a lo sumo un elemento seleccionado en un ComboBox (si no, entonces Selectedlndex es-l).• Cuando cambia el elemento seleccionado en un ComboBox, un evento SelectedlndexChanged ocurre.

Page 56: Tra Ducci On

Sección 15.9 Control TreeView• El control TreeVi ew muestra los nodos jerárquicamente en un árbol.• Tradicionalmente, los nodos son objetos que contienen valores y pueden referirse a otros nodos.• Un nodo primario contiene nodos secundarios, y los nodos secundarios pueden ser los padres a otros nodos.• Dos nodos secundarios que tienen el mismo nodo padre se consideran nodos relacionados.• Un árbol es un conjunto de nodos, normalmente organizados en forma jerárquica. El primer nodo padre de un árbol es el nodo raíz.• Los controles TreeView son útiles para mostrar información jerárquica.• En un TreeView, un nodo primario se puede expandir o contraer haciendo clic en el cuadro de más o menos el cuadro a su izquierda. Los nodos sin hijos no tienen estas cajas.• Los nodos se muestran en un TreeView son instancias de la clase TreeNode.• Cada TreeNode tiene una colección de nodos (tipo TreeNodeCollection), que contiene una lista de otros TreeNodes-sus hijos.• Para agregar nodos a un control TreeView visualmente, haga clic en los puntos suspensivos junto a los nodos de propiedad en la ventana Propiedades. Se abrirá el Editor TreeNode, que muestra un árbol vacío que representa la TreeVi ew.• Para agregar nodos mediante programación, debe crear un objeto TreeNode raíz y pasar una cadena a mostrar. A continuación, llamar al método Add para agregar esta nueva TreeNode a la colección de nodos de TreeView.

Sección 15.10 ListView• El control ListView es similar a un control ListBox en que ambas listas de visualización de la cual el usuario puede seleccionar uno o más elementos. ListView es más flexible y puede mostrar los elementos en diferentes formatos.• Propiedad Multi Select (un bool) determina si los artículos múltiples se pueden seleccionar.• Para visualizar las imágenes, se requiere un componente ImageList.• SmallImageList propiedad de la clase ListView establece el ImageList para los pequeños iconos.• LargelmageList propiedad de la clase ListView establece el ImageList de iconos grandes.• Los elementos de un ListView son cada tipo ListViewItem.

Sección 15.11 de control TabControl• El control TabControl crea ventanas con fichas, como las que hemos visto en Visual Studio. Esto le permite especificar más información en el mismo espacio en un formulario.• TabControls contienen objetos TabPage, que son similares a los paneles y GroupBoxes en esa ficha-páginas también pueden contener controles.• Sólo un TabPage se muestra a la vez.• Puede añadir TabControls visualmente arrastrando y soltándolos en un formulario en modo de diseño.• Para agregar TabPages en el modo de diseño, haga clic en el rol TABCONT y seleccione Agregar Tab o haga clic en la propiedad Tab-Páginas en la ventana Propiedades y agregar fichas en el cuadro de diálogo que aparece.• Cada TabPage provoca un evento Click cuando se hace clic en su ficha.

Sección 15.12 de interfaz de múltiples documentos (MDI) de Windows• Los programas de interfaz de múltiples documentos (MDI) permiten a los usuarios ver y editar varios documentos a la vez.• La ventana de la aplicación de un programa de MDI se llama la ventana principal, y cada ventana en el interior se refiere a la aplicación de una ventana hija.• Ventanas secundarias no pueden ser los mismos padres y no puede ser trasladado fuera de su padre.• Para crear un formulario MDI, cree un nuevo formulario y establezca su propiedad IsMdiContainer en true.• Para añadir un formulario hijo al padre, cree un nuevo objeto Form hijo, establezca su propiedad MDI al formulario padre y llame método Show del formulario hijo.• Las ventanas secundarias pueden minimizarse, maximizarse y cerrarse de forma independiente el uno del otro y de la ventana padre.• MdiWindowListltem propiedad de la clase MenuStrip especifica el menú, en su caso, muestra una lista de ventanas secundarias abiertas.• Los contenedores MDI le permiten organizar la colocación de ventanas secundarias. Las ventanas secundarias de una aplicación MDI se pueden arreglar llamando al método LayoutMdi del formulario padre.

Sección 15.13 herencia visual• Herencia visual le permite crear un nuevo formulario mediante la herencia de un formulario existente. La clase Form derivada contiene la funcionalidad de su clase base.• herencia visual también se puede aplicar con otros controles también.• herencia visual permite lograr la coherencia visual entre aplicaciones mediante la reutilización de código.

Page 57: Tra Ducci On

Sección 15.14 controles definidos por el usuario• El. NET Framework permite crear controles personalizados.• Los controles personalizados pueden aparecer en la caja de herramientas del usuario y se puede agregar a formularios, paneles o grupos boxes en la misma forma en que se agregan los botones, etiquetas y otros controles predefinidos.• La forma más sencilla de crear un control personalizado debe derivar una clase de un control existente, como una etiqueta. Esto es útil si desea agregar funcionalidad a un control existente, en lugar de sustituirlo por uno que proporciona la funcionalidad deseada.• Para crear un nuevo control integrado de los controles existentes, utilice la clase UserControl.• Controla añadido a un control personalizado se denominan controles constituyentes.• Un programador puede crear un nuevo control que hereda de la clase Control. Esta clase no define ningún comportamiento específico; esta tarea se deja a usted.• Los temporizadores son componentes invisibles que se encuentran en un formulario, generar eventos Tick en un intervalo establecido. Este intervalo se establece mediante la propiedad Intervalo del temporizador, el cual define el número de milisegundos (milésimas de segundo) entre los eventos.

TerminologíaPropiedad de activación de la clase ListView

ActiveMdi propiedad Child de clase FormAgregar método de ObjectCollection claseAddDays método DateTime structAddYears método DateTime structArrangelcons valor de enumeración MdiLayoutCascade valor de la enumeración ventana cascada MdiLayoutPropiedad CheckBoxes de la clase ListViewPropiedad Checked de la clase ToolStripMenuItemclase CheckedListBoxCheckOnCl propiedad click de ventana secundaria nodo hijo CheckedListBox claseMétodo Clear de gráficos de claseMétodo Clear de ObjectCollection clase

Haga clic en evento de clase de resistencia ClipRectangle ToolStripMenuItem de clasePaintEventArgs clase ComboBoxComboBoxStyle enumeración constituyente controla controles personalizados Valor de enumeraciónDateTimePickerFormat propiedad CustomFormat de clase Date propiedad DateTimePicker de clase DateTimePicker DateChanged caso de la clase DateTime MonthCalendar struct DateTimePicker clase DateTimePickerFormat enumeración DayOfWeek enumeración

Propiedad de la clase DateTime DayOfWeekclase DirectorylnfoMétodo DrawEllipse de gráficos de claseMétodo DrawPie de grafías claseMétodo DrawRectangle de Gráficos clase de lista desplegableValor desplegable de ComboBoxStyle enumeraciónValor de DropDownList de empadronamientoComboBoxStyle propiedad DropDownStyle del método Exit de la clase ComboBox Clase Filelnfo AplicaciónFillEllipse método de la clase método FillPie Gráficos de clase Graphics método FillRectangle de clase Graphics Formato característica de clase DateTi propiedad FullName mePicker de clase de resistencia Directorylnfo FullName de clase Filelnfo GetDirectories methodofclassDirectorylnfo método GetFiles de clase Di rectorylnfo método de clase de

Opción del menúMenuStrip claseMinDate propiedad de clase DateTimePickerclase MonthCalendarMulti valor extendido de empadronamientoSelectionMode interfaz de múltiples documentos (MDI) Propiedad MultiSelect de clase de valor simple ListViewMulti de empadronamientoSelectionMode propiedad Name de la clase Directorylnfo propiedad del nombre de la clase nodo Filelnfocolección de nodosValor Ninguno de enumeración SelectionMode ahora propiedad de structDateTime ObjectCollection clase Un valor de enumeración SelectionMode método OnPaint de la clase de control PaintEventArgs nodo padre de clasePropiedad Parent de la clase padre ventana Ruta de la clase

Page 58: Tra Ducci On

propiedad ListBox Gráficos de clase PaintEventArgs hotkey GetSelectedPropiedad Imagelndex de la clase ListViewItem clase de propiedad ImageList ImágenesImágenes propiedad de la clase de propiedad Interval ImageList de clase de propiedad Container TimerIsMdi de clase Form evento ItemCheck de clase de propiedad CheckedListBox ítems de la categoría de propiedad de objetos ComboBox de atajo de teclado de clase ListBoxPropiedad LargelmageList de la clase ListView LayoutMdi método de la clase Form LinkClicked caso de la clase LinkLabel LinkLabel clase ListBox clase ListView clase ListViewItem clase de valor a largo de la enumeraciónDateTimePickerFormat propiedad MaxDate de clase de resistencia MaxDropDownItems DateTimePicker de clase de resistencia MdiChildren ComboBox de la clase Form MdiLayout propiedad MdiParent enumeración de la clase formulario MDI propiedad WindowListltem de menú MenuStrip menú contextual de acceso de clase

Process clase DirectorylnfoMétodo RemoveAt del nodo raíz ObjectCollection clasePropiedad Selectedlndex de la clase ComboBox Selectedlndex propiedad de la clase ListBox evento SelectedlndexChanged de la clase ComboBox de la clase de evento SelectedlndexChanged propiedad ListBox Selectedlndices de la clase ListBox propiedad Sel ectedltem de clase de resistencia de la clase ComboBox Selectedltem propiedad ListBox Selectedltems de la clase ListBox SelectionMode propiedad SelectionMode enumeración de clase barra separadora ListBox valor de corta de empadronamientoDateTimePickerFormat propiedad ShortcutKeyDisplayString de claseToolStripMenuItem propiedad ShortcutKeys de claseToolStripMenuItem propiedad ShowShortcutKeys de claseToo Stri nodo relacionado pMenuItemValor simple de la interfaz de documento único de enumeración ComboBoxStyle (SDI) Propiedad Pequeña ImageList de la clase ListView

Método de la clase Process IniciosubmenúSystem.Diagnostiesespacio de nombres System.Diagnosticsclase TabControlpropiedad TabPagesclase TabPagePropiedad TabPages de clase TabControlpropiedad TextPropiedad Text de la clase TabPageMarque caso de clase de ventana baldosas TimerTileHorizontal valor de enumeraciónMdiLayout TileVertical valor de enumeración MdiLayout valor de tiempo de empadronamientoDateTimePickerFormat

Propiedad TimeOfDay de DateTintePicker claseclase TimerMétodo ToLongDateString de DateTime structMétodo ToLongTimeString de DateTime structclase ToolStripMenuItemárbolclase TreeNodetipo TreeNodeCollectionclase TreeViewclase TreeViewEventArgsclase UserControlPropiedad Value de la clase DateTimePickerCaso ValueChanged de clase DateTimePickerVer inmuebles de la clase ListViewherencia visual

Auto-Ejercicios de repaso15.1 Indique si cada una de las siguientes opciones es verdadera o falsa. Si es falso, explique por qué.a) Los menús proporcionan grupos de clases relacionadas.b) Los elementos de menú se pueden visualizar ComboBoxes, marcas de verificación y shorteuts acceso.c) El control ListBox sólo permite la selección individual (como un RadioButton).d) Un control ComboBox tiene típicamente una lista desplegable.e) Eliminación de un nodo primario en un TreeView borra control de sus nodos secundarios.f) El usuario puede seleccionar sólo un elemento en un control de STVI ew Li.g) A TabPage puede actuar como contenedor de Obuttons Radi.h) Una ventana secundaria MDI puede tener hijos MDI.i) las ventanas secundarias MDI se puede mover fuera de los límites de su ventana padre. j) Hay dos formas básicas para crear un control personalizado.15.2 Llena los espacios en blanco en cada una de las siguientes declaraciones:a) Método de proceso de clase puede abrir archivos y páginas Web, de forma similar a la de ejecución ...comandos de Windows.b) Si el número de elementos aparecen en un ComboBox que cabe, a (n) aparece.c) El nodo de nivel superior en una TreeVi ew es el nodo.d) Un (a) y un (a) puede mostrar iconos contenidos en un control ImageLi st.e) La propiedad permite a un menú para mostrar una lista de ventanas secundarias activas.f) Class le permite combinar varios controles en un único control personalizado.g) La ahorra espacio TabPages capas una encima de otra.h) La opción de diseño de la ventana hace que todas las ventanas MDI del mismo tamaño y capas

Page 59: Tra Ducci On

ellos por lo que cada barra de título es visible (si es posible).i) se utilizan normalmente para mostrar hipervínculos a otros recursos, archivos o páginas web.Respuestas a las auto-Ejercicios de repaso15.1 a) Falso. Los menús proporcionan grupos de comandos relacionados. b) Verdadero. c) Falso. Puede tener la selección simple o múltiple. d) Verdadero. e) Verdadero. f) Falso. El usuario puede seleccionar uno o más artículos. g) Verdadero. h) Falso. Sólo una ventana padre MDI tiene hijos MDI. Una ventana padre MDI no puede ser un formulario MDI secundario. i) False. Ventanas secundarias MDI no se pueden mover fuera de su ventana padre. j) Falso.Existen tres maneras: 1) se derivan de un control existente, 2) utilizar un control de usuario o 3) se derivan de control y crear un control desde el principio.15.2 a) Arranque. b) desplazamiento. c) de la raíz. d) ListView, TreeView. e) MdiWindowListltem. f) UserControl. g) TabControl. h) Cascade. i) LinkLabels.Ejercicios15.3 Escriba un programa que muestra los nombres de los 15 estados en un ComboBox. Cuando un elemento está seleccionada en el cuadro combinado, retírelo.15.4 Modificar la solución al ejercicio anterior para agregar un control ListBox. Cuando el usuario selecciona un elemento en el cuadro combinado, quitar el elemento de la ComboBox y agregarlo a la Li stBox. Su programa debe comprobar para asegurarse de que el ComboBox contiene al menos un elemento. Si no es así, muestra un mensaje, utilizando un cuadro de mensaje, la ejecución del programa se terminará cuando el usuario cierra el cuadro de mensaje.15.5 Escriba un programa que permite al usuario introducir cadenas en un cuadro de texto. Cada entrada de cadena se agrega a un ListBox. A medida que se añade cada cadena en el ListBox, asegúrese de que las cadenas están en el orden establecido. [Nota: Use la propiedad Ordenado.15.6 Crear un explorador de archivos (similar al Explorador de Windows) sobre la base de los programas de las figuras. 15.14, 15.28 y 15.31. El explorador de archivos debe tener un TreeView, que permite al usuario navegar direc-torios. También debe haber una Li STVI ew, que muestra el contenido (todos los subdirectorios y archivos) del directorio va a examinar. Haga doble clic en un archivo en el ListView debe abrirlo y haga doble click-ción de un directorio, ya sea en el ListView o TreeView debe ver él. Si un archivo o directorio no se puede acceder debido a sus configuraciones de permisos, notificar al usuario.15.7 Crear un editor de texto MDI. Cada ventana secundaria debe contener un RichTextBox multilínea. El MDI primario debe tener un formato de menú con submenús para controlar el tamaño, tipo de letra y el color del texto en la ventana secundaria activa. Cada submenú debe tener al menos tres opciones. Además, los padres deben tener un menú archivo, con los elementos de menú New (Crear un nuevo hijo), Cióse (cióse el niño activo) y Exit (Salir de la aplicación). El padre debe tener un menú Ventana para mostrar una lista de las ventanas secundarias abiertas y sus opciones de diseño.15.8 Crear un control de usuario llamado LoginPasswordUserControl que contiene una etiqueta (loginLa-bel) que muestra string "Login:", un cuadro de texto (loginTextBox), donde el usuario introduce un nombre de usuario, una etiqueta (passwordLabel) que muestra la cadena "Password:" y, por último, un cuadro de texto (cuadro de texto contraseña) cuando un usuario introduce una contraseña (no se olvide de establecer PasswordChar propiedad como "*" en la ventana Propiedades del cuadro de texto). LoginPasswordUserControl debe proporcionar propiedades de sólo lectura pública de usuario y contraseña que permiten una aplicación para recuperar la entrada del usuario a partir del 1 ogi nTextBox y PasswordTextBox. El control de usuario debe exportaron a una aplicación que muestra los valores en ¬ puesto por el usuario en Logi nPasswordUserControl.15.9 Un restaurante quiere una aplicación que calcula Bili de una mesa. La aplicación debe mostrar todos los elementos de menú de la figura. 15.53 en cuatro ComboBoxes. Cada ComboBox debe contener una categoría de alimentos que ofrece el restaurante (bebidas, aperitivo, plato principal y postre). El usuario puede elegir entre uno de estos ComboBoxes añadir un elemento a Bili de una mesa. Al seleccionar cada elemento en los cuadros combinados, añadir el precio de ese elemento a la fototerapia. El usuario puede hacer clic en el botón Borrar para restablecer la Subtotal:, Impuesto, y Total: campos a $ 0.00.15,10 crear una aplicación que contiene tres TabPages. En la primera TabPage, coloque una CheckedLi st ¬ Caja con seis puntos. En el segundo TabPage, colocar seis cuadros de texto. En el último TabPage, colocar seis LinkLabels. Selecciones del usuario en la primera TabPage deben especificar cuál de los seis LinkLabels se mostrará. Para ocultar o mostrar un valor Li nkLabel 's, el uso de su propiedad si e bl Vi. Utilice el segundo TabPage para modificar la página web que está abierta por los LinkLabels. [Nota: Para cambiar los LinkLabels Visible

Page 60: Tra Ducci On

propiedades, tendrás que cambiar el TabPage presentada en la última. Para ello, utilice la propiedad selectedTab del Tab-Página.]15,11 Crear una aplicación MDI con ventanas secundarias que cada uno tiene un panel de dibujo. Agregar menús a la aplicación MDI que permite al usuario modificar el tamaño y el color del pincel. Cuando se ejecuta esta aplicación, tenga en cuenta que si una de las ventanas se superpone otro, se borrará el Panel.