Este blog va mas enfocado a las personas que van comenzando en una API gráfica y sean nuevos en este tema, eso si, lo único que les pido es que tengan conocimientos previos en C/C++ y claramente en Windows, ya que este curso va enfocado a esos lenguajes y entorno, aun así tratare que esta parte sea estimulante para los que no saben mucho de los lenguajes o los que recién comienzan (Pero luego de esta introducción sera muy diferente, los que ya tienen experiencia previa solo salten las notas), si tienen error de código es porque probablemente no están usando de manera adecuada la WinApi en sus compiladores.
Compilador que usare en este proyecto es Code::Block
Paginas y libros para aprender C y C++:
- C++ programar ya
- Visual C++ 6 Unleashed (libro)
- C con clase (web)
- C++ con clase (web)
- Pensar en C++ (Libro)
- Wikiboocks Programación en C++ (web)
- Aprende c++ como si estuviera en primero de Deitel y su Hijo Deitel, recomiendo sus otros libros (Libro)
- C++ con ATS (Youube)
Creando nuestro proyecto en Code::Blocks
Listo, ya tenemos nuestro proyecto y entorno para para programar. Ahora, borremos todo lo que esta arriba y pongamos las siguientes lineas de código las cuales nos generaran nuestro primer programa gráfico:
1
2
3
4
5
6
#include <window.h>
int WINAPI WinMain(hiNSTANcE hInstance, HiNSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){
MessageBox(NULL, "Hola Mundo", "404.exe", MB_OK);
return 0;
}
Windows.h
Aunque se vea sencillo y tire algunos warning (Es normal), solamente es para comenzar, lo mas importante de este código es sin duda la cabecera principal para Windows es: Windows.h, existen otras cabeceras para usar cosas especificas de la API (Luego veremos esto mas abajo para que entiendan mejor), lo que hace windows.h es agregar todas las principales directamente así que nos ahorramos en parte en poner cada fichero para cada cosa.
Nota: Una cabecera es archivo, header, header(File), etc. El cual contiene funciones, macros, clases, prototipos, etc. (Recomiendo buscar cada cosa por si desconocen los conceptos) Los cuales ya están pre-compilados, y nosotros solo haremos uso de este header.
WINAPI y Main
WINAPI o APIENTRY, indican una convención de llamada la cual es definida como __stdcall, en C cambia ya que tiene su propia convención de llama que es _cdecl que es usada por muchos compiladores en C y arquitecturas x86, solamente que win32 no usa esta convención sino la de PASCAL, también llamada _stdcall, estas convenciones le dice al compilador como utilizar la pila de manera correcta, como deben ser pasados e insertados los argumentos dentro de ella, el valor a retornar, entre otras cosas. En cabecera se vería algo como #define WINAPI _stdcall (Existen otras convenciones de llamada). Les recomiendo ver en Wikipedia la información esta mas detallada.
Nota: «En ciencias de la computación, la convención de llamadas a funciones es un esquema de implementación de bajo nivel para determinar la manera en que las subrutinas reciben parámetros de su “llamador” y devuelven un resultado», Wikipedia.
WinMain
El punto de entrada o comienzo de toda app en Windows es WinMain, podemos decir que es equivalente al famoso int main() clásico, pero no, la diferencia es bastante poca pero es notable como por ejemplo, que usa mas parámetro y que su convención como vimos arriba es diferente a la que es en un programa en win32. Este WinMain pertenece a la librería winbase.h, solo que como dijimos antes la mejor forma de empezar es poner directamente window.h
Parámetros
Algo que les dejare de tarea en esta introducción es leer y aprender con tranquilidad la notación húngara, este sistema es usado para crear nombres de variables, estructuras, etc. Es usado especialmente para programacion de sistema operativos y otros espacios de desarrollo como la utilización de win32, una vez que aprendamos estos prefijos podemos utilizarlos, recuerden su forma de utilizarlos es ponerla comienzo el tipo de prefijo en minúsculas+Sunombrevariable. De momento lo único que les aclaro de este apartado es que punteros largos o cortos, en winAPI no hay distinción entre estos dos por lo que en punteros largos este por así decirlo no es muy importante solamente es usado por compatibilidad, y por lo que cosas como LSPTR; puntero largo a una cadena de caracteres, podemos leerlas como puntero a una cadena de caracteres. La T solo se preocupense si trabajan en unicode, pero como lo dudo sigamos.
HINSTANCE hInstance
Es un handler para manejar o manipular instancias de la app, cuando se crea la app Windows hace una instancia en ella, es decir, cuando se carga un recurso ya sea .EXE o DLL este le pasa un manipulador a la instancia y es cargado solo una vez en memoria, por si tienen dudas de ¿Que pasa si se usan dos instancias? ¿Son diferentes?, pues, lo primero fue respondido ya y lo segundo, sí.
HINSTANCE hPrevInstance
Igual que el anterior, pero esto era así antes (win16), ahora cambio en win32 y todas las instancias como dijimos antes son diferentes, y siempre están en NULL o nulo, ¿Por qué se usa? por motivos de compatibilidad, así que este parámetro pueden ignorarlo.
LPSTR cmdline
String donde se le pasan argumentos de comando de linea
nCmdShow
Este parametro nos dice como se vera la ventana, podemos manipularla después pasándola a ShowWindow (Que luego veremos) o a SW_SHOWDEFAULT que es lo mas recomendable antes de usar ShowWindow.
Dentro del WinMain
Dentro del main hacemos llamada a una convención la cual es MessageBox(), nos muestra un dialog box o diagolo modal el cual funciona de la siguiente manera: como por ahora no tenemos ninguna ventana pasamos un NULL al manejador de la ventana, luego pasamos al siguiente argumento el cual es donde pondremos texto en el área blanca donde normalmente nosotros pondremos controladores o toda la información que se vera reflejada en la ventana para el usuario “¡Mi primer programa!, después pasamos al titulo de la ventana en mi caso puse Sombra.exe <3, y por ultimo el un conjunto de botones (MB_OK), por defecto, MB_OK ya esta que es el boton de aceptar, ¿Qué pasaría si lo cambiamos por otro como MB_OKCANCEL…?, podemos omitir este argumento y solo poner 0, ya que a pasar por este valor como dije anteriormente se mostrara por defecto el mensaje ACEPTAR.
Muchas gracias por leer esta parte introducción.