Site hosted by Angelfire.com: Build your free website today!

Introducción a Visual C++

El objetivo de este documento es ayudarle a entender los conceptos fundamentales que hacen que los programas de MFC trabajen bajo Visual C++. Mucha gente salta dentro de Visual C++, inician con el AppWizard, hacen que genere un nuevo programa, y luego tratan de usar el tutorial sencillo que viene con Visual C++. Sin un entendimiento fundamental de la estructura de código de MFC, los tutoriales simplemente no tienen sentido.

Este documento inicia desde el comienzo, y le muestra los conceptos fundamentales y simples que lleva cualquier programa MFC. Una vez haya terminado esta serie usted encontrará que MFC y las salidas del App Wizard tienen más sentido.

Introducción a MFC

Visual C++ es mucho más que un compilador, es un ambiente de desarrollo de aplicaciones completo, que si es usado correctamente, le puede permitir explotar la naturaleza orientada a objetos de C++ para crear aplicaciones profesionales en Windows. Usted debe entender como primera medida la jerarquía de las MFC (Microsoft Foundation Classes). Esta jerarquía de clases encapsula la porción de la interface de la API de Windows, y la hace significativamente mucho más fácil de usar para crear aplicaciones de Windows de una manera orientada a objetos. Esta jerarquía es totalmente compatible con todas las versiones de Windows.

Estos tutoriales introducen los conceptos fundamentales detrás de MFC y la programación orientada a eventos.

Qué es la Biblioteca MFC Microsoft Foundation Classes?

Digamos que quiere crear una aplicación de Windows. Usted podría, por ejemplo, necesitar crear un editor de texto o dibujo especializado, o un programa que encuentre archivos en un disco duro grande, o una aplicación que le permita al usuario visualizar las interrelaciones en un gran conjunto de datos. Donde comenzar?

Un buen punto de partida es el diseño de la interfaz de usuario. Primero decida lo que el usuario debería ser capaz de hacer con el programa y luego escoger un conjunto de objetos de interfaz de usuario correspondientemente. La interfaz de usuario de Windows tiene un número de controles estandar, tales como botones, menús, barras de scroll, y listas, que son familiares para los usuarios de Windows. Con esto en mente, el programador debe escoger un grupo de controles y decidir como organizarlos. Una forma es hacer un dibujo de la interfaz de usuario propuesta hasta que se sienta bien.

El siguiente paso es implemetnar el código. Cuando se crea un programa para cualquier plataforma de Windows, el programador tiene dos elecciones: C o C++. Con C, se programa a nivel de la API (Application Program interface). Esta interfaz consiste en una colección de cientos de funciones de C descritas en los libros de referencias. Para Windows NT, el API se llama "WIN 32 api".

Aquí aparece una librería de C++ que facilita la labor del programador porque enmascara las fucniones del API. Es llamada Microsoft Foundation Classes (MFC), la primera ventaja de esta biblioteca es la eficiencia. Reduce grandemente la cantidad de código que debe ser escrito para crear un programa de Windows. También da todas ventajas encontradas normalmente en programación de C++, tales como herencia y encapsulamiento. MFC es portatil, de forma que, por ejemplo, el código creado bajo 3.1 puede moverse a Windows NT o Windows 95. MFC es por eso el método preferido para desarrollar aplicaciones de Windows.

Cuando usted usa MFC, usted escribe código que crea los controles de interfaz de usuario y configura su apariencia. También escribe código que responde a cuando el usuario manipula estos controles. Por ejemplo, si el usuario hace click en un botón, usted quiere tener código en lugar que responda apropiadamente. Esta clase de código de atención a eventos es lo que formará la parte principal de la aplicacion. Una vez la aplicación responde correctamente a todas las variables de control, está terminada.

Usted podrá entender de esta discusión que la creación de un programa en Windows es un proceso sencillo cuando se usan las MFC. El ambiente de desarrollo de aplicaciones de Visual C++ está especialmente sintonizado con MFC, así que aprendiendo MFC y Visual C++ al tiempo podrá incrementar mucho su poder como un desarrollador de aplicaciones.

