m (→Introducción de una barra de menús) |
|||
| (No se muestran 4 ediciones intermedias realizadas por 3 usuarios) | |||
| Línea 1: | Línea 1: | ||
== Introducción == | == Introducción == | ||
| − | En este capítulo vamos a | + | En este capítulo vamos a aprender a crear una ventana, y con ello empezaremos a trazar un protocolo sobre la creación de diálogos y "canvas", que iremos puliendo en los siguientes capítulos. |
== Creación de nuestra primera ventana == | == Creación de nuestra primera ventana == | ||
| Línea 12: | Línea 12: | ||
* Plan de trabajo del capítulo 2: <br>En este capítulo nos conformaremos con poco, simplemente crearemos una ventana con el título "Welcome to wxWidgets!" (como en los ejemplos de wxWidgets, nada original), la cual tendrá una barra de menús con el menu file/exit. El uso del menu lo dejaremos para un capítulo posterior, que no es bueno forzar... | * Plan de trabajo del capítulo 2: <br>En este capítulo nos conformaremos con poco, simplemente crearemos una ventana con el título "Welcome to wxWidgets!" (como en los ejemplos de wxWidgets, nada original), la cual tendrá una barra de menús con el menu file/exit. El uso del menu lo dejaremos para un capítulo posterior, que no es bueno forzar... | ||
| − | Asi que al turrón, la ventana que vamos a insertar es un tanto especial, y no es la que usaremos habitualmente, se trata de wxFrame (en el resto de ocasiones usaremos wxDialog, y en su día entenderemos la diferencia, aunque podeís encontrarla en la | + | Asi que al turrón, la ventana que vamos a insertar es un tanto especial, y no es la que usaremos habitualmente, se trata de wxFrame (en el resto de ocasiones usaremos wxDialog, y en su día entenderemos la diferencia, aunque podeís encontrarla en la [http://docs.wxwidgets.org/2.8/wx_wxframe.html#wxframe documentacion] de la [http://docs.wxwidgets.org/stable/ página oficial] buscando en el apartado Classes by category). |
| + | También podemos verla en nuestro wx.chm (ver el capítulo anterior), y en la pestaña índice buscamos wxFrame. | ||
=== Breves anotaciones sobre la documentacion: === | === Breves anotaciones sobre la documentacion: === | ||
| Línea 29: | Línea 30: | ||
Asi que por dicho, vamos a crear nuestra clase, para ello vamos a Code::Blocks y creamos dos archivos, "topframe.cpp" y "topframe.h". (Por supuesto, todo lo que se encuentre en un tutorial anterior no se repite) | Asi que por dicho, vamos a crear nuestra clase, para ello vamos a Code::Blocks y creamos dos archivos, "topframe.cpp" y "topframe.h". (Por supuesto, todo lo que se encuentre en un tutorial anterior no se repite) | ||
| − | Como es lógico, empezaremos por la cabecera, asi que abrimos "topframe.h" | + | Como es lógico, empezaremos por la cabecera, asi que abrimos "topframe.h", y creamos nuestra clase: |
<pre> | <pre> | ||
| + | #ifndef TOPFRAME_H_INCLUDED | ||
| + | #define TOPFRAME_H_INCLUDED | ||
| + | |||
class TopFrame : public wxFrame | class TopFrame : public wxFrame | ||
{ | { | ||
| + | |||
}; | }; | ||
| + | |||
| + | #endif // TOPFRAME_H_INCLUDED | ||
</pre> | </pre> | ||
| Línea 188: | Línea 195: | ||
== Introducción de una barra de menús == | == Introducción de una barra de menús == | ||
| − | Para poner la guinda al pastel, vamos a añadir la barra de menús, que nos servirá en el próximo capítulo... | + | Para poner la guinda al pastel, vamos a añadir la barra de menús, que aun que ahora no haga nada ya que no tiene ningún evento asociado, nos servirá en el próximo capítulo... |
Para ello vamos hasta el constructor de TopFrame en "topframe.cpp", y añadimos las siguientes órdenes...**Recordar, toda esta informacion la teneis en la documentación** | Para ello vamos hasta el constructor de TopFrame en "topframe.cpp", y añadimos las siguientes órdenes...**Recordar, toda esta informacion la teneis en la documentación** | ||
| Línea 278: | Línea 285: | ||
//no delete!!! it's implement in destroy(); | //no delete!!! it's implement in destroy(); | ||
} | } | ||
| − | + | </pre> | |
topframe.h: | topframe.h: | ||
| + | <pre> | ||
class TopFrame : public wxFrame | class TopFrame : public wxFrame | ||
| Línea 319: | Línea 327: | ||
| style="text-align: center; border: 2px solid #8B673A; background-color: #F0E2C6; -moz-border-radius: 8px; margin: 10 10 10 10; padding: 5px; font-weight: bold;" | [[Capítulo 3: ¡Qué aburrido! yo quiero interactuar]] | | style="text-align: center; border: 2px solid #8B673A; background-color: #F0E2C6; -moz-border-radius: 8px; margin: 10 10 10 10; padding: 5px; font-weight: bold;" | [[Capítulo 3: ¡Qué aburrido! yo quiero interactuar]] | ||
|} | |} | ||
| + | |||
| + | <!-- Categoría --> | ||
| + | [[Categoría:Programación]] | ||
Contenido |
En este capítulo vamos a aprender a crear una ventana, y con ello empezaremos a trazar un protocolo sobre la creación de diálogos y "canvas", que iremos puliendo en los siguientes capítulos.
El primer paso sera recuperar el trabajo donde lo dejamos, esto se puede hacer de dos formas, abriendo code::blocks, el cual nos mostrará los proyectos más recientes, o directamente desde la carpeta /home/user/proyectos_codeblocks/learn_0.01, haciendo dobleclick sobre learn_0.01.cbp.
Realmente, la forma más purista sería crear un nuevo proyecto, copiar todos los fuentes y los headers del antiguo, e importarlos, pero eso sólo cuando vayamos a lanzar una versión de verdad.
Pero sigamos a lo nuestro... Una vez recuperado nuestro trabajo, sin duda ninguna tendremos que trazarnos un plan de trabajo:
Asi que al turrón, la ventana que vamos a insertar es un tanto especial, y no es la que usaremos habitualmente, se trata de wxFrame (en el resto de ocasiones usaremos wxDialog, y en su día entenderemos la diferencia, aunque podeís encontrarla en la documentacion de la página oficial buscando en el apartado Classes by category). También podemos verla en nuestro wx.chm (ver el capítulo anterior), y en la pestaña índice buscamos wxFrame.
Siempre que busquemos cualquier elemento, nos apareceran en este orden las siguientes cosas:
Bueno, Ahora que ya tenemos localizado el elemento a introducir, aparquemos momentaneamente esa información, ya que antes debemos darle un nombre, ¡"TopFrame" será una buena alternativa!
Asi que por dicho, vamos a crear nuestra clase, para ello vamos a Code::Blocks y creamos dos archivos, "topframe.cpp" y "topframe.h". (Por supuesto, todo lo que se encuentre en un tutorial anterior no se repite)
Como es lógico, empezaremos por la cabecera, asi que abrimos "topframe.h", y creamos nuestra clase:
#ifndef TOPFRAME_H_INCLUDED
#define TOPFRAME_H_INCLUDED
class TopFrame : public wxFrame
{
};
#endif // TOPFRAME_H_INCLUDED
Efectivamente, declaramos una clase llamada TopFrame, que hereda todas las propiedades de wxFrame. Ahora nos disponemos a crear el constructor, éste constructor debe recibir todos los parametros que pudieran ser necesarios para wxFrame, asi que recuperamos nuestra documentación, y buscamos el constructor de wxFrame (wxFrame::wxFrame). Solo tiene un posible constructor, así que no hay mucho donde elegir (para los que el tema de las clases no les sea familiar, simplemente, que no se estressen, lo irán entendiendo poco a poco), así que analizemos los parametros que debe recibir:
Así que nada, ya lo tenemos clarísimo, nuestra wxFrame tan sólo solicita de TopFrame el título de la ventana, y como nuestro TopFrame no requiere datos adicionales (de momento), este será el único parámetro que solicitará, así que añadamos nuestro constructor a la clase:
class TopFrame : public wxFrame
{
public:
TopFrame(wxString Title);
};
El constructor siempre será una clase pública, pues se tiene que poder acceder a él.
De momento nuestro TopFrame no tendrá nada más, así que cambiémonos a "topframe.cpp" para implementar el constructor. Evidentemente, lo primero que querremos en "topframe.cpp" serán las cabeceras (las estandar de C, las de wxWidgets, y la cabecera que acabamos de crear), así que nuestras primeras lineas serán:
#include <math.h> #include <stdio.h> #include <wx/wx.h> #include <wx/string.h> #include "topframe.h"
Fijaos que he añadido la libreria wx/string.h, probar a no añadirla, vereís que pronto os dice que wxString no esta definida.
Y ahora a implementar el constructor, así que nuestras siguientes líneas serán:
TopFrame::TopFrame(wxString Title)
{
}
Donde efectivamente creamos el constructor de TopFrame, que debe recibir el parámetro Title, de tipo wxString, pero hace falta implementarle la clase heredada, así que a continuación, o debajo (como hago yo) introducimos la siguiente línea:
TopFrame::TopFrame(wxString Title)
: wxFrame(NULL, wxID_ANY, Title)
{
}
Donde a wxFrame, como parent, le pasamos NULL, como id le pasamos wxID_ANY, y como título le pasamos el título que ha recibido TopFrame, llamado Title. ¿Empezais a verle el truquillo?
Claro, eso requiere que cada vez que haya que llamar a TopFrame (en este caso no hay problema, pues sólo lo haremos una vez) haya que pasarle el título, pero ¿no sería mas lógico que ya tuviera un título preasignado? Pues sí, lo sería, así que volvamos a "topframe.h", y cambiemos ligeramente el constructor:
class TopFrame : public wxFrame
{
public:
TopFrame(wxString Title = _T("Welcome to wxWidgets") );
};
De esta forma, en caso de omisión de este parámetro, asumirá que queríamos pasarle _T("Welcome to wxWidgets").
Esta última línea puede no ser correcta, os recomiendo buscar en la documentación
Bueno, ya tenemos la clase completa, vamos a llamarala desde nuestro main, así que abrimos "main.cpp", y una vez allí lo primero que necesitaremos serán las nuevas cabeceras (la de wxString y la de Topframe), así que los includes ahora quedarán así:
#include <math.h> #include <stdio.h> #include <wx/wx.h> #include <wx/string.h> #include "topframe.h" #include "main.h"
En fin, continuemos... El siguiente paso lógico es declarar una TopFrame para nuestro programa, así que añadimos la siguiente línea al código:
IMPLEMENT_APP(SampleApp)
bool SampleApp::OnInit()
{
TopFrame *frame;
return true; //true == run the app
//no delete!!! it's implement in destroy();
}
Vereís que jugamos muchas veces con la declaración de los tipos: TopFrame *frame; TopFrame frame;
La más interesante es la primera, pero requiere más operaciones, así que cuando podamos optaremos por la segunda.
El siguiente paso es llamar al constructor:
IMPLEMENT_APP(SampleApp)
bool SampleApp::OnInit()
{
TopFrame *frame;
//frame = new TopFrame();
frame = new TopFrame(_T("Welcome to wxWidgets!"));
return true; //true == run the app
//no delete!!! it's implement in destroy();
}
Como puedes ver pongo dos constructores diferentes, uno de ellos comentado, si descomentas el primero, y comentas el segundo (cuando hayamos acabado) verás que el título de la ventana pasa de ser "Welcome to wxWidgets!" a ser "Welcome to wxWidgets", que era el que pusimos por defecto.
Bueno, si probaras a compilar ahora, y a ejecutar, el código haría lo mismo que antes, solo que encima ahora nunca se cerraría, y habría que cerrarlo o por Code::Blocks, o por el administrador de procesos. Así que falta una orden para que nos muestre la ventana, como ya hemos dicho, wxFrame es una clase un poquito especial, así que quedaos con que la siguiente orden funciona, aunque no la veais en su documentación, porque la tiene heredada.
IMPLEMENT_APP(SampleApp)
bool SampleApp::OnInit()
{
TopFrame *frame;
//frame = new TopFrame();
frame = new TopFrame(_T("Welcome to wxWidgets!"));
frame->Show(true); //show the frame of application
return true; //true == run the app
//no delete!!! it's implement in destroy();
}
Y por último, por juguetear un poco, vamos a maximizar:
IMPLEMENT_APP(SampleApp)
bool SampleApp::OnInit()
{
TopFrame *frame;
//frame = new TopFrame();
frame = new TopFrame(_T("Welcome to wxWidgets!"));
frame->Show(true); //show the frame of application
frame->Maximize(); //maximize the frame of application
return true; //true == run the app
//no delete!!! it's implement in destroy();
}
Prueba a compilar y a ejecutar, y a ver que ocurre... ¡¡¡Éxito!!! Aquí tenemos nuestra ventana maximizada dándonos la bienvenida.
Para poner la guinda al pastel, vamos a añadir la barra de menús, que aun que ahora no haga nada ya que no tiene ningún evento asociado, nos servirá en el próximo capítulo...
Para ello vamos hasta el constructor de TopFrame en "topframe.cpp", y añadimos las siguientes órdenes...**Recordar, toda esta informacion la teneis en la documentación**
TopFrame::TopFrame(wxString Title)
: wxFrame(NULL, wxID_ANY, Title)
{
//creamos un menu muy simple
wxMenu *fileMenu = new wxMenu;
}
TopFrame::TopFrame(wxString Title)
: wxFrame(NULL, wxID_ANY, Title)
{
//creamos un menu muy simple
wxMenu *fileMenu = new wxMenu;
fileMenu->Append(wxID_EXIT, _T("&Exit\tAlt-F4"), _T("Termina el programa"));
}
wxID_EXIT es un ID que ya conoce wxWidgets, normalmente tendremos que crear nosotros nuestros ID, que lo haremos en el siguiente capítulo...
TopFrame::TopFrame(wxString Title)
: wxFrame(NULL, wxID_ANY, Title)
{
//creamos un menu muy simple
wxMenu *fileMenu = new wxMenu;
fileMenu->Append(wxID_EXIT, _T("&Exit\tAlt-F4"), _T("Termina el programa"));
wxMenuBar *menuBar = new wxMenuBar();
}
Esta es otra forma muy típica de actuár, realizar la declaración y la construcción en la misma línea.
TopFrame::TopFrame(wxString Title)
: wxFrame(NULL, wxID_ANY, Title)
{
//creamos un menu muy simple
wxMenu *fileMenu = new wxMenu;
fileMenu->Append(wxID_EXIT, _T("&Exit\tAlt-F4"), _T("Termina el programa"));
wxMenuBar *menuBar = new wxMenuBar();
menuBar->Append(fileMenu, _T("&File"));
SetMenuBar(menuBar);
}
Finalmente nuestros archivos quedan de la forma:
main.h:
class SampleApp : public wxApp
{
public:
virtual bool OnInit();
};
main.cpp:
#include <math.h>
#include <stdio.h>
#include <wx/wx.h>
#include <wx/string.h>
#include "topframe.h"
#include "main.h"
/**********************************************************************/
/************** This function run the application *************/
/************** can force some parameters too (p.ej size) *************/
/**********************************************************************/
IMPLEMENT_APP(SampleApp)
bool SampleApp::OnInit()
{
TopFrame *frame;
//frame = new TopFrame();
frame = new TopFrame(_T("Welcome to wxWidgets!"));
frame->Show(true); //show the frame of application
frame->Maximize(); //maximize the frame of application
return true; //true == run the app
//no delete!!! it's implement in destroy();
}
topframe.h:
class TopFrame : public wxFrame
{
public:
TopFrame(wxString Title = _T("Welcome to wxWidgets"));
};
topframe.cpp:
#include <math.h>
#include <stdio.h>
#include <wx/wx.h>
#include <wx/string.h>
#include "topframe.h"
TopFrame::TopFrame(wxString Title)
: wxFrame(NULL, wxID_ANY, Title)
{
//creamos un menu muy simple
wxMenu *fileMenu = new wxMenu;
fileMenu->Append(wxID_EXIT, _T("&Exit\tAlt-F4"), _T("Termina el programa"));
wxMenuBar *menuBar = new wxMenuBar();
menuBar->Append(fileMenu, _T("&File"));
SetMenuBar(menuBar);
}
Compila y ejecuta... Verás que ha aparecido el menú, pero que no hace nada, así que... ¿Qué toca hacer ahora? Efectivamente, ¡empezar a manejarlo! Pero eso será en el siguiente capítulo...
| Capítulo 1.- ¡Mama! ¡Mama! mira lo que hago... | Nuestra primera interfaz gráfica con CodeBlocks y wxWidgets | Capítulo 3: ¡Qué aburrido! yo quiero interactuar |