Mostrando entradas con la etiqueta winmain. Mostrar todas las entradas
Mostrando entradas con la etiqueta winmain. Mostrar todas las entradas

domingo, 5 de junio de 2016

Como crear una ventana sencilla en C++


Para ir a mi canal de youtube haz click aquí
Para ir a la lista de reproducción haz click aquí

SI USAS VISUAL STUDIO POR FAVOR HAZ CLIC AQUÍ


Resumen del video

     En el video que acabas de ver, podemos primero decir que una aplicación de Windows se divide en 6 partes:
  1. El proceso de mensajes, como vimos una función que tiene que ser creada de acuerdo a unos parámetros, específicamente tiene que tener 4 variables que pasarle, no se puede crear de otra forma
  2. Nuestro método "WinMain", estamos acostumbrados a que en c++ nuestro método de arraque sea "main", pero en este caso lo reemplazamos por el ya nombrado, este debe tener los 4 parámetros que vimos en el vídeo
  3. Nuestra clase de ventana, que no es mas que todos los valores en común que van a tener todas las ventanas de nuestra aplicación. No debe confundirse con "clase" de programación orientada a objetos, como vimos es una "estructura"
  4. Nuestra ventana, se crea con el método "CreateWindow", mas abajo voy a hablar mas en detalle de esta función
  5. El bucle de mensajes, quizá la parte mas importante, aquí paramos un poco la ejecución de modo que nuestra ventana pueda ser usada, y capturamos todos los mensajes provenientes tanto del S.O como de nuestra propia aplicación.
  Cabe destacar que en una que otra ocasión he escuchado que el eslogan de C++ es: "Escribelo una vez, compilarlo donde sea", esto como una especie de comparación con el eslogan de Java, es muy importante mencionar que aquí no es para nada el caso, si quisiéramos compilar este código en linux o en mac, no nos va a funcionar nada, ya que estamos usando la API de Windows, en otras palabras estamos usando las herramientas y bloques de construcción que el sistema Windows nos provee, y estos no estan presentes en otros sistemas. Si quisiéramos crear una ventana que se pudiera compilar tanto en Windows como en linux, deberíamos utilizar una librería gráfica presente en ambos sistemas, GTK+ podría ser una opción, pero no viene por defecto en Windows, para que nuestra aplicación pudiese funcionar esta librería debería estar ya instalada.

CW_USEDEFAULT

  Quice colocar esto de primero ya que se me olvidó explicarlo en el video, la utilizamos para dar valores referentes a la posición "x" y "y" de nuestra ventana. Este permite que el sistema le provea una posición por defecto a la ventana, en lugar de definirla nosotros explicitamente, podemos en su lugar escribir las coordenadas directamente nosotros, de modo que la ventana se ubique como queramos

Los mensajes

  Los mensajes los podemos comparar a los eventos presentes en casi cualquier lenguaje, nos dicen cosas que "pasan" en nuestra aplicación, a continuación voy a listar algunos, los que a mi criterio son los más importantes :
  1. WM_DESTROY y WM_QUIT : Son hermanos, ambos sirven para finalizar la aplicación, el primero se envía en el momento que se hace click en el botón de cierre. El segundo lo envía la función "PostQuitMessage" que como vimos en el video solo se ejecuta al recibir el primero, este método logra que la función "GetMessage" devuelva "falso" y por lo tanto nuestro bucle de mensajes se deja de ejecutar, al hacerlo nuestra aplicación llega a su fin. Quizá ahora te estes preguntando ¿Porque no enviar "WM_QUIT" directamente? Esto es así en el caso de que quisiéramos preguntarle al usuario antes de terminar la aplicación, una vez que el ya ha hecho click en el botón de cierre, si realmente quiere cerrarla o guardar el trabajo antes, por ejemplo. También existe WM_CLOSE el cual es similar a WM_DESTROY
  2. WM_CREATE : Se envía al momento de solicitar a una aplicación la creación de una ventana, es por lo tanto llamada al momento en que funciones como "CreateWindow" y "CreateWindowEx" son llamadas, pero el mensaje es enviado antes de que la función devuelva un valor
  3. WM_COMMAND : Este mensaje puede considerarse el evento de click, cuando por ejemplo el usuario hace click en un botón en nuestra ventana o en un menú de la barra de menús. En los valores WPARAM y LPARAM podemos encontrar la información necesaria para saber de donde provino el evento, por ejemplo si el WPARAM es igual a BN_CLICKED entonces estamos hablando de un click a un botón, luego buscamos en el LPARAM que botón fue presionado
  4. WM_MOUSEMOVE : Cuando el mouse se mueve sobre la ventana, en el LPARAM se van a guardar las coordenadas "x" y "y" del mismo
  5. WM_MOUSEWHEEL, WM_MOUSEHOVER : Son enviados cuando la rueda del mouse es girada y cuando el ratón entra, respectivamente a la ventana en cuestión
  No da tiempo ni espacio para cubrir todos los mensajes, hay mensajes tan específicos como "WM_USERCHANGED",  que lo envía el sistema operativo a todas las ventanas cuando otro usuario ha iniciado sesión, lo envía justo después de cargar las configuraciones especificas de ese usuario. Aquí hay una lista completa de todos los mensajes presentes en Windows para que se hagan una idea, en total aparecen 52429, aunque es importante mencionar que no todos estos mensajes son utilizables, ya que algunos son utilizados por otros mensajes como por ejemplo "WM_NCCREATE" que se envía justo de antes de un "WM_CREATE"

CreateWindow y CreateWindowEx

  En el video se utilizó la primera, es importante mencionar que no hay mucha diferencia en la implementación, esta de hecho es solo una, "CreateWindowEx" tiene los mismos parámetros en el mismo orden que la primera, pero se le agrega un parámetro al inicio, este se refiere al "estilo extendido" y este es solo una opción mas para cambiar la apariencia o comportamiento de nuestra ventana, por ejemplo si creamos una ventana con el estilo "WM_OVERLAPPEDWINDOW" y luego aplicamos diferentes estilos extendidos, obtendremos lo siguiente para cada estilo :

Con WS_EX_TOOLWINDOW obtenemos la siguiente apariencia, podemos notar que parece una ventana de opciones o herramientas, como su nombre lo dice
Tenemos también a WS_EX_TOPMOST, aquí no vemos cambios en la apariencia de la ventana, ya que en este caso la ventana se va a ubicar al frente de cualquier ventana, ya sea perteneciente a la aplicación o no. Igualmente que con los mensajes sería imposible cubrirlo todo aquí, pero creo que estos dos ejemplo son suficientes para que adquieran suficiente entendimiento

Referencia completa

  En dos de la secciones de más arriba finalizo explicando que no hay espacio para toda la información, mi objetivo en los tutoriales es explicar para que ustedes entiendan, una vez se logre suficiente entendimiento podrán hacer maravillas con tan solo tener la referencia. A continuación les dejo un enlace a la referencia completa de Windows, pero desgraciadamente esta en inglés, así que quizás no sea de utilidad para todos

Conclusiones

  Si ya sabes programar interfaces gráficas en algún otro lenguaje como Java o Visual Basic, esto quizás te hará parecido abrumador, ya que la cantidad de elementos y código necesario en este caso es mucho mayor. Pero ten en cuenta que aquí estamos escudriñando el API de Windows a un nivel mucho más bajo, lo cual, en general nos ayudará a crear programas mas rápidos y mas eficientes.

Descargas