Vocabulario de Windows

El vocabulario usado para hablar acerca de las características de interfaz de usuario y el desarrollo de software en Windows es básico pero único. Aquí veremos algunas definiciones que harán este estudio más sencillo para aquellos que son nuevos al ambiente.

Las aplicaciones de Windows usan varios controles de usuario estandar:

Usted puede crear estos controles ya sea en código o a través del "editor de recursos" que puede crear diálogos y los controles que le pertenecen.

Windows soporta varios tipos de aplicaciones de ventanas. Una aplicación típica vive dentro de una "ventana marco". Una ventana marco (Frame window) es una ventana principal que se puede redimensionar, minimizar, maximizar y demás. Windows también soporta dos tipos de recuadros de diálogo: modales y no modales. Un recuadro de diálogo modal, una vez en la pantalla, bloquea la entrada del resto de la aplicación hasta que es respondido. Un diálogo no modal puede aparecer al mismo tiempo que la aplicación y parece flotar detrás.

Las aplicaciones de Widnows más simples usan SDI (Single Document Interface: interfaz de Documento Simple). El reloj, el editor de PIF y el Notepad son ejemplos de aplicaciones SDI. Windows también da un esquema de organización llamado MDI (Multiple Document Interface: Interfaz de Múltiples documentos). El sistema MDI permite al usuario ver múltiples documentos al mismo tiempo dentro e una misma instancia e una aplicación. Por ejemplo, el editor de texto permitirá al usuario abrir múltiples archivos simultáneamente. Cuando se implementa con MDI, la aplicación presenta una ventaja de aplicación grande que puede mantener múltiples sub-ventanas, cada una conteniendo un documento. El menú principal es llevado por la ventana de aplicación principal y se aplica a la ventana que esté al frente dentro de las ventanas hijas. Las ventana individuales pueden ser expandidas y minimizadas dentro del marco MDI, o el marco entero de MDI puede ser minimizado dentro de un ícono simple en el escritorio. La interfaz MDi da la impresión de un segundo escritorio y se usa para organizar la proliferación de ventanas.

Cada aplicación que usted crea usará su conjunto único de controles, su propia estructura de menú, y sus propios diálogos. Una gran cantidad de esfuerzo se va en crear cualquier buena interfaz de aplicación está en la organización y escogencia de los objetos de la interfaz. Visual C++, junto con su editor de recursos, hace que la creación y configuración de estos objetos de interfaz sea extremadamente sencillo.

Software orientado a Eventos y su vocabulario

Todas las Interfaces Gráficas (GUI) de Usuario basadas en Windows contienen los mismo elementos básicos y todos operan de la misma forma. En la pantalla el usuario ve un grupo de ventanas, cada una de estas ventanas contiene controles, íconos, objetos y algunos que son manipulados con el muose y con el teclado. Los objetos de interfaz vistos por el usuario son los mismos que en el sistema: botones, íconos, barras de scroll, recuadros de diálogo, menús, etc. EStos objetos de interfaz todos trabajan en la misma forma, aunque algunos tiene diferencias menores en su apariencia.

Desde el punto de vista del programador, los sistemas son todos similares en concepto, aunque difieren radicalmente en sus especificaciones. Para crear un programa GUI, el programador primero coloca todos los controles de interfaz necesarios en una ventana. Por ejemplo, si el programador está tratando de crear un programa simple tal como un Conversor de Farenheit a Celsius, entonces el programador selecciona los objetos de interfaz apropiados para la tarea y los despliega en la pantalla. En este ejemplo el programador dejaría al usuario entrar una temperatura en un área de texto editable, desplegar la temperatura convertida en otra área de texto no editable, y dejaría al usuario salir del programa haciendo click en un botón con la etiqueta "quit".

A medida que el usuario manipula los controles de aplicación, el programa debe responder apropiadamente. Las respuestas están determinaas por las acciones del usuario a los diferentes controles usando el mouse y el teclado.

