Una Aplicación MDI típica es un editor de Texto capaz de tener varios documentos abiertos simultáneamente, por lo que se le denomina Interfaz de Múltiples Documentos
En un Proyecto Nuevo llamado EditorMDI, enseguida vamos a crear el formulario Padre con el formulario que aparece por default
Revisamos la propiedad de ese formulario IsMdiContainer que esté en True el cual nos permitirá crear un Formulario MDI, es decir que puede contener un formulario dentro de él.
Modificamos Name como FormMDI
En el Formulario Padre añadimos una Barra de menús(MenuStrip) a la cual nombraremos como BarraDeMenus, una Barra de Herramientas (ToolStrip) a la que llamaremos BarraDeHerramientas y por último una Barra de estado (StatusStrip) denominada BarraDeEstado
En la Barra de Menus agregaremos los Manús Típicos del Formulario Padre:
Cada uno con los Submenús correspondientes:
La Barra de Herramientas contendrá los Botones Nuevo, Abrir, Separador y Ayuda, quedando de la siguiente manera:
Para combinar esta barra de menús con las que aporten los formularios hijo, asigne a la propiedad MergeIndex de los menús los valores 0, 2, 3, etc. correspondientes a la posición que van a ocupar.
Haga lo mismo con los elementos del Menú Archivo, ya que la barra de menús del formulario Hijo aportará su propio menú Archivo; Por esa razón asigne el valor 0 a la propiedad MergeIndex del botón Nuevo y 1 a la del botón Abrir
En la Barra de Estado añadimos una etiqueta ToolStripStatusLabel a la cual nombraremos como etbarestPpal y modificamos la propiedad Text como Listo
El Formulario Padre quedará de la siguiente manera:
Añadimos un formulario Nuevo al cual nombraremos desde su creación como Form2 y el Name será FormDocumento
En este formulario añadimos una Barra de Menús típica de un procesador de textos, una Barra de Herramientas y un RichTextBox para escribir al cual nombraremos como rtbText
La barra de menús contendra lo siguiente:
La Barra de Herramientas estará conformada por los siguientes elementos:
Estos botones se deberán insertar a la Barra de Herramientas del Formulario Padre, esta combinación se hará en función de las Propiedades MergeIndex y MergeAction de los menús, de las Barras y de los elementos de los Menús del mismo nombre.
Según lo anterior asignamos a la Propiedad MergeIndex de Archivo y de Edición los valores 0 y 1 respectivamente y a su Propiedad MergeAction los valores MatchOnly e Insert respectivamente
MatcOnly permitirá que los Menús Archivo de los Formularios Padre e Hijo se fusionen de acuerdo a los valores de MergeIndex y MergeAction de sus elementos, de acuerdo a todo esto asignamos en la Propiedad MergeIndex de los elementos del Menú Archivo los valores 2, 3, 4 y 5 (incluido el separador) y a su propiedad MergeAction Insert a todos
Asigne a la Propiedad Visible tanto de la Barra de Menús como la Barra de Herramientas del Formulario Hijo el valor False
El resultado será el siguiente al ejecutar el programa y fusionarse los dos menús en uno solo:
Para fusionar las Barras de Herramientas es necesario seguir el mismo proceso editando las propiedades MergeIndex y MergeAction, asignado un valor a cada elemento de su índice correspondiente a la posición que van a ocupar al fusionarse ambas Barras en una sola. Al final al fusionarse ambas Barras quedarán de la siguiente manera:
Para realizar la fusión de las Barras de Herramientas y de la Barra de estado es necesario introducir un código para fusionar y deshacer la fusión según sea necesario para ello utilizamos el Método Merge para fusionarlas y RevertMerge para deshacer la fusión nos apoyaremos con el evento MdiChildActivate, este se activa cuando se activa un formulario Hijo, todo esto queda de la siguiente manera:
Cuando se inicie la aplicación y se cargue el formulario MDI, vamos a abrir un documento vacío, para ello utilizaremos la ruta Archivo -> Nuevo con el siguiente código:
Para Abrir un documento desde el menú Archivo tiene que visualizarse la caja de diálogo estandar de Windows, en ella el usuario podrá seleccionar un archivo .txt o .rtf El código es el siguiente:
Guardar un documento, al pulsar esta opción el documento creado se deberá guardar con el cuadro de diálogo de Windows pudiendo cambiar el nombre también con el siguiente código:
Si el documento no es nuevo se guarda con el mismo nombre
Guardar Como, permitirá cambiar el nombre del archivo que se está editando, es parecido a la opción de Guardar salvo que este control siempre preguntará por el nombre donde se guardará el documento he aquí su código:
Imprimir un Documento, para ejecutar esta instrucción es necesario agregar el el Formulario Hijo desde la Caja de Herramientas un Control PrintDialog al cual se llamará PrintDialog1 y otro PrinDocument el que se llamará PrintDocument1
Asigna a la propiedad Document de PrintDialog1 el objeto PrintDocument1 que vamos a utilizar para imprimir. Verificar que también la propiedad UseEXDialog tenga el valor de True.
Defina las variables línea de tipo String y totalLineasImpresas de tipo Integer como atributos privados de la clase FormDocumento (esto se hace al principio del código del Formulario Hijo)
El código para imprimir es el siguiente:
El Método Print produce el evento PrintPage que tendremos que controlar para programar la impresión. Por lo tanto, asigne al evento PrintPage de PrintDocument1 el controlador ImprimirDoc_PrintPage
Este controlador calcula el número de líneas que se pueden imprimir en cada página y las imprime. Cada vez que se llena una página, salta a una nueva sólo si quedan líneas por imprimir
Cortar, Copiar y Pegar
Cuando el usuario edite un documento y seleccione alguna parte del texto del control rtbText del formulario activo podrá cortar, copiar y pegar el texto seleccionado en otra parte del documento o en otro documento, veamos el código:
Ediciones reversibles
Para que un texto pueda realizar las acciones de Deshacer y Rehacer debe recordar cada operación de edición que ha tenido lugar, el órden en que ha sucedido y deshacerlas. Para este trabajo RichTextBox proporciona las propiedades CanUndo y CanRedo y los métodos Undo y Redo
Barra de Harramientas y de Estado
Para que el ususario pueda mostrar y ocultar la Barra de Estado y la Barra de Herramientas en el menú Ver utilizaremos la propiedad Checked de ambas órdenes en True, quedando de la siguiente manera:
Menú Ventana
En este menú el usuario puede ver el nombre de los Formularios Hijo abiertos hasta ese momento los cuales se pueden ver de diferentes maneras como Cascada, Mozaico Horizontal, Mozaico Vertical y Organizar íconos para organizar los Formularios Hijo
Para organizar a los Formularios ordenadamente sobre el Formulario Padre utilizamos el método LayoutMdi
Texto
La Barra de Herramientas colocada en el Formulario Hijo tiene una serie de botones relacionados con los formatos de las fuentes y con la alineación de los párrafos.
Cuando es activada alguna de estas funciones los botones deben de mostrarse pulsados. Para realizar esto utilizaremos el evento SelectionChange
La propiedad SelectionForm del RichTextBox obtiene o establece la fuente del texto que se aplicará a la selección, las propiedades Bold, Italic, Strikethru y Underline devuelven el estilo de fuente seleccionado
El Documento ha Cambiado
Cuando el usuario salga de la aplicación la misma aplicación necesita veificar si los documentos han cambiado, para ello deberá revisar si la propiedad Modified ha cambiado
Operaciones de arrastrar y Soltar
Para que un control de RichTextBox permita acciones de arrastrar y soltar texto imágenes y datos hay que asignar a su propiedad EnableAutoDragDrop el valor de True
virj