¡A hardcodear!

Publicado el Viernes 2 julio 2010 en DirectX por Thund

Basta de presentaciones, resúmenes e instalaciones varias, vamos a lo que nos gusta que es picar código y ver punticos de colores moviéndose en la pantalla. Tenía pensado en este post enseñar cómo se hace un Modern Warfare 2 pero luego me dije, si eso para esta gente estará chupao, mejor explico cosas más difíciles e interesantes como mostrar una ventana en Windows… Tranquilidad, no es eso realmente lo que voy a hacer, hay millones de tutoriales en la Red para aprender a usar la API de Windows o la MFC para manejo de recursos de intefaz de usuario. Voy a exponer cómo he organizado el proyecto que servirá de base para el resto de ejemplos en este blog.

Estado inicial y Objetivos

Lo primero que he hecho ha sido crear un proyecto Win32 de tipo Windows Application, sin ATL ni MFC (como ya sabéis, la versión Express de VS no las incorpora, ni falta que nos hace). Automáticamente tendremos un fichero .CPP (entre otros) con una serie de definiciones y 5 funciones globales:

  • _tWinMain
  • MyRegisterClass
  • InitInstance
  • WndProc
  • About

Todas ellas están relacionadas con lo mismo, la inicialización y control de la ventana principal, que incluye la ventana-hija típica "Acerca de…" ("About…"). El objetivo es que al final tengamos una función de entrada WinMain que contenga la llamada a la inicialización del sistema y una sentencia return. Además, no debe quedar ninguna definión o constante global.

Transformación

Como a la gente de C++ nos gusta la POO más que a Pedobear la niña de Lazy Town, la idea es aislar el código que será común para todos los futuros tutoriales, encapsulándolo en una clase, de forma que queden mucho más limpios y nos podamos concentrar únicamente en el tema a tratar. Lo único que he hecho ha sido copypastear las funciones a otro archivo y cargarme aquello que no necesitamos, concretamente todo lo relativo a la ventana-hija y el menú superior (File y About). Por tanto, he eliminado lo siguiente:

  • La función About
  • La invocación al cuadro de diálogo de la ventana About, en WndProc
  • Los aceleradores del menú, en _tWinMain
  • Recursos usados por la ventana About, en el archivo .RC

El código ha sido trasladado a una clase que llamaremos EGWindowsHelper y que encapsulará toda la funcionalidad relacionada con el S. O.. En la siguiente tabla pueden verse las conversiones y algunos métodos adicionales que nos serán útiles:

Ámbito global Clase EGWindowsHelper Comentario
_tWinMain Initialize Se mantiene la función global por ser el punto de entrada a la aplicación, pero se mueve su contenido.
MyRegisterClass RegisterWindowClass  
InitInstance InitInstance  
WndProc WndProc Noten los noobs de C++ que es necesario declararla como static ya que no es lo mismo un método estático, que es tratado como una función global encerrada en el ámbito de clase, que un método no estático, que sería considerado un miembro de clase. La referencia al método se realiza de forma distinta y la estructura WNDCLASSEX (en RegisterWindowClass) sólo acepta una referencia a función no-miembro.
  SetFunctionCalledByWndProc Establece la función llamada por la función de callback del bucle de mensajes de Windows cada vez que llega un mensaje a la aplicación.
  GetWindowClassIdentifier Obtiene el identificador de clase de la ventana principal.
  GetWindowHandler Obtiene el manejador de la ventana principal.

 

Modo de uso

He añadido un constructor que acepta los mismos parámetros que la función _tWinMain, de forma que tan sólo hay que pasar tales valores cuando se instancie la clase EGWindowsHelper, y ya tenemos ventana y aplicación funcionando. El .CPP principal queda así de sencillo:

#include "stdafx.h"
#include "EndlessGameEnvironment.h"

using namespace EndlessGame;

int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
    EGWindowsHelper* windowsHelper = new EGWindowsHelper(hInstance, hPrevInstance, lpCmdLine, nCmdShow);

    return 0;
}

 

Descargas

¡Y eso es todo! Podéis descargarlo desde aquí:

EndlessGameEnvironment.zip (23 Kb)
 

Etiquetas: ,

Una Respuesta a '¡A hardcodear!'

Suscríbete a los comentarios con RSS o TrackBack a '¡A hardcodear!'.

  1. hebep dijo:

    no suelo seguir blogs relacionados con la informática porque me parecen aburridos, sin embargo, me gusta como cuentas las cosas :D . Ánimo y sigue así.

    Respecto a postear con regularidad, puedes hacer como yo, escribir muchas entradas de golpe y dejar que se vayan publicando cada x días ;)

    on julio 6th, 2010 at 10:15

Publica un comentario