Cada objeto de interfaz de usuario en la pantalla responderá a los eventos de forma diferente. Por ejemplo, si el usuario hace click en el botón de Quit, el botón debe actualizar la pantalla apropiadamente. Entonces el programa debe responder terminando. Normalmente los botones manejan su propia apariencia, y el programa en algunas formas recibe un mensaje del botón que dice, "El botón de Salir ha sido presionado, haga algo". El programa responde saliendo.

Windows sigue el mismo patrón general. En una aplicación típica usted creará una ventana principal y colocarán dentro de ella diferentes controles de interfaz de usuario. Estos controles son a menudo referidos como ventanas hijas - cada control es como una sub-ventana más especializada dentro de la ventana de aplicación principal. Como programador, usted manipula los controles enviando mensajes por medio de llamadas a funciones, y ellos responde a las acciones de usuario enviando mensaje de vuelta a su código.

Si usted nunca ha hecho alguna programación manejada por eventos, todo parecerá extraño para usted. Sin embargo, el estilo de programación manejada por eventos es fácil de entender. Los detalles exactos dependen del sistema y el nivel al cual usted está haciendo interfaz con él, pero los conceptos básicos son similiares. En una interfaz manejada por eventos, la aplicación pinta varios objetos de interfaz de usuario tales como botones, areas de texto, menús en la ventana. Ahora la aplicación espera dentro de un fragmento de código llamado el loop de eventos a que el usuario haga algo. El usuario puede no hacer nada a ninguno de los objetos de la pantalla usando el mouse o el teclado. El usuario podría hacer click en uno de los botones, por ejemplo. El click del mouse es llamado un evento. Los sistemas de manejo de eventos definen eventos para las acciones del usuario tal como click del mouse o pulsaciones del teclado, así como actividades del sistema tales como actualización de la pantalla.

En el nivel más bajo de abstracción, usted tiene que responder a cada eventos con algo de detalle. Este es el caso cuando está escribiendo código normal de C directamente al API. En tal escenario, usted recibe el evento del click del mouse en alguna clase de estructura. El código en su loop de eventos revisa diferentes campos de esta estructura, determina cual objeto de la interfaz de usuario fue afectado, quizas resalte el objeto de alguna manera para dar realimentación visual, y luego hace la acción apropiada para ese objeto y ese evento. Cuando hay muchos objetos en la pantalla la aplicación se vuelve grade. Puede tomar mucho código simplemente para averiguar cual objeto tuvo el click y qué hacer acerca de eso.

Afortunadamente, usted puede trabajar a un nivel mucho más alto de abstracción. En MFC, casi toda esta implementación de bajo nivel es manejada por la aplicación sin que usted lo sepa. Si usted quiere colocar un objeto de interfaz de usuario en la pantlla, la crea con dos líneas de código. Si el usuario hace click en un botón, el botón hace todo lo necesario para actualizar su apariencia en la pantalla y luego llama una funciona creada en su programa. Esta funcion contiene el código que implementa la acción apropiada para el botón. MFC maneja todos los detaller para usted: usted crea el botón y crea un manejador apropiado, el botón llamad su función cuando el usuario presiona el botón.

Un ejemplo

Una de las mejores formas de comenzar a entender la estructura de un estilo de un programa MFC típico es entrar, compilar, y correr un pequeño ejemplo. La lista a continuación contiene un programa simple "hello world". Si es la primera vez que ha visto esta clase de programa, probablemente no tenga mucho sentido para usted. No se preocupe acerca de eso. Examinaremos el código en detalle luego.

Por ahora, el objetivo es udar el ambiente Visual C++ para crear, compilar y ejecutar este programa simple.

// hello.cpp

#include <afxwin.h>

// Declaramos la clase de la aplicación
class CAplicacionBasica: public CWinApp {
public:
  virtual BOOL InitInstance();
};

// Crea una instancia de la clase de aplicación
CAplicacionBasica MiPrimeraAplicacion;

// Declara la clase de la ventana Principal
class CVentanaPrincipal: public CFrameWnd {
  CStatic *cs;
public
  CVentanaPrincipal();
}

