


                        -+-| DisidentS Hack Journal #3 |-+-






  _______________________________________________________________________
 |                                                                       |
 |  -- Titulo_____: Programacion en C en modo grafico [006.txt]          |
 |  -- Autor______: Erich Crdoba                                        |
 |  -- E-Mail_____: <ecordobam@hotmail.com>                              |
 |  -- Team_______: DisidentS Espaa -  http://www.disidents.int-ltd.com |
 |  -- KB_________: 12.6 + source 10.9 /005/minimal.cpp                  |
 |  -- Tema_______: Artesania                                            |
 |_______________________________________________________________________|



.==========================================================================.
|===========~ INDICE ~======================================================
|===========================================================================
|=~ 001 - Introduccion                                                     |
|=~ 002 - Librerias wxwindows                                              |
|=~ 003 - Instalacion de las librerias                                     |
|=~ 004 - Analizando codigo                                                |
|=~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~=.
======================================================~ INDICE ~============
============================================================================





.==========================================================================.
|===========~ 001 - Introduccion ~==========================================
|===========================================================================


Que tal ,  como estan???  Me encontraba  leyendo el numero anterior de  esta
revista y v  un  articulo  sobre  programacion en C,  en  el se  veian  las
instrucciones  basicas  y  algunas  otra  cosas.  Este  articulo  es   sobre
programacion en C en modo grafico (windows, X, etc...)  donde saltaremos por
alto  todas las  instrucciones  basicas y  pasaremos  directamente  a  crear
ventanas y botones de Windows.





.==========================================================================.
|===========~ 002 - Librerias wxwindows ~===================================
|===========================================================================

Crear ventanas en windows no es nada sencillo  pero gracias a unas librerias
llamadas wxWindows (www.wxwindows.org) este trabajo se facilita.
WxWindows es un proyecto  creado por varios  programadores que a mi  parecer
tenan muy poco que hacer :-) Dentro de estas librerias las ventanas botones
y todas las chucherias que ven en windows ya existen,son objetos que podemos
manipular a nuestro antojo.

Por ejemplo, existe el objeto ventana, al  que simplemente  le  tenemos  que
decir al compilador de que tamao la queremos y donde queremos que se coloce
a la hora de ejecutarlo. Es como  si hicieramos  formas en Visual Basic nada
mas que aqui no podemos  arrastrar los  controles  y pegarlos donde queremos
que esten , si no que aqui por medio de  comandos ponemos  los controles....
esto lo explicare mas adelante.





.==========================================================================.
|===========~ 003 - Instalacion de las librerias ~==========================
|===========================================================================

Por lo mientras vamos a ver como se instalan estas librerias... para empezar
hay que descargarlas de www.wxwindows.org, la  instalacion solo requiere  un
poquito de sentido comun y ya esta.... ahora necesitamos un compilador de C,
a mi me gusta usar el Gcc (www.cygwin.com) que se encuentra en  un  emulador
de unix para windows  llamado Cygwin...  la instalacion de este  tampoco  es
complicada,  con  la  diferencia  que  hay  que  cambiar  unas  lineas   del
autoexec.bat para que funciones bien:

La linea que dice SET PATH=c:\windows\command;c:\windows

agregarle c:\cygwin\bin

donde quedaria SET PATH=c:\windows\command;c:\windows;c:\cygwin\bin

Ya hecho esto tenemos que reiniciar windows como es costumbre....

Ahora tenemos que hacer otro movimiento... en el path
c:\cygwin\usr\include\w32api\ hay un archivo llamado Basetsd.h al que
le

Tenemos que cambiar la linea 8 del mismo ... de int a long , es  simplemente
reemplazar eso... ahora pongase comodo porque viene  lo  lento y  tardado de
esto, para que estas librerias funcionen tenemos que compilarlas  primero...
en el path c:\wx2\src\msw\ vamos a tipear:

make -f Makefile.g95



Y se empiezan a compilar estas librerias... esto tarda un poco,  dependiendo
de la mquina en la que est trabajando...

Ya compiladas las librerias ya podemos hacer uso de ellas... Existen  varios
ejemplos ya hechos y listos para compilar para ver como funcionan,  usaremos
la aplicacin mnima que se puede hacer en wx2.

