<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="gl">
	<id>http://web.iesrodeira.com/mediawiki/index.php?action=history&amp;feed=atom&amp;title=Programaci%C3%B3n_de_GUI_en_C</id>
	<title>Programación de GUI en C - Historial de revisións</title>
	<link rel="self" type="application/atom+xml" href="http://web.iesrodeira.com/mediawiki/index.php?action=history&amp;feed=atom&amp;title=Programaci%C3%B3n_de_GUI_en_C"/>
	<link rel="alternate" type="text/html" href="http://web.iesrodeira.com/mediawiki/index.php?title=Programaci%C3%B3n_de_GUI_en_C&amp;action=history"/>
	<updated>2026-09-13T14:32:10Z</updated>
	<subtitle>Historial de revisións desta páxina no wiki</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>http://web.iesrodeira.com/mediawiki/index.php?title=Programaci%C3%B3n_de_GUI_en_C&amp;diff=1857&amp;oldid=prev</id>
		<title>Xavi: Nova páxina: &quot;= Programación Orientada a Eventos = Para facer programas que funcionen en entornos de ventanas normalmente se recurre á programación orientada a eventos ou sucesos. Este tipo ...&quot;</title>
		<link rel="alternate" type="text/html" href="http://web.iesrodeira.com/mediawiki/index.php?title=Programaci%C3%B3n_de_GUI_en_C&amp;diff=1857&amp;oldid=prev"/>
		<updated>2014-06-26T10:00:58Z</updated>

		<summary type="html">&lt;p&gt;Nova páxina: &amp;quot;= Programación Orientada a Eventos = Para facer programas que funcionen en entornos de ventanas normalmente se recurre á programación orientada a eventos ou sucesos. Este tipo ...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Páxina nova&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= Programación Orientada a Eventos =&lt;br /&gt;
