Professional Documents
Culture Documents
Un programa como el desarrollado en el capítulo 3 nos deja ver una ventana, pero si el
lector le pone cuidado observará que no es mucho lo que puede hacer con ese
elemento.
using System.Windows.Forms;
using System.Threading;
#include <windows.h>
int WINAPI WinMain(HINSTANCE hInstancia,
HINSTANCE d2, LPSTR d3, int d4)
{
MSG mensaje;
HWND manejador;
www.pedrov.phpnet.us
CAPITULO 5 APLICACIONES CON INTERFAZ GRAFICA TIPO WINDOWS 141
El programa crea dos variables, una para controlar los mensajes y la otra para manejar
una ventana. Se crea una ventana, que incluye un botón de comando que la cubre en su
totalidad. Luego la ejecución ingresa en el ciclo while que se encarga de procesar los
mensajes, especialmente el mensaje identificado con la macro WM_LBUTTONUP, el
cual se produce cuando el usuario hace clic con el botón izquierdo del ratón sobre el
botón. Cuando ocurre esto último se destruye la ventana y se anula la recepción de
Figura 5.1: Programa con
mensajes. Un último detalle, el programa como tal no es orientado a objetos sino interfaz gráfica de usuario
estructurado, por que de hecho el sistema operativo ha sido desarrollado bajo este desarrollado en lenguaje C
con un bucle de mensaje
paradigma. simple.
Esta es la estructura interna que posee un programa que se ejecuta en el entorno gráfico
de Windows, y que .NET la encapsula en el conjunto de clases incluidas en el espacio
de nombres System.Windows.Forms. En este contexto, .NET puede considerarse
como una capa de software que se encarga de ocultar todos los detalles técnicos y
encapsularlos en clases que se encargan de manipular las funciones de la API y realizar
muchas tareas que son repetitivas de una aplicación a otra, en forma automática. Las
clases contenidas en este espacio de nombres le permiten al programador construir
interfaces gráficas de forma rápida y sencilla, incluyendo la gran mayoría de
componentes que forman parte de ellas, y que incluso se consideran ya unos estándares
de las aplicaciones gráficas. Adicional, el programador puede construir sus propios
componentes utilizando básicamente la herencia de clases.
La clase Application
La clase Application hace parte del espacio de nombres System.Windows.Forms. El
principal método que posee esta clase es Run, el cual se encarga de iniciar el bucle de
mensajes en la línea de ejecución que se encuentre actualmente.
El método Run está sobrecargado con tres versiones. Una de ellas se ejecuta sin
parámetros, la otra recibe un parámetro del tipo ApplicationContext, y una tercera
versión recibe un objeto del tipo Form, o lo que se conoce como formulario. La
mayoría de aplicaciones estándar de Windows se ejecutan bajo esta última versión del
método Run.
El formulario
El elemento principal y más representativo de una aplicación con interfaz gráfica es
aquel que se conoce con el nombre de ventana. Desde la visión del programador de C#,
el objeto que da origen a este elemento es el formulario.
La clase Form, que pertenece al espacio de nombres System.Windows.Forms, es
quien se encarga de definir todos los formularios que sean necesarios para la creación
de las ventanas que puede necesitar una aplicación con interfaz gráfica de usuario.
Generalmente, y en el contexto del entorno de desarrollo de .NET, a este tipo de
aplicaciones se le denomina programas Windows Forms.
pedrov.cs@hotmail.com
142 CAPITULO 5 PROGRAMACION CON C#
Form es una clase que encapsula todas las propiedades, métodos y eventos que se
necesitan para dar funcionalidad a una ventana. Pero esto no significa que el
programador tenga que limitarse a definir objetos con esta clase y a modificar sus
propiedades, por que también puede heredar de ella para crear clases que definan
formularios de ventanas totalmente personalizadas a sus intereses.
/* Archivo: Ejemplo51.cs */
using System.Windows.Forms;
www.pedrov.phpnet.us
CAPITULO 5 APLICACIONES CON INTERFAZ GRAFICA TIPO WINDOWS 143
> csc /t:winexe ArchivoFuente.cs
Si realiza las pruebas del caso observará que la ventana se muestra totalmente libre. Ya
no existe la consola que la acompaña. Incluso si se ejecuta mediante una llamada al
ejecutable, ejemplo51.exe, el lector observará que inmediatamente se devuelve el
control a la línea de comandos. Algo que no ocurría en la anterior compilación.
Y con esto, por ahora solo podemos decir, ¡bienvenido a las aplicaciones gráficas bajo
el entorno Windows!
El programa que viene a continuación crea dos ventanas y las muestra en pantalla. Una
de ellas se muestra a través de la propiedad Visible, y la otra lo hace automáticamente
al asignarse como parámetro del método Run.
/* Archivo: Ejemplo52.cs */
using System;
using System.Windows.Forms;
formVentana.Visible = true;
formVentana.Text = "formVentana";
formPrincipal.Text = "formPrincipal";
Application.Run(formPrincipal);
}
}
pedrov.cs@hotmail.com
144 CAPITULO 5 PROGRAMACION CON C#
/* Archivo: Ejemplo53.cs */
using System;
using System.Windows.Forms;
www.pedrov.phpnet.us
CAPITULO 5 APLICACIONES CON INTERFAZ GRAFICA TIPO WINDOWS 145
Compile el programa con la instrucción,
Propiedad Descripción
Text Permite escribir o leer una cadena de texto hacia o desde el control
Las propiedades de posición y dimensión de un control aceptan valores enteros que por
defecto representan cantidades de píxeles.
Ventana
Top
Left
Height
Width
Figura 5.2: Top y Left son las coordenadas de la esquina superior izquierda, y
Width y Height las dimensiones de ancho y alto de un control.
pedrov.cs@hotmail.com
146 CAPITULO 5 PROGRAMACION CON C#
Estas propiedades igual existen para un formulario, donde Left y Top establecen o
devuelven las coordenadas de la esquina superior izquierda con respecto a la pantalla.
El formulario expone la propiedad Controls, que es un objeto del tipo
CollectionControls, el cual expone el método Add que permite agregar un control a la
ventana. Su sintaxis es la siguiente:
Formulario.Controls.Add(Identificador);
/* Archivo: Ejemplo54.cs */
using System;
using System.Windows.Forms;
Sabemos que el primer parámetro del método establece quién ha sido el objeto que ha
generado el evento. En este caso se identifica mediante el título del botón, pero para
poder leer este titulo es necesario hacer una conversión de tipos, o cast, al objeto
emisor, convirtiéndolo al tipo Button.
/* Archivo: Ejemplo55.cs */
using System;
using System.Windows.Forms;
Application.Run(formVentana);
}
pedrov.cs@hotmail.com
148 CAPITULO 5 PROGRAMACION CON C#
www.pedrov.phpnet.us
CAPITULO 5 APLICACIONES CON INTERFAZ GRAFICA TIPO WINDOWS 149
/* Archivo: Ejemplo56.cs */
using System;
using System.Windows.Forms;
pedrov.cs@hotmail.com
150 CAPITULO 5 PROGRAMACION CON C#
// Constructor
public FormularioPrincipal()
{
InicializarComponente();
}
Los controles de la ventana se han definido en el ámbito de toda la clase, para de esta
hacerlos accesibles a todos los métodos que los requieran, en especial a los métodos
controladores de los eventos.
www.pedrov.phpnet.us
CAPITULO 5 APLICACIONES CON INTERFAZ GRAFICA TIPO WINDOWS 151
Se han implementado métodos diferentes para controlar los eventos de cada botón. La
razón, únicamente se quiere mostrar que existen muchas formas de controlar un
evento. En la práctica hubiera sido mejor utilizar la técnica del ejemplo 5.5, un método
para todos los eventos, pero la práctica es quien hace al maestro.
En definitiva el programa que permite realizar operaciones aritméticas queda como
sigue:
/* Archivo: Ejemplo57.cs */
using System;
using System.Windows.Forms;
pedrov.cs@hotmail.com
152 CAPITULO 5 PROGRAMACION CON C#
www.pedrov.phpnet.us
CAPITULO 5 APLICACIONES CON INTERFAZ GRAFICA TIPO WINDOWS 153
if (b != 0)
{
double c = a / b;
labelResultado.Text = c.ToString();
}
else
labelResultado.Text = "(Error...)";
}
}
Aunque aun hay programadores que creen que la programación es importante por el
número de líneas que tengamos que escribir manualmente, la verdad es que cuando se
trata de aplicaciones gráficas, la mayor parte del tiempo se pierde en programar la
configuración de los componentes. Este ejemplo es un claro modelo de por que los
entornos integrados de desarrollo son importantes a la hora de ayudarnos a generar el
repetitivo código de configuración visual para permitirnos dedicar más tiempo a lo
verdaderamente esencial, la programación de la funcionalidad de nuestra aplicación.
Por ahora lo que se busca es sentar bien las bases que nos permitan comprender cual es
el trabajo de los generadores de código para de esta manera, en un determinado
momento, saber donde es necesario hacer los cambios que nos permitan desarrollar una
aplicación ajustada a unos objetivos bien claros.
Punto de inicio,
Main
Diseño de la Funcionalidad
ventana de la ventana
Figura 5.3: Enfoque utilizado por Sharpdevelop y Visual C# para organizar en archivos, *.cs, el código
fuente de una aplicación conformada por un formulario que define una ventana al estilo Windows.
Para incluir la definición de una clase en dos archivos diferentes se utiliza la palabra
clave partial, que permite incluir implementaciones parciales en cada uno de ellos, las
cuales al momento de la compilación son unidas por el compilador en una sola clase.
El siguiente es un esquema general que muestra la funcionalidad de partial:
En los entornos de desarrollo, por cada formulario que se defina en una aplicación se
generarán dos archivos fuente básicos. El contenido de uno de esos archivos, el que
www.pedrov.phpnet.us
CAPITULO 5 APLICACIONES CON INTERFAZ GRAFICA TIPO WINDOWS 155
corresponde al diseño de la ventana, es generado automáticamente a medida que se
hacen cambios en el diseñador gráfico que sirve como ayudante a la hora de construir
un formulario.
Los anteriores archivos no son las únicas fuentes que conforman una aplicación con
interfaz gráfica, pues existen algunos otros que permiten incluir información
importante para la aplicación o incluir recursos adicionales, como íconos y otros
elementos que ayudan a mejorar la calidad de la aplicación en desarrollo. Estos se
describirán con detalle en el siguiente capítulo, cuando se describa la programación
con un entorno de desarrollo integrado.
Con este ejemplo vamos a mostrar como se organiza el código del código de
programación, de una aplicación con interfaz gráfica, en los entornos de desarrollo
integrado. Tomaremos como base a Sharpdevelop, pero cualquier otro entorno,
incluyendo a Visual C#, maneja un esquema similar.
Lo primero que hace el entorno de programación es crear una carpeta o directorio para
almacenar los archivos fuente. Esta carpeta se identifica con el nombre del proyecto.
En nuestro caso al proyecto lo llamaremos Ejemplo58. El lector debe crear en la
carpeta que ha venido utilizando como carpeta de ejercicios, una subcarpeta con el
nombre Ejemplo58.
Estos entornos, generalmente colocan la clase de programa, que incluye al método
Main, en un archivo fuente independiente, al cual se lo identifica como Programa.cs
(o comúnmente escrito en inglés como Program.cs). Todas las clases que hacen parte
de una aplicación se incluyen en un espacio de nombres que lleva el nombre del
proyecto.
Programe el siguiente archivo fuente y guárdelo en la carpeta de nuestro proyecto.
/* Archivo: Programa.cs */
using System;
using System.Windows.Forms;
namespace Ejemplo58
{
public class Programa
{
static void Main(string[] argumentos)
{
Application.Run(new VentanaPrincipal());
}
}
}
Cada ventana que conforma la aplicación se genera a partir de al menos dos archivos
fuente. En el primero de ellos se incluye el método de creación de controles y toda la
configuración de la ventana y se lo llama archivo del diseñador. Así, si la ventana se
llama VentanaPrincipal (o en inglés, MainForm) se genera un archivo con el nombre
VentanaPrincipal.Disenador.cs.
En el archivo del diseñador se incluye una parte de la clase que genera a la ventana,
por lo que es necesario utilizar la palabra clave partial en su definición. No se debe
olvidar que esta clase siempre se deriva de la clase Form.
El siguiente archivo fuente muestra la creación de una ventana que incluye un botón de
comando etiquetado con la palabra Aceptar, que aparece centrado en la ventana.
pedrov.cs@hotmail.com
156 CAPITULO 5 PROGRAMACION CON C#
/* Archivo: VentanaPrincipal.Disenador.cs */
using System;
using System.Windows.Forms;
namespace Ejemplo58
{
partial class VentanaPrincipal : Form
{
void InicializarComponente()
{
this.Text = "Ejemplo 58";
// Botón Aceptar
Button buttonAceptar = new Button();
buttonAceptar.Text = "Aceptar";
buttonAceptar.Left = (this.Width - buttonAceptar.Width) / 2;
buttonAceptar.Top = (this.Height - buttonAceptar.Height) / 2;
buttonAceptar.Click += new EventHandler(buttonAceptarClick);
this.Controls.Add(buttonAceptar);
}
}
}
/* Archivo: VentanaPrincipal.cs */
using System;
using System.Windows.Forms;
namespace Ejemplo58
{
public partial class VentanaPrincipal : Form
{
public VentanaPrincipal()
{
InicializarComponente();
}
// Aquí se incluye toda la funcionalidad de la ventana
void buttonAceptarClick(object emisor, EventArgs e)
{
MessageBox.Show("Bienvenido...", "Ejemplo 58");
}
}
}
Todos los archivos fuente que conforman un proyecto son compilados en un único
ensamblado, que para este caso es un ejecutable, que lleva el nombre del espacio de
nombres que envuelve a las clases.
Para compilar nuestro proyecto utilice la instrucción,
www.pedrov.phpnet.us
CAPITULO 5 APLICACIONES CON INTERFAZ GRAFICA TIPO WINDOWS 157
Aunque estos no son los únicos archivos que conforman una aplicación con interfaz
gráfica de usuario, desarrollada mediante un entorno integrado de desarrollo, si son los
archivos más importantes que todo programador debe conocer y saber modificar
adecuadamente para lograr sacar el mayor provecho posible a este tipo de sistemas de
programación. Los dos primeros archivos son generados en forma automática por el
sistema de programación, pero es muy importante conocer bien su estructura de tal
manera que puedan ser manipulados con propiedad en el momento de realizar las
modificaciones que convengan al interés del programador.
Generalmente, los entornos integrados de desarrollo son buenos asistentes cuando se
trata de desarrollar un nivel medio de programación, pero pueden complicar las cosas,
e incluso limitarlas, cuando se trata de realizar programación de nivel avanzado.
Únicamente el pleno conocimiento de la forma como esta organizada la codificación
permite lograr los objetivos propuestos en un proyecto que requiera recurrir a
programación avanzada.
pedrov.cs@hotmail.com
158 CAPITULO 5 PROGRAMACION CON C#
www.pedrov.phpnet.us