En c:\wx2\samples\ se encuentran todos los ejemplos de wx2,ah encontraremos
una carpeta llamada minimal. En ella y desde la linea de comando  de  Ms-Dos
vamos a tipear make -f makefile.g95, empezara  a  trabajar y cuando  termine
tipeamoa desde la linea de comandos: minimal para ejecutar aplicacin recien
compilada.






.==========================================================================.
|===========~ 004 - Analizando codigo ~=====================================
|===========================================================================

Lo que sale es una simple  ventana con dos menues y y.... vamos a  analizar
el cdigo de esta aplicacin para entender como es que funciona. En
c:\wx2\samples\minimal\  vamos  a abrir  (ya sea con  el  edit o el  Vi ) el
archivo minimal.cpp :


#ifdef__GNUG__
        #pragma implementation ?minimal.cpp?
        #pragma interface ?minimal.cpp?
#endif
#include ?wx/wxprec.h?
#ifdef __BORLANDC__
        #pragma hdrstop
#endif
#ifdef WX_PRECOMP
        #include ?wx/wx.h?
#endif

/*hasta todo esto tiene que ir obligatoriamente, checa sobre que  plataforma
esta trabajando.../*

class Myapp : public wxApp //se crea una clase llamada Myapp de tipo publica
{
        public :
                virtual bool OnInit();
};
//hasta aqui hemos creado la aplicacin
class MyFrame : public wxFrame
{
        public :
                MyFrame (const wxString & title, const wxPoint & pos, wxSize
                         & size);
                void OnQuit (wxCommandEvent & event);
                void OnAbout(wxCommandEvent & event);
        private :
                DECLARE_EVENT_TABLE()
};

/*hemos creado otra clase, esta se llama MyFrame y es del tipo  wxFrame,  en
ella se deben poner las funciones que va a llevar la aplicacin,en este caso
hay dos funciones OnQuit y OnAbout*/

enum
{
        minimal_quit=1, minimal_about
};

/*es necesario  enumerar cada  una  de  las  funciones y ponerle  un  nombre
 distintivo, mas adelante sabran porque*/

BEGIN_EVENT_TABLE (MyFrame, wxFrame)
        EVT_MENU(minimal_quit, MyFrame::OnQuit)
        EVT_MENU(minimal_about, MyFrame::OnAbout)
END_EVENT_TABLE()

/*Esta es una de las partes interesante de este programa,esta es la tabla de
 eventos,  en  ella se  ingresan  todos los  eventos que vamos a tener en la
aplicacin, por ejemplo : si damos click en un  menu llamar a  una  funcion.
Para eso sirve la tabla de eventos .  En la segunda y  tercera linea de esta
tabla podemos ver que el nombre distintivo que le  pusimos a cada  funcion y
que al  mismo  tiempo  enumeramos,  (en el enum)  tiene correspondida  a una
funcion, al minimal_quit,le corresponde la funcion OnQuit que esta en dentro
 de la clase MyFrame (MyFrame::OnQuit), y as mismo con el minimal_about.*/

bool Myapp::OnInit()
{
        MyFrame *frm;
        frm=new MyFrame(?Ejemplo?, wxPoint(100, 100), wxSize (300, 300));
        frm->show (true);
        return TRUE;
}
/* Ahora si,ya estamos en lo interesante de este relajo.. si se acuerdan hay
 una clase que se llama Myapp y dentro de esa clase declaramos una   funcion
 OnInit, ah nada mas se dijo que la funcion OnInit existia,pero se dijo que
 es lo que iba a hacer esa funcin... aqui es donde decimos que es lo que va
 a hacer esa funcin... en primer lugar creamos un puntero, un puntero es un
 espacio de memoria del tamao que nosotro indiquemos, en este caso  es  del
 tamao de un MyFrame...  y que  es  un  MyFrame??? una  ventana... en pocas
 palabras, frm es un puntero del tipo ventana. En la siguiente linea se dice
 que frm es igual a una nueva ventana (frm=new MyFrame(?Ejemplo?,wxPoint
 (100, 100), wxSize (300, 300));)  con el  titulo de ventana ? Ejemplo?,  al
 ejecutarse se va a colocar en la posicin 100,  100 de  la pantalla  y  que
 tiene un tamao de 300 x 300 px ... en la siguiente linea se destaca una de
 las  muchas propiedades  que tienen los  objetos  dentro de  wxWindows  las
 ventanas tienen la propiedad show,osea mostrarse... simplemente dice que se
 muestre la ventana....*/

