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



13 comentarios:

  1. gracias hacia dias queria encontrar una explicacion asi

    ResponderEliminar
    Respuestas
    1. Suscríbete al canal de youtube, pronto publicaré un tutorial de controles en win32

      Eliminar
  2. me gustaria encontrar un tutorial asi pero para linux

    ResponderEliminar
    Respuestas
    1. Por ahora no tengo planeado hacer un tutorial orientado a Linux, quizás en el futuro. Te recomiendo buscarlo de la siguiente forma, "Como crear ventana c++ gtk+" en este caso gtk+ es una librería gráfica que funciona en linux por lo que al crear una ventana con esta librería debería funcionar, incluso en windows si la instalas. También tengo un curso completo de Java, lo que escribes en Java funciona tanto en windows como en linux.

      Eliminar
  3. Me gustaria que hicieras un tutorial de un bots de computadora que pueda crear 5 correos gmail

    ResponderEliminar
    Respuestas
    1. Hola, tenía pensado hacer algo así pero en PHP, usando una librería cuyo nombre no recuerdo en este momento, para enviar correos desde php

      Eliminar
  4. cuantos años has estudiado y como se llama en la universidad
    esta tecnologia de la computacion ,saludos .

    ResponderEliminar
    Respuestas
    1. Hola, pues estoy terminando ingeniería, pero antes de empezar estaba estudiando informática (TSU carrera corta), osea como 5 años. Con el nombre que me estás preguntando, no estoy seguro de a que te refieres

      Eliminar
  5. Buenas amigo, tengo una pregunta, ¿Es posible recibir en una aplicación en C++, una señal inalámbrica a través de receptor en un puerto serial y utilizar esta información en la aplicación?

    ResponderEliminar
  6. Hola Giovani;
    Puedes ayudarme como guardar un dato ingresado mediante una caja de texto(o ventana) en una aplicación de Ventana de Windows. ya me ensañastes a crear ventanas(botones, label, texttos), te estaría muy agradecido y dime en que te puedo ayudar. desde ya estoy muy agradecido.
    correo: eeguevarapozo1976@hotmail.com

    ResponderEliminar
  7. como le hago para escribí en la ventana

    ResponderEliminar
  8. Hola
    Necesito crear una matriz (2D) de controles edit para utilizarla dentro un cuadro de dialogo, para luego pasar los valores a una matriz (2D). Pero necesito que dado el numero de filas y columnas recién se cree la matriz de controles edit.
    Muchas gracias

    ResponderEliminar