// La función InitInstance es llamada cada vez que la aplicación se ejecuta
BOOL MiPrimeraAplicacion: InitInstance() {
  m_pMainWnd = new CHelloWindow();
  m_pMainWnd->ShowWindow(m_CmdShow);
  m_pMainWnd->UpdateWindow();
  return TRUE;
}

// El constructor para la Clase Ventana
CVentanaPrincipal:CVentanaPrincipal() {
  // Crea la ventana en sí
  Create(NULL,"Esta es mi primera aplicación");
  // Crea un componente Etiqueta estático
  cs = new CStatic();
  cs->Create("Hola Aplicación",WS_CHILD|WS_VISIBLE|SS_CENTER,CRect(50,80,150,150),this);
}

Este pequeño programa hace tres cosas. Primero, crea un "objeto aplicación". Todos los programas MFC que usted escriba crearán un objeto de aplicación simple que maneja los detalles de inicializacion de MFC y las Ventanas. Luego, la aplicaicón crea una ventana simple en la pantalla que actúa como la ventana de aplicación principal. Finalmente, dentro de la ventana crea una cadena de texto que contiene las palabras "Hola Aplicación".

Inicie Visual C++ desde el menú de inicio de Windows. Iniciamos cerrando todo lo que haya abierto, Yendo a Window y diciendole Close All si está disponible. Cierre todas las ventanas disponibles. Luego abriremos las que necesitemos con la opción "Customize" del menú "Tools".

Lo que ve es lo normal. Algunos botones y un menú.

What you see now is "normal". Along the top is the menu bar and several toolbars. Along the left side are all of the topics available from the on-line book collection (you might want to explore by double clicking on several of the items you see there - the collection of information found in the on-line books is gigantic). Along the bottom is a status window where various messages will be displayed.

Ahora qué? Lo que le gustaría hacer es escribir el programa anterior, compilarlo y correrlo. Antes de iniciar, revise que tenga por lo menos 5 megabytes de espacio libre en disco. Luego haga lo siguiente.

Creación de un proyecto y compilación del código

Para compilar cualquier código en C++ usted tiene que crear un proyecto. Con una programa muy pequeño como este el usar un proyecto puede parecer exagerado, pero cuando el programa crece se ve claramente su utilidad. Un proyecto tiene tres tipos diferentes de información:

  1. Recuerda todos los archivos de código fuente que se combinan para crear un ejecutable. En este ejemplo simple, el archivo hello.cpp será la única fuente, pero en aplicaciones mayores a menudo se separa el código en diferentes archivos para hacerlo más fácil de entender. El proyecto mantiene una lista de los diferentes archivos y los compila todos según sea necesario cada vez que quiere crear un nuevo ejecutable.
  2. Recuerda las opciones de compilación y link particulares a la aplicación especificada. Por ejemplo, recuerda cuales bibliotecas se van a enlazar, si usa encabezados de precompilación, y demás.
  3. Recuerda qué tipo de proyecto usted desea construir: una aplicación de consola, una aplicación de windows, etc.

Si usted está familiar con los makefiles, entonces es fácil pensar de un proyecto como un makefile hecho por la máquina que tiene una interfaz muy fácil de usar y manipular. Por ahora crearemos un proyecto muy simple llamado HELLO.CPP.

Para crear un nuevo proyeco, escoja la opción NEW en el menú FILE. Bajo el tab de PROJECTS escoja WIN32 APPLICATION. En el campo de nombre del proyecto escoja un nombre, vamos a usar "hello". En location puede escojer el directorio donde guardar los archivos. Seleccione OK, en la siguiente ventana, use la selección que viene ya: "An empty project", y luego escoja "Finish", y luego OK en la siguente ventana. Note que hay una opción para la típica aplicación "Hello World", sin embargo, se salta algunos pasos importantes que usted está por tomar. Visual C++ creará un nuevo subdirecctorio llamado HELLO y colocará los nombres del proyecto llamadas HELLO.OPT, HELLO.NCB, HELLO.DSP, y HELLO.DSW en ese directorio. Si usted se sale y luego quiere reabrir el proyecto, haga doble click en HELLO.DSW desde el Windows Explorer.