Para facer programas que funcionen en entornos de ventanas normalmente se recurre á programación orientada a eventos ou sucesos. Este tipo de programación consiste en construir o interface de usuario e esperar unha interacción co mesmo (un evento), cando esa interacción se produce se executa a función que se encargará de tratar o evento.&lt;br /&gt;
&lt;br /&gt;
Na programación orientada a eventos os programas son prácticamente un conxunto de funcións de tratamento de eventos encargadas de facer que a aplicación responda do xeito adecuado ás distintas accións do usuario.&lt;br /&gt;
&lt;br /&gt;
O comentido dos programas que funcionan en entornos orientados a eventos é  recoller a acción do usuario (evento) e executar a función de tratamento correspondente mentras non se reciba o evento de finalización de programa.&lt;br /&gt;
&lt;br /&gt;
== O sistema Windows ==&lt;br /&gt;
[[Image:WindowsXP.gif|left|thumb|Microsoft Windows XP]]&lt;br /&gt;
&lt;br /&gt;
O entorno orientado a eventos máis coñecido é Microsoft Windows. Este entorno ten o sistema gráfico de ventanas incluído no núcleo do sistema operativo (forma parte do propio sistema operativo) e proporciona ás aplicacións unha API de programación coñecida como &amp;#039;&amp;#039;&amp;#039;WinAPI&amp;#039;&amp;#039;&amp;#039; para crear os distintos obxectos gráficos, instalar as funcións de tratamento de eventos ... etc.&lt;br /&gt;
Hoxe en día non se emplea esta API directamente para crear as interfaces de usuario, se non que se utilizan sistemas de desenvolvemento rápido de aplicacións (RAD) e visuais, como pode ser &amp;#039;&amp;#039;Visual C++&amp;#039;&amp;#039; ou &amp;#039;&amp;#039;Borland C++&amp;#039;&amp;#039; que empregan librerías de maior nivel. Como veremos existen algunhas librerías das comúnmente utilizadas no mundo Unix, como &amp;#039;&amp;#039;Qt&amp;#039;&amp;#039;, &amp;#039;&amp;#039;GTK+&amp;#039;&amp;#039; ou &amp;#039;&amp;#039;wxwidgets&amp;#039;&amp;#039; que teñen unha versión para Windows, o que nos permitirá facer programas portables entre os dous sistemas.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== O sistema X-Window ==&lt;br /&gt;
[[Image:motif.jpg|left|thumb|Xestor de Ventanas Motif]]&lt;br /&gt;
&lt;br /&gt;
O sistema XWindow é o entorno de ventanas tradicional nos sistemas Unix. É unha aplicación que funciona en modo usuario (é unha aplicación máis que funciona por enriba do sistema operativo) e a súa característica máis salientable é que sigue o esquema &amp;#039;&amp;#039;&amp;#039;cliente/servidor&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
[[Image:olwm.gif|right|thumb|Xestor de Ventanas OpenLook]]&lt;br /&gt;
&lt;br /&gt;
No entorno XWindow as aplicacións son programas &amp;#039;&amp;#039;cliente&amp;#039;&amp;#039; que lle solicitan ó servidor (o sistema X-Window) que realice as distintas operacións sobre a pantalla (debuxar unha ventana, un botón, ...). Esto permite que a aplicación poda estar executándose nun ordenador remoto e a saída podemos obtela no ordenador local, e incluso dende unha mesma estación de traballo executar aplicacións en distintas máquinas obtendo a saída de todas elas na mesma estación de traballo que está a executar o servidor XWindow.&lt;br /&gt;
&lt;br /&gt;
Tamén ofrece a posibilidade de ter ordenadores con poucos recursos (a partir dun 486 con 32Mb de RAM) como terminal gráfica, e executar os programas nun servidor central, con todo o que implica en canto a aforro en mantemento e inversión en hardware.&lt;br /&gt;
&lt;br /&gt;
[[Image:fluxbox.jpg|left|thumb|Xestor de Ventanas fluxbox]]&lt;br /&gt;
&lt;br /&gt;
A API de programación empregada por XWindow é moito máis complexa que a de Windows sobre todo debido a esta arquitectura cliente/servidor. A comunicación entre os clientes X (os programas) e o servidor X empregan un protocolo chamado &amp;#039;&amp;#039;protocolo X&amp;#039;&amp;#039;, para manexar este protocolo se emprega a librería &amp;#039;&amp;#039;&amp;#039;Xlib&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
[[Image:blackbox.jpg|right|thumb|Xestor de Ventanas blackbox]]&lt;br /&gt;
&lt;br /&gt;
Poderíamos decir que &amp;#039;&amp;#039;Xlib&amp;#039;&amp;#039; é a linguaxe ensamblador de X, xa que proporciona soamente funcións moi simples o que fai a programación difícil e laboriosa. Para solucionar este problema se empregan librerías de maior nivel, como &amp;#039;&amp;#039;Xt Intrinsics&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Normalmente os clientes X non se comunican directamente co servidor X, se non que o fan a través dun &amp;#039;&amp;#039;&amp;#039;Xestor de Ventanas&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
&lt;br /&gt;
O xestor de ventanas encárgase de crear as ventanas (e o resto dos obxectos gráficos) e de xestionar a súa apariencia, mentras que o servidor X encárgase de debuxar. Polo tanto, a apariencia das aplicacións depende do xestor de ventanas que estemos a utilizar.&lt;br /&gt;
&lt;br /&gt;
[[Image:fvwm.gif|left|thumb|Xestor de Ventanas fvwm]]&lt;br /&gt;
&lt;br /&gt;
Os xestores de ventanas normalmente proporcionan tamén unhas librerías que nos facilitan enormemente o traballo de escribir aplicacións. Entre os xestores de ventanas máis coñecidos (por ser os primeiros) atópanse OpenLook (olwm) e Motif (mwm).&lt;br /&gt;
&lt;br /&gt;
En Unix existe unha gran variedade de xestores de ventanas, con consumo de recursos moi variados. Deste xeito teremos xestores que necesitan máquinas con moita memoria e potencia e xestores que necesitan moi pouco.&lt;br /&gt;
&lt;br /&gt;
[[Image:afterstep.jpg|right|thumb|Xestor de Ventanas AfterStep]]&lt;br /&gt;
&lt;br /&gt;
Hoxe en día a tendencia é utilizar unha terceira capa no acceso ó servidor X: O &amp;#039;&amp;#039;entorno de escritorio&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
O servidor de ventanas encárgase do aspecto e creación das ventanas, e o entorno de escritorio trata de unificar e comunicar entre sí as distintas aplicacións que están a utilizar o servidor X, facilitando cousas como o &amp;#039;&amp;#039;cortar e pegar&amp;#039;&amp;#039; ou o uso dunhas aplicacións por parte de outras. Unha das facilidades aportadas polos xestores de escritorio é, por exemplo, a posibilidade de colocar iconas para lanzar as aplicacións en calquera posición da pantalla (agora denominada &amp;#039;&amp;#039;escritorio&amp;#039;&amp;#039;).&lt;br /&gt;
&lt;br /&gt;
[[Image:kde.png|left|thumb|Escritorio KDE]]&lt;br /&gt;
&lt;br /&gt;
Os entornos de escritorio precisan de moitos máis recursos que un simple xestor de ventanas, (aínda que algúns son bastante modestos en canto a consumo de memoria e procesador), o que fai que en máquinas con pouca memoria ou procesadores lentos sexa moito mellor executar únicamente un xestor de ventanas.&lt;br /&gt;
&lt;br /&gt;
Os entornos de escritorio máis comúnmente utilizados son &amp;#039;&amp;#039;&amp;#039;KDE&amp;#039;&amp;#039;&amp;#039; e &amp;#039;&amp;#039;&amp;#039;Gnome&amp;#039;&amp;#039;&amp;#039;. Ambos se atopan nunha etapa de acelerado desenvolvemento, incorporando contínuamente novas características.&lt;br /&gt;
&lt;br /&gt;
[[Image:gnome.jpg|right|thumb|Escritorio Gnome]]&lt;br /&gt;
&lt;br /&gt;
As librerías empregadas por estos entornos de escritorio proporcionan ás aplicacións un xeito moi rápido e simple de crear entornos de usuario, o que nos permite olvidarnos completamente de &amp;#039;&amp;#039;Xlib&amp;#039;&amp;#039; ou &amp;#039;&amp;#039;Xt Intrinsics&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
[[Image:cde.jpg|left|thumb|Escritorio CDE]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;KDE&amp;#039;&amp;#039;&amp;#039; emprega a librería &amp;#039;&amp;#039;&amp;#039;Qt&amp;#039;&amp;#039;&amp;#039; escrita en &amp;#039;&amp;#039;&amp;#039;C++&amp;#039;&amp;#039;&amp;#039; o que implica o uso necesariamente de &amp;#039;&amp;#039;C++&amp;#039;&amp;#039; cando se escriben aplicacións Qt.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Gnome&amp;#039;&amp;#039;&amp;#039; emprega a librería &amp;#039;&amp;#039;&amp;#039;GTK+&amp;#039;&amp;#039;&amp;#039;. Esta librería está escrita en &amp;#039;&amp;#039;C&amp;#039;&amp;#039; utilizando técnicas de orientación a obxecto, o que implica que se pode programar en C. &amp;#039;&amp;#039;GTK+&amp;#039;&amp;#039; ofrece ademáis a posibilidade de programar en moitas outras linguaxes de programación.&lt;br /&gt;
&lt;br /&gt;
[[Image:xfce.jpg|right|thumb|Escritorio Xfce]]&lt;br /&gt;
&lt;br /&gt;
Ambas librerías teñen una versión que funciona en Microsoft Windows, o que proporciona ademáis a posibilidade de compilar sen apenas cambios as aplicacións para o seu funcionamento en entorno Unix ou Windows.&lt;br /&gt;
&lt;br /&gt;
Outros entornos de escritorio coñecidos e cunhas necesidades de procesador e memoria máis pequenas son &amp;#039;&amp;#039;CDE&amp;#039;&amp;#039; e, sobre todo &amp;#039;&amp;#039;xfce&amp;#039;&amp;#039;. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Xfce&amp;#039;&amp;#039;&amp;#039; é un entorno de escritorio (en realidade é casi máis un entorno de ventanas) feito coa librería GTK+ extremadamente lixeiro e cun aspecto gráfico bastante notable.&lt;br /&gt;
&lt;br /&gt;
= Programación Visual =&lt;br /&gt;
A programación en entornos de ventanas orientados a eventos pode facerse do xeito tradicional, cun editor de textos e escribindo as chamadas ó [[gal:API|API]] do sistema para crear os distintos obxectos gráficos (ventanas, botóns, listas de texto, debuxos ...), pero hoxe en día se utilizan ferramentas RAD (&amp;#039;&amp;#039;Rapid Application Development&amp;#039;&amp;#039;) para o desenvolvemento rápido de aplicacións.&lt;br /&gt;
&lt;br /&gt;
As ferramentas RAD que se utilizan son normalmente entornos IDE (&amp;#039;&amp;#039;Integrated Development Environment&amp;#039;&amp;#039;) de desenvolvemento que integran o editor de textos, o compilador, o depurador e o deseñador de interfaces.&lt;br /&gt;
&lt;br /&gt;
Os deseñadores de interfaces son ferramentas que permiten deseñar o GUI (&amp;#039;&amp;#039;Graphic User Interface&amp;#039;&amp;#039;) do usuario dun xeito &amp;#039;&amp;#039;&amp;#039;visual&amp;#039;&amp;#039;&amp;#039;. Disporemos dunha caixa de ferramentas donde poderemos seleccionar os distintos obxectos que poden formar parte do interface do usuario, e os iremos colocando no interfaz no sitio que consideremos axeitado.&lt;br /&gt;
&lt;br /&gt;
Estes deseñadores permitirán tamén indicar qué funcións se executarán en resposta os distintos eventos que desexamos controlar (pulsación de botóns, movemento do cursor, cambio de tamaño da ventana ... ) e no caso dos IDE incluso escribir as funcións.&lt;br /&gt;
&lt;br /&gt;
As ferramentas RAD máis coñecidas e utilizadas para programar con C son, nos entornos Windows, &amp;#039;&amp;#039;Microsoft Visual Studio C++&amp;#039;&amp;#039; e &amp;#039;&amp;#039;Borland C++ Builder&amp;#039;&amp;#039;, e nos entornos Linux &amp;#039;&amp;#039;KDevelop&amp;#039;&amp;#039;, &amp;#039;&amp;#039;QT Designer&amp;#039;&amp;#039; e &amp;#039;&amp;#039;Glade&amp;#039;&amp;#039;. Tanto &amp;#039;&amp;#039;Glade&amp;#039;&amp;#039; como &amp;#039;&amp;#039;QT Designer&amp;#039;&amp;#039; teñen unha versión que traballa baixo Windows, o que fai posible o desenvolvemento de aplicacións multiplataforma.&lt;br /&gt;
&lt;br /&gt;
== Microsoft Visual C++ e Borland C++ Builder ==&lt;br /&gt;
[[Image:visual.jpg|left|thumb|Microsoft Visual C++: Deseño do GUI]]&lt;br /&gt;
&lt;br /&gt;
O &amp;#039;&amp;#039;Microsoft Visual C++&amp;#039;&amp;#039; englóbase na ferramenta de programación &amp;#039;&amp;#039;Microsoft Visual Studio .NET&amp;#039;&amp;#039; que permite desenvolver programas en outras linguaxes como &amp;#039;&amp;#039;&amp;#039;C#&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;J#&amp;#039;&amp;#039;&amp;#039; ou &amp;#039;&amp;#039;&amp;#039;Visual Basic&amp;#039;&amp;#039;&amp;#039;. Ten integradas todas as utilidades necesarias para realizar aplicacións baixo Windows (editor de texto, depurador, deseñador de interfaces...).&lt;br /&gt;
&lt;br /&gt;
[[Image:visual1.jpg|right|thumb|Microsoft Visual C++: Edición de código]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Visual Studio .NET&amp;#039;&amp;#039; ten asistentes que nos permitirán elexir entre distintos tipos de aplicacións a desenvolver, de xeito que se faga automáticamente a construcción do esqueleto da aplicación.&lt;br /&gt;
&lt;br /&gt;
Este entorno de desenvolvemento é probablemente o máis utilizado baixo Windows, aínda que históricamente os entornos de programación de &amp;#039;&amp;#039;Borland&amp;#039;&amp;#039; sempre gozaran de moita popularidade e unha ben merecida fama.&lt;br /&gt;
&lt;br /&gt;
Hoxe en día o programa RAD de Borland para traballar en C chámase &amp;#039;&amp;#039;Borland C++ Builder&amp;#039;&amp;#039;. A súa orixe está noutra ferramenta para programar en PASCAL chamada &amp;#039;&amp;#039;Delphi&amp;#039;&amp;#039; de gran éxito, e garda gran compatibilidade con ela. &lt;br /&gt;
&lt;br /&gt;
[[Image:borland.jpg|left|thumb|Borland C++ Builder: Deseño do GUI]]&lt;br /&gt;
&lt;br /&gt;
Ten todas as ferramentas integradas nun único programa, e ademáis unha serie de obxectos gráficos propios (compoñentes) que podemos incluír nos nosos programas. Fai algún tempo chegouse a distribuír unha versión para Linux chamada Kylix.&lt;br /&gt;
&lt;br /&gt;
Nos dous entornos se xenerará automáticamente código C para o inicio da aplicación e o funcionamento do interface deseñado. Posteriormente é necesario ir ampliando e modificando ese código &amp;#039;&amp;#039;automático&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Na imaxe de mostra do &amp;#039;&amp;#039;Microsoft Visual C++&amp;#039;&amp;#039; de edición de código pode observarse como é o bucle de tratamento de eventos xenérico dos sistemas Windows.&lt;br /&gt;
&lt;br /&gt;
[[Image:borland1.jpg|right|thumb|Borland C++ Builder: Edición e código]]&lt;br /&gt;
&lt;br /&gt;
Tanto &amp;#039;&amp;#039;&amp;#039;Visual Studio&amp;#039;&amp;#039;&amp;#039; como &amp;#039;&amp;#039;&amp;#039;Borland Builder&amp;#039;&amp;#039;&amp;#039; son ferramentas moi potentes e axeitadas para o desenvolvemento de aplicacións baixo Windows, pero teñen dous inconvintes:&lt;br /&gt;
&lt;br /&gt;
*Son aplicacións propietarias, e polo tanto atan ó programador a compañía que vende o producto. Si a compañía decide retirar ou deixar de manter o producto o programador quedaría completamente desasistido.&lt;br /&gt;
&lt;br /&gt;
*Son ferramentas exclusivamente para Windows, o que impide o desenvolvemento de aplicacións multiplataforma.&lt;br /&gt;
&lt;br /&gt;
A continuación falaremos de outras dúas ferramentas que, ademáis de ser software libre (o que garante ó programador a independencia do distribuidor do producto) son multiplataforma, xa que dispoñen tanto de versión para Linux como para Windows.&lt;br /&gt;
&lt;br /&gt;
== KDevelop, Qt Designer e a librería Qt ==&lt;br /&gt;
&lt;br /&gt;
[[Image:kdevelop.jpg|left|thumb|KDevelop: Edición do Código]]&lt;br /&gt;
&lt;br /&gt;
A librería Qt foi creada pola empresa &amp;#039;&amp;#039;TrollTech&amp;#039;&amp;#039; e empregada na construcción do entorno de escritorio &amp;#039;&amp;#039;&amp;#039;KDE&amp;#039;&amp;#039;&amp;#039;. A súa licencia é GPL, pero si se queren desenvolver aplicacións propietarias é posible (e necesario) adquirir unha licencia.&lt;br /&gt;
&lt;br /&gt;
Qt está construída en &amp;#039;&amp;#039;&amp;#039;C++&amp;#039;&amp;#039;&amp;#039;, de modo que o natural é programar en C++, aínda que existe a posibilidade de facelo en outras linguaxes.&lt;br /&gt;
&lt;br /&gt;
O entorno de desenvolvemento chámase &amp;#039;&amp;#039;KDevelop&amp;#039;&amp;#039; e é un entorno moi completo que ten incluído o editor de textos, o depurador ... etc. O deseñador de interfaces é unha ferramenta independente chamada &amp;#039;&amp;#039;QT Designer&amp;#039;&amp;#039; que está integrada no propio IDE.&lt;br /&gt;
&lt;br /&gt;
[[Image:kdevelop1.jpg|right|thumb|QT Designer: Deseño do GUI]]&lt;br /&gt;
&lt;br /&gt;
KDevelop ten un asistente para crear distintos tipos de aplicacións, e xenerará automáticamente tanto o código inicial da aplicación como o interface de usuario típica para o caso elexido.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Qt Designer&amp;#039;&amp;#039; non é so un deseñador de interfaces, senon que tamén é unha ferramenta visual de creación de aplicacións, integrando tamén un pequeno editor de texto e xerando o código fonte da aplicación a partir do deseño visual realizado.&lt;br /&gt;
&lt;br /&gt;
A librería &amp;#039;&amp;#039;Qt&amp;#039;&amp;#039; e &amp;#039;&amp;#039;QT Designer&amp;#039;&amp;#039; teñen versión para Linux, OS/X, Windows e PDA. Existe unha versión de entorno escritorio para pequenos dispositivos (como os PDA ou teléfonos móviles) feita en Qt chamada &amp;#039;&amp;#039;&amp;#039;QTopía&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
A súa condición de software libre, o funcionar en distintas plataformas e o seu inmellorable aspecto gráfico xunto coa facilidade e rapidez no desenvolvemento de aplicacións fan de QT Designer e de KDevelop dúas ferramentas moi recomendables.&lt;br /&gt;
&lt;br /&gt;
Trolltech facilita unha [http://doc.trolltech.com/4.0/index.html completa documentación] para programar utilizando &amp;#039;&amp;#039;Qt&amp;#039;&amp;#039; e &amp;#039;&amp;#039;Qt-Designer&amp;#039;&amp;#039;. &lt;br /&gt;
&lt;br /&gt;
=== Programación con QT Designer ===&lt;br /&gt;
Aquí podes ver un [http://www.lsi.upc.es/~charalam/taller/ exemplo paso a paso] de aplicación feita con &amp;#039;&amp;#039;Qt Designer&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== Glade e a librería GTK+ ==&lt;br /&gt;
&lt;br /&gt;
A librería GTK+ (&amp;#039;&amp;#039;&amp;#039;G&amp;#039;&amp;#039;&amp;#039;imp &amp;#039;&amp;#039;&amp;#039;T&amp;#039;&amp;#039;&amp;#039;ool&amp;#039;&amp;#039;&amp;#039;K&amp;#039;&amp;#039;&amp;#039;it) foi escrita inicialmente para escribir o programa de deseño gráfico &amp;#039;&amp;#039;&amp;#039;The Gimp&amp;#039;&amp;#039;&amp;#039;, e logo adoptada para a elaboración do entorno de escritorio &amp;#039;&amp;#039;&amp;#039;Gnome&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
GTK+ está desenvolvida na linguaxe &amp;#039;&amp;#039;&amp;#039;C&amp;#039;&amp;#039;&amp;#039; utilizando técnicas de orientación de obxectos, proporciona múltiples elementos gráficos para as aplicacións (chamados &amp;#039;&amp;#039;&amp;#039;Widgets&amp;#039;&amp;#039;&amp;#039;) e o control dos eventos de usuario (chamados &amp;#039;&amp;#039;&amp;#039;sinais&amp;#039;&amp;#039;&amp;#039;) mediante un interfaz simple que permite asociar unha función a cada posible evento.&lt;br /&gt;
&lt;br /&gt;
A librería GTK+ está escrita sobre outras dúas librerías:&lt;br /&gt;
*GDK (&amp;#039;&amp;#039;Graphics Drawing Kit&amp;#039;&amp;#039;): Proporciona as funcións básicas para o tratamento de eventos e o debuxo dos &amp;#039;&amp;#039;Widgets&amp;#039;&amp;#039; por parte de GTK+.&lt;br /&gt;
*GLib : E unha librería de propósito xeral proporcionando tipos de datos específicos e funcións para o manexo de listas, ficheiros, táboas hash, XML, ... etc.&lt;br /&gt;
&lt;br /&gt;
As aplicacións GTK+ siguen o esquema seguinte:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
int main(int argc,char *argv[])&lt;br /&gt;
{&lt;br /&gt;
  // Inicialización&lt;br /&gt;
  gtk_init(&amp;amp;argc,&amp;amp;argv);&lt;br /&gt;
  &lt;br /&gt;
  // Creación e inicialización dos Widgets (Ventanas e os seus obxectos incluidos)&lt;br /&gt;
  widget=gtk_..._new(...);&lt;br /&gt;
&lt;br /&gt;
  // Conexión das funcións de tratamentos de eventos&lt;br /&gt;
  gtk_signal_connect(...);&lt;br /&gt;
&lt;br /&gt;
  // Visualización da ventana co seu contido&lt;br /&gt;
  gtk_widget_show_all(...);&lt;br /&gt;
&lt;br /&gt;
  // Bucle principal de tratamento de eventos&lt;br /&gt;
  gtk_main();&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Básicamente, un programa con GTK+ consiste na creación co interface (que como veremos pode ser realizado coa axuda da libraría &amp;#039;&amp;#039;libglade&amp;#039;&amp;#039;) e na realización das distintas funcións de xestión de eventos do usuario ou &amp;#039;&amp;#039;funcións de tratamento das sinais&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
A colocación dos obxectos no interior dun &amp;#039;&amp;#039;contenedor&amp;#039;&amp;#039; (un obxecto que pode conter outro, como por exemplo unha ventana) realízase mediante os &amp;#039;&amp;#039;&amp;#039;administradores de deseño&amp;#039;&amp;#039;&amp;#039;. Estes &amp;#039;&amp;#039;&amp;#039;administradores de deseño&amp;#039;&amp;#039;&amp;#039; son similares ós empregados na linguaxe [[gal:Java|Java]]. Estes administradores permiten que o contido das ventanas se recoloque automáticamente cando éstas cambian de tamaño:&lt;br /&gt;
*Caixas horizontais (&amp;#039;&amp;#039;&amp;#039;hbox&amp;#039;&amp;#039;&amp;#039;): O espacio para os obxectos está dividido nunha serie de celdas dispostas horizontalmente.&lt;br /&gt;
*Caixas verticais (&amp;#039;&amp;#039;&amp;#039;vbox&amp;#039;&amp;#039;&amp;#039;): O espacio para os obxectos está dividido nunha serie de celdas dispostas verticalmente.&lt;br /&gt;
*Táboas (&amp;#039;&amp;#039;&amp;#039;table&amp;#039;&amp;#039;&amp;#039;): Os espacio para os obxectos está dividido nunha serie de filas e columnas.&lt;br /&gt;
*Posicións Fixas (&amp;#039;&amp;#039;&amp;#039;fixed&amp;#039;&amp;#039;&amp;#039;): Os elementos poden colocarse libremente donde se queira nunha posición fixa. O cambio de tamaño da ventana non modifica a posición dos elementos.&lt;br /&gt;
&lt;br /&gt;
En Internet está dispoñible a documentación da [http://www.gtk.org/ API de programación e un tutorial] con GTK+, GLib e GDK.&lt;br /&gt;
&lt;br /&gt;
=== Multitarefa con GTK+ ===&lt;br /&gt;
As aplicacións con multitarefa teñen o problema do acceso a un recurso compartido: A pantalla gráfica. Si facemos un &amp;#039;&amp;#039;fork&amp;#039;&amp;#039; nuha aplicación GTK cada un dos procesos será unha &amp;#039;&amp;#039;&amp;#039;&amp;#039;copia&amp;#039;&amp;#039;&amp;#039;&amp;#039; exacta do outro. Esto quere decir que  cada proceso pode ter información distinta almacenada nun obxecto gráfico que en principio parecería común (por exemplo un campo de edición de texto). Outro problema é que varios procesos poden querer modificar o contido da pantalla ó mesmo tempo, e incluso poñer á vez distintos valores no mesmo sitio.&lt;br /&gt;
&lt;br /&gt;
Esto fai evidente que é necesario controlar o acceso á pantalla por parte de múltiples procesos ou fíos en execución. No caso dos procesos pode bastar con asegurarse de que só un dos procesos accede ós obxectos gráficos.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
g_idle_add&lt;br /&gt;
g_idle_add_full&lt;br /&gt;
g_timeout_add&lt;br /&gt;
g_thread_init&lt;br /&gt;
g_thread_create&lt;br /&gt;
G_LOCK&lt;br /&gt;
G_UNLOCK&lt;br /&gt;
gdk_threads_init&lt;br /&gt;
gdk_threads_enter&lt;br /&gt;
gdk_threads_leave&lt;br /&gt;
gdk_input_add&lt;br /&gt;
XFlush&lt;br /&gt;
gdk_flush&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
O seguinte programa amosa nunha ventana o resultado da execución &lt;br /&gt;
dun comando ó mesmo tempo que o comando se está a executar. &lt;br /&gt;
Para facer eso, se comunica cunha tubería (&amp;#039;&amp;#039;pipe&amp;#039;&amp;#039;) os dous procesos: &lt;br /&gt;
         o encargado de executar o comando e o encargado de visualizar a saída.&lt;br /&gt;
Para que o programa que visualice a saida continúe refrescando &lt;br /&gt;
o interface gráfico (respondendo ós eventos) é necesario que a lectura se realice &lt;br /&gt;
ó mesmo tempo que o tratamento de eventos, así que facemos unha lectura en cada &lt;br /&gt;
iteración do bucle de tratamento (&amp;#039;&amp;#039;gtk_main()&amp;#039;&amp;#039;) instalando unha función &amp;#039;&amp;#039;idle&amp;#039;&amp;#039; &lt;br /&gt;
que lee da tubería e pon o leido na caixa de texto do interface.&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/stat.h&amp;gt;&lt;br /&gt;
#include &amp;lt;fcntl.h&amp;gt;&lt;br /&gt;
#include &amp;lt;gtk/gtk.h&amp;gt;&lt;br /&gt;
#include &amp;lt;gdk/gdkkeysyms.h&amp;gt;&lt;br /&gt;
#include &amp;lt;glade/glade.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GladeXML *__xml;&lt;br /&gt;
GtkTextBuffer *__tbuf;&lt;br /&gt;
GtkWidget *__btn;&lt;br /&gt;
int __f[2];&lt;br /&gt;
&lt;br /&gt;
void on_Executar_clicked(GtkButton *btn,gpointer data);&lt;br /&gt;
void pai(void);&lt;br /&gt;
void fillo(char *txt);&lt;br /&gt;
&lt;br /&gt;
gboolean leepipe(gpointer kk)&lt;br /&gt;
{&lt;br /&gt;
  char buffer[128];&lt;br /&gt;
  int n;&lt;br /&gt;
  gboolean ret=FALSE;&lt;br /&gt;
&lt;br /&gt;
  n=read(__f[0],buffer,127);&lt;br /&gt;
  buffer[n]=0;&lt;br /&gt;
  if (n&amp;gt;0)&lt;br /&gt;
  {&lt;br /&gt;
     gtk_text_buffer_insert_at_cursor(__tbuf,buffer,strlen(buffer));&lt;br /&gt;
     ret=TRUE;&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
     gtk_widget_set_sensitive(__btn,TRUE);&lt;br /&gt;
     close(__f[0]);&lt;br /&gt;
     wait(NULL);&lt;br /&gt;
  }&lt;br /&gt;
  return ret;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void pai(void)&lt;br /&gt;
{&lt;br /&gt;
  GtkWidget *txt;&lt;br /&gt;
  char buffer[2048];&lt;br /&gt;
  int n;&lt;br /&gt;
&lt;br /&gt;
  close(__f[1]);&lt;br /&gt;
  __btn=glade_xml_get_widget(__xml,&amp;quot;Executar&amp;quot;);&lt;br /&gt;
  gtk_widget_set_sensitive(__btn,FALSE);&lt;br /&gt;
  txt=glade_xml_get_widget(__xml,&amp;quot;vista&amp;quot;);&lt;br /&gt;
  __tbuf=gtk_text_view_get_buffer(GTK_TEXT_VIEW(txt));&lt;br /&gt;
  gtk_text_buffer_set_text(__tbuf,&amp;quot;&amp;quot;,0);&lt;br /&gt;
  g_idle_add(leepipe,NULL);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void fillo(char *txt)&lt;br /&gt;
{&lt;br /&gt;
  close(__f[0]);&lt;br /&gt;
  close(STDOUT_FILENO);&lt;br /&gt;
  dup(__f[1]);&lt;br /&gt;
  system(txt);&lt;br /&gt;
  close(__f[1]);&lt;br /&gt;
  _exit(0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void on_Executar_clicked(GtkButton *btn,gpointer data)&lt;br /&gt;
{&lt;br /&gt;
  int resul;&lt;br /&gt;
  pid_t pid;&lt;br /&gt;
  GtkWidget *txt;&lt;br /&gt;
  char *texto;&lt;br /&gt;
&lt;br /&gt;
  resul=pipe(__f);&lt;br /&gt;
  if (resul!=-1)&lt;br /&gt;
  {&lt;br /&gt;
    txt=glade_xml_get_widget(__xml,&amp;quot;entrada&amp;quot;);&lt;br /&gt;
    texto=gtk_entry_get_text(GTK_ENTRY(txt));&lt;br /&gt;
    pid=fork();&lt;br /&gt;
    switch(pid)&lt;br /&gt;
    {&lt;br /&gt;
      case 0: fillo(texto);&lt;br /&gt;
              break;&lt;br /&gt;
      case -1: //erro&lt;br /&gt;
               close(__f[0]);&lt;br /&gt;
               close(__f[1]);&lt;br /&gt;
               gtk_main_quit();&lt;br /&gt;
               break;&lt;br /&gt;
      default: pai();&lt;br /&gt;
               break;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
   gtk_init(&amp;amp;argc, &amp;amp;argv);&lt;br /&gt;
   __xml = glade_xml_new(&amp;quot;exec.glade&amp;quot;, NULL, NULL);&lt;br /&gt;
   glade_xml_signal_autoconnect(__xml);&lt;br /&gt;
   gtk_main();&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Programación con Glade ===&lt;br /&gt;
[[Image:glade.jpg|left|thumb|Deseñador de Interfaces &amp;#039;&amp;#039;Glade&amp;#039;&amp;#039;]]&lt;br /&gt;
&amp;#039;&amp;#039;Glade&amp;#039;&amp;#039; é unha ferramenta que permite deseñar o interface gráfico de usuario (&amp;#039;&amp;#039;GUI&amp;#039;&amp;#039;) dunha aplicación de xeito visual. O resultado pode obterse ben en forma de código fonte, ou nunha descrición do interface en formato [[gal:XML|XML]]. Este ficheiro XML pode ser cargado e interpretado dinámicamente facendo uso da librería &amp;#039;&amp;#039;libglade&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
O código fonte xerado de modo automático por Glade non é demasiado claro, e ademáis tendo a posibilidade de crear o interface de xeito dinámico con libglade a partir do ficheiro XML non ten demasiado sentido. A súa posible utilidade está nada máis que na persoalización en algúns casos pouco comúns.&lt;br /&gt;
&lt;br /&gt;
O xeito recomendado de traballar co Glade é a xeración do ficherio XML (con extensión &amp;#039;&amp;#039;.glade&amp;#039;&amp;#039;) que será cargado na aplicación posteriormente coa función de libglade &amp;#039;&amp;#039;glade_xml_new&amp;#039;&amp;#039;. &lt;br /&gt;
&lt;br /&gt;
En Glade bótase de menos unha opción de &amp;#039;&amp;#039;vista previa&amp;#039;&amp;#039; do interface, e máis cando pode conseguirse fácilmente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#include &amp;lt;gtk/gtk.h&amp;gt;&lt;br /&gt;
#include &amp;lt;glade/glade.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(int argc,char *argv[])&lt;br /&gt;
{&lt;br /&gt;
   gtk_init(&amp;amp;argc,&amp;amp;argv);&lt;br /&gt;
   &lt;br /&gt;
   __gui=glade_xml_new(argv[1],NULL,NULL);&lt;br /&gt;
   glade_xml_signal_autoconnect(__gui);&lt;br /&gt;
   gtk_main();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Co programa anterior (vistaprevia.c) bastaría poñer &amp;#039;&amp;#039;vistaprevia ficheiro.glade&amp;#039;&amp;#039; para ver o aspecto final na pantalla do GUI definido en &amp;#039;&amp;#039;ficheiro.glade&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Deste xeito a función main nos programas feitos con libglade será a seguinte:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
int main(int argc,char *argv[])&lt;br /&gt;
{&lt;br /&gt;
   gtk_init(&amp;amp;argc,&amp;amp;argv);&lt;br /&gt;
   &lt;br /&gt;
   __gui=glade_xml_new(/*&amp;quot;ficheiro.glade da aplicación&amp;quot;*/,NULL,NULL);&lt;br /&gt;
   glade_xml_signal_autoconnect(__gui);&lt;br /&gt;
   /*&lt;br /&gt;
   Posible inicialización de datos (carga inicial de datos no GUI, por exemplo*/&lt;br /&gt;
   */&lt;br /&gt;
   gtk_main();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== A librería libGlade ===&lt;br /&gt;
A librería &amp;#039;&amp;#039;libGlade&amp;#039;&amp;#039; permite cargar un ficheiro [[gal:XML|XML]] coa descrición do GUI da aplicación, instalar as funcións de tratamento de sinais e obter os distintos obxectos que compoñen o interface do usuario a partir do seu nome.&lt;br /&gt;
&lt;br /&gt;
O ficheiro XML se xerará normalmente cunha aplicación de deseño visual, como &amp;#039;&amp;#039;glade&amp;#039;&amp;#039; ou &amp;#039;&amp;#039;gazpacho&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Deste xeito, unha aplicación con libGlade limítase a inicialización da aplicación, carga do interface e instalación de sinais e á escritura das funcións de tratamento para os distintos eventos como se pode ver nos exemplos do apartado anterior.&lt;br /&gt;
&lt;br /&gt;
As funcións máis interesantes ofrecidas pola librería &amp;#039;&amp;#039;libglade&amp;#039;&amp;#039; son as seguintes:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
Carga o interface do ficheiro XML. &lt;br /&gt;
- Si se indica  &amp;#039;&amp;#039;root&amp;#039;&amp;#039; so cargará o obxecto &amp;#039;&amp;#039;root&amp;#039;&amp;#039; e os seus fillos. &lt;br /&gt;
NULL cargará &amp;#039;&amp;#039;ficheiroXML&amp;#039;&amp;#039; completo.&lt;br /&gt;
- &amp;#039;&amp;#039;domain&amp;#039;&amp;#039; normalmente será NULL. Úsase para a traducción da aplicación &lt;br /&gt;
a outros idiomas mediante a utilidade &amp;#039;&amp;#039;gettext&amp;#039;&amp;#039;.&lt;br /&gt;
*/&lt;br /&gt;
GladeXML *glade_xml_new(char *ficheiroXML,char *root,char *domain);&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
Conecta as sinais indicadas no XML ás funcións tamén especificadas&lt;br /&gt;
no XML. &lt;br /&gt;
*/&lt;br /&gt;
void glade_xml_signal_autoconnect (GladeXML *xml);&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
Obtén o obxecto gráfico (widget) do ficheiro XML a partir do seu nome&lt;br /&gt;
Posteriormente poderemos manipula-lo coas funcións propias do obxecto&lt;br /&gt;
recuperado.&lt;br /&gt;
*/&lt;br /&gt;
GtkWidget *glade_xml_get_widget(GladeXML *xml,char *nomeObxecto);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Programación Multiplataforma con libGlade ===&lt;br /&gt;
{{Programación Multiplataforma con Glade}}&lt;br /&gt;
&lt;br /&gt;
== Exemplos ==&lt;br /&gt;
{|cellpadding=20&lt;br /&gt;
|&lt;br /&gt;
*Saúdo&lt;br /&gt;
*Ordear Lista&lt;br /&gt;
*Cálculo Media&lt;br /&gt;
*Números Romanos&lt;br /&gt;
|&lt;br /&gt;
*Cálculo do Número &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;e&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
*[[Fundamentos:Solucións:4 en Raia|Catro en Raia]]&lt;br /&gt;
*[[Fundamentos:Solucións:Bomber|Xogo Bomber]]&lt;br /&gt;
*[[Fundamentos:Solucións:Reversi|Reversi]]&lt;br /&gt;
*Representación de Ecuacións&lt;br /&gt;
*O Aforcado&lt;br /&gt;
|&lt;br /&gt;
*[[Desenvolvemento:Exercicios:Contador con GUI|Contador con GUI]]&lt;br /&gt;
*[[Desenvolvemento:Exercicios:Aviso Temporizado con GUI|Aviso Temporizado con GUI]]&lt;br /&gt;
*GUI para codificación de Vídeo&lt;br /&gt;
*GUI para gravación de TV&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Xavi</name></author>
	</entry>
</feed>