MyFrame::MyFrame (const wxString & title, const wxPoint & pos, const
wxSize
& size)
        : wxFrame ((wxFrame*)NULL, 1, title, pos, size)
{
        wxMenu *menufile = new wxMenu(??, wxMENU_TEAROFF);
        wxMenu *helpmenu = new wxMenu;
        helpmenu->Append(Minimal_About, "&About...\tCtrl-A", "Show about
dialog");
        menuFile->Append(Minimal_Quit, "E&xit\tAlt-X", "Quit this program");
        wxMenuBar *menuBar = new wxMenuBar();
        menuBar->Append(menuFile, "&File");
        menuBar->Append(helpMenu, "&Help");
        SetMenuBar(menuBar);
        #if wxUSE_STATUSBAR
                CreateStatusBar(2);
                SetStatusText("Welcome to wxWindows!");
        #endif
}

/*En esta parte comenzamos a ordenar los elementos que contiene  la  ventana
 llamada MyFrame de tipo wxframe, al principio se crean dos apuntadores  que
 van a ser los menes de la ventana.Despus se indican los elementos de cada
 men. Por ejemplo la tercera linea :

helpmenu->Append(Minimal_About, "&About...\tCtrl-A", "Show about
dialog");

Minimal_About se refiere a la funcin a la  que  v a llamar algn evento en
la ventana, si damos click en el helpmenu y damos click en about lo que va a
hacer es ver en la tabla de eventos cual es la funcin que le corresponde  a
ese evento.

"&About...\tCtrl-A" Se refiere a la etiqueta de esta opcin,  el  label  por
decirlo as.... "Show about dialog" Es lo que  va a   poner en  la barra  de
estado de la ventana al pasar  el ratn sobre esta opcin. Lo mismo es en la
siguiente linea.

Despus se le pone nombre a cada men y da  de alta a la  barra de men. Por
ltimo, si el sistema operativo soporta en sus ventanas una barra de  estado
entonces la dar de alta con el texto Welcome to wxWindows! */

void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
{
        Close(TRUE);
}

void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
{
        wxString msg;
        msg.Printf( _T("This is the about dialog of minimal sample.\n")
                          _T("Welcome to %s"), wxVERSION_STRING);
        wxMessageBox(msg, "About Minimal", wxOK | wxICON_INFORMATION, this);
}

/* Si se acuerdan, en la clase MyFrame creamos dos funciones, mejor dicho le
dijimos al compilador que estas funciones existen... en esta parte es  donde
decimos que es lo que va a  hacer  cada funcin.  En  esta  aplicacin  slo
existen dos eventos, el clic en el menu de File y en el de help. La  primera
funcion que se  v aqui es OnQuit y dentro de   sus acciones solo est la de
cerrar el programa.  La segunda funcin es un poco ms interesante,  OnAbout
.En wxWindows ya  existen las  cademas  como  tales,  no  es  como  en  el C
tradicional que tenemos que hacer un arreglo de caracteres y especificar  de
cuantas letras es...aqui ya no, ya existe el tipo WxString. Aqui creamos una
cadena llamada msg. Dentro de esa cadena, va a escribir (msg.Printf)   "This
is the about dialog of minimal sample.\n" "Welcome to %s", que despus lo va
a poner en una caja de mensaje del tipo wxMessageBox */

Al principio puede parecer extrao este tipo de programacin,  pero  con  la
prctica vern que resulta  ser  bastante  sencillo. Junto con este texto he
puesto una aplicacin diferente a las que trae wxWindows como ejemplo.
Si quieres compilar esa aplicacin, lo que deben hacer es lo siguiente:

1 Crear una carpeta con el nombre que quieran en c:\wx2\samples
2 El contenido de la carpeta c:\wx2\samples\minimal copiarlo a  la  carpeta
   que acaban de crear pegar el archivo que les mando a esa carpeta.


 Espero que este texto les sirva de algo :-)
       
                                -e0f-