El área en la parte izquerda de la pantalla cambiará de forma que hay dos tabs están disponibles. Deben existir los tabs de ClassView y FileView. El tab de ClassView le mostrará la lista de todas las clases en su aplicación y el FileView le da una lista de todos los archivos en el proyecto.

Ahora es el momento de escribir el código para el programa. En el menu FILE selecciones una opción NEW para crear una nueva ventana del editor. En el diálogo escoja el tab FILES y seleccione "C++ Source File". Asegurese que la opción "Add to Project" está mercada para el Project "hello, y entre "hello" como nombre de archivo. Visual C++ viene con su propio editor inteligente de C++, y usted lo usará para entrar el programa que escribimos hace un rato. Copie el código en la ventana del editor. Usted encontrará que el editor automáticamente diferencia los partes del programa tales como comentarios, palabras clave, literales y demás. Luego de que haya terminado de entrar el código, guarde el archivo seleccionando la opción Save en el menu FILE. Guarde todo como un archivo llamado HELLO.CPP en el nuevo directorio que Visual C++ creó.

En el área de la izquierda de la pantalla, haga click en el FileView y expanda el árbol en el ícono que dice "hello files", luego expanda el árbol de "Source Files". Usted verá el archivo llamado HELLO.CPP. Haga click en el tab de ClassView y expanda el árbol de "hello classes" y usted verá las clases en la aplicación. Usted puede quitar un archivo del proyecto en cualquier momento, yendo a File View, seleccionando el archivo y borrandolo.

Finalmente usted debe decirle al proyecto que use las bibliotecas MFC. Si usted omite este paso el proyecto no enlazará apropiadamente, y aparecerán algunos mensajes de error. Escoja el menú PROJECT y la opción SETTINGS. Asegúrese que el tab general está seleccionado. En el combo de selección de Microsoft Foundation classes, escoja la tercera opción "Use MFC in a Shared DLL". Luego cierre el diálogo.

Habiendo crear el archivo de proyectos y luego de ajustar los "Settings", usted está listo para compilar el programa HELLO.CPP. En el menú BUILD usted encontrará tres opciones de compilación diferentes:

La primera opción simplemente compila, el codigo fuente listado y forma archivos objeto para él. ESta opción no hace enlace, de forma que es útil solo para compilación rápida de un archivo para chequear erroes. La segunda opción compila todos los archivos fuentes en el proyecto que han sido modificados desde la última construcción de la aplicación y luego los enlaza para formar un Ejecutable. La tercera opción recompila todos los archivos del proyecto y los reenlaza.

En este caso, escoja la opción Build HELLO.EXE para compilar y enlazar el código. Visual C++ crea un nuevo subdirectorio llamado Debuj y coloca el ejecutable HELLO.EXE en ese nuevo subdirectorio. ESte subdirectorio mantiene todos los archivos desechables generados por el compilador, así que usted puede borrar este directorio cuando le falte espacio.

Si ve errores de compilador, haga doble click sobre el mensaje de cada error en la ventana de salida. El editor le mostrará donde es´ta el error. Compare el error que escribió contra el que tiene en este documento y arregle cualquier problema.

Para ejecutar el programa, escoja la opción Execute HELLO.EXER en el menú BUILD. Una ventana aparece con las palabras "Hola Aplicación". La ventaja tiene las decoraciones usuales: una barra de título, unas áreas de redimensionaminto, los botones de minimizar, maximizar y demás. Dentro de la ventana hay una etiqueta estática desplegando las palabras "Hola Aplicación". Note que el prograa es completo. Usted puede mover la ventana, redimensionarla, minimizarla, etc. Con una pequeña cantidad de código usted ha creado una aplicación completa de Windows. Esta es una de las muchas ventajas de usar MFC. Todos los detalles son manejados en otro sitio. Para terminar el programa, haga click en el menú de system (el recuadro pequeño en la parte superior izquierda de su primer programa.

Conclusión

En este primer tutorial usted ha compilado y ejecutado su primer programa.