<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:series="http://unfoldingneurons.com/"
	>

<channel>
	<title>f(Program,Poet)=Programet &#187; 最后的叶子</title>
	<atom:link href="http://blog.programet.org/author/last-leaf/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.programet.org</link>
	<description>f(诗,程序)=诗序=思绪 &#124; 记载我们自己的生活</description>
	<lastBuildDate>Wed, 08 Sep 2010 03:38:50 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>学习使用GTK+ 3.使用GtkBuilder、界面设计器Glade和其他GTK+组件</title>
		<link>http://blog.programet.org/2010/09/gtk-3.html</link>
		<comments>http://blog.programet.org/2010/09/gtk-3.html#comments</comments>
		<pubDate>Tue, 07 Sep 2010 17:19:42 +0000</pubDate>
		<dc:creator>最后的叶子</dc:creator>
				<category><![CDATA[原创博文]]></category>
		<category><![CDATA[程序]]></category>
		<category><![CDATA[计算机]]></category>

		<guid isPermaLink="false">http://blog.programet.org/?p=3157</guid>
		<description><![CDATA[这一部分包括GTK+相关组件的简要介绍，和界面设计器的使用方法。如果内容存在错误，或者方法不适用与你的电脑，请在下方评论区留言给我，谢谢！
GTK+的姊妹库

准确地说，GTK+仅指一个界面物件库。为了制作GTK+，一些副产品相继诞生，比如C语言界很有名的的GLib库。这些GTK+的“姊妹库”都是GTK+所依赖的，而且，制作GTK+程序时可能需要直接使用这些库。

GLib：目前最好的C语言数据结构库之一。除数据结构外，它还包括许多常用小工具，比如多线程管理、定时器。GTK+界面无关的部分基本都被并入GLib中。
GIO：GLib库相对独立的一部分，专门处理输入输出流。新版本的GIO还包括了网络连接功能。
GObject：GLib库相对独立的一部分，维护一套对象系统。GTK+疯狂地使用这个系统。
ATK：ATK提供一组查看和控制接口以方便对GTK+程序的访问。
pango：负责处理GTK+中和字体有关的部分。
cairo：著名的2D渲染库，被Firefox等很多程序使用。它也是目前GTK+使用的2D渲染库，通过它可以进行矢量绘图。
gdk-pixbuf：GDK的一个部分，提供了一组位图函数，包括位图变换、位图文件读写等等。
GDK：提供一组接口，把GTK+从桌面系统细节中隔离出来。它是一组底层函数，可以直接访问窗口细节。GTK+系统有关的部分多数在这里。

这些库的API参考都可以在GNOME参考（http://library.gnome.org/devel/references.html.zh_CN）中找到。
还有一些库是GTK+依赖的第三方库，下面是几个重要的。

gettext：国际化库。主要用于制作多语言程序。运行时gettext自动识别操作系统语言，然后从已有语言包中选择一个最合适用户的。
iconv：字符集转换库。GTK+内部使用UTF-8字符集，有时需要字符集转换。

GTK+内部构成
GTK+本身只负责界面组织。它提供的函数大致可分为三类，物件（Widget）、对象（Object）和其它工具函数。
工具函数提供一些与界面关系密切的实用功能，比如剪贴板读写。
对象是一些功能更加复杂的不可见元素，它们和界面息息相关，比如GtkBuilder。
界面设计器Glade
通过代码来组织界面繁琐而不直观，因而有人为GTK+做了一款界面设计器，名为Glade，现已成为GTK+最重要的辅助工具。
接下来用一个计算器制作的实例来讲解GTK+界面设计器的使用方法。
打开Glade。Glade会自动新建一个文件，新建后会弹出对话框设置文件格式，应选用GtkBuilder。

首先建一个窗口。在左栏中找到“窗口”一项，点一下即可。中间部分的黑框即为窗口中的内容。
下面要组织窗口中的内容了。要注意的是，一个灰色区域只能放置一个物件。如果需要放置多个物件，可以使用水平框、垂直框或表格物件，这些容器可以把一个灰色区域分成多个。

添加Spin按钮（Spin按钮用于输入数字）、表格、按钮等物件，可以把界面画成想要的样子，在右下方的属性设置中，可以设置物件的各种属性。在“常规”选项卡中，可以设置一些重要的初始值，物件名等。注意：需要动态更改的物件，物件名很重要。
“包装”选项卡负责物件的间距控制和大小改变方式等。GTK+在窗口大小改变时会智能地调整物件大小，其依据的就是这个选项卡里的设置。

计算器的界面成形了。记得经常保存，Glade有时会比较脆弱。
注意：在输入完某项属性之后务必使输入焦点离开当前输入区，然后才可以保存文件，否则当前输入区的更改不会被立即保存到文件中。
载入界面
Glade文件的本质是个XML文件，这个文件可以用GtkBuilder对象载入并生成界面。下面这样写可以载入一个Glade文件。

GtkBuilder* gtk_load_glade&#40;gchar* filename&#41;
&#123;
	GtkBuilder *gb;
&#160;
	//新建一个GtkBuider对象
	gb=gtk_builder_new&#40;&#41;;
	//载入文件，失败则返回NULL
	if&#40;!gtk_builder_add_from_file&#40;gb,filename,NULL&#41;&#41;return NULL;
	//连接文件中包含的所有信号
	gtk_builder_connect_signals&#40;gb,NULL&#41;;
&#160;
	//返回GtkBuilder对象供后面操作使用
	return gb;
&#125;

载入后还需要还需要获得已载入的物件地址，并将储存在物件指针里以便以后动态更改物件。一个聪明的策略是使指针名字和物件在Glade里设置的名字一样。用函数gtk_builder_get_object()可以获得指定名字的物件地址。为了简便，可以写一段宏代替冗长的函数调用。下面这段代码演示了获得主窗口（名为WMain）和Spin按钮（名为SAns）地址的方法。

#define w_(builder,type,name) name=GTK_##type(gtk_builder_get_object(builder,#name))
&#160;
GtkWindow *WMain;
GtkSpinButton *SAns;
&#160;
void cal_get_widgets&#40;GtkBuilder* gb&#41;
&#123;
	w_&#40;gb,WINDOW,WMain&#41;;
	w_&#40;gb,SPIN_BUTTON,SAns&#41;;
&#125;

主窗口默认情况下应该显示出来。下面这个函数只能在获得物件地址后执行。

void cal_widget_init&#40;&#41;
&#123;
	gtk_widget_show_all&#40;GTK_WIDGET&#40;WMain&#41;&#41;;
&#125;

编写回调函数
现在的主要任务就是编写回调函数——这些函数才是程序的主角。在某个事件被触发时，对应的函数会被执行。这个函数可以在Glade中指定。在Glade中选定某个物件，然后在右下角“信号”选项卡中选择一个合适的事件，在“操作句柄”列填入函数名。
下面为窗口WMain指定destroy事件的回调函数on_WMain_destroy()。

然后编写一个函数on_WMain_destroy()。在Windows下，这个函数要加上修饰词G_MODULE_EXPORT。

G_MODULE_EXPORT void on_WMain_destroy&#40;GtkObject* widget, gpointer user_data&#41;
&#123;
	gtk_main_quit&#40;&#41;;
&#125;

这个回调函数只是退出程序而已。最后献上一段main()。

int main&#40;int argc, char *argv&#91;&#93;&#41;
&#123;
	GtkBuilder *gb;
&#160;
	gtk_init&#40;&#38;argc,&#38;argv&#41;;
&#160;
	gb=gtk_load_glade&#40;&#34;gtk-cal.glade&#34;&#41;;
	if&#40;gb==NULL&#41;return -1;
	cal_get_widgets&#40;gb&#41;;
	cal_widget_init&#40;&#41;;
&#160;
	gtk_main&#40;&#41;;
&#160;
	return 0;
&#125;

这个计算器程序目前只完成了最基本的部分，这个系列后续的文章会把它做完。有关回调函数、物件函数的信息，请参考GTK+ API参考。
本文由 最后的叶子 创作，转载或引用前请联系我们。

相关文章：学习使用GTK+ 1.构建GTK+编译环境学习使用GTK+ 2.GTK+“Hello World”——对GTK+运作机制的通俗介绍为自己的blogger博客加上标签云


相关文章：<ol><li><a href='http://blog.programet.org/2010/08/gtk-1.html' rel='bookmark' title='Permanent Link: 学习使用GTK+ 1.构建GTK+编译环境'>学习使用GTK+ 1.构建GTK+编译环境</a></li><li><a href='http://blog.programet.org/2010/09/gtk-2.html' rel='bookmark' title='Permanent Link: 学习使用GTK+ 2.GTK+“Hello World”——对GTK+运作机制的通俗介绍'>学习使用GTK+ 2.GTK+“Hello World”——对GTK+运作机制的通俗介绍</a></li><li><a href='http://blog.programet.org/2008/08/blogger.html' rel='bookmark' title='Permanent Link: 为自己的blogger博客加上标签云'>为自己的blogger博客加上标签云</a></li></ol>]]></description>
			<content:encoded><![CDATA[<p>这一部分包括GTK+相关组件的简要介绍，和界面设计器的使用方法。如果内容存在错误，或者方法不适用与你的电脑，请在下方评论区留言给我，谢谢！</p>
<h3>GTK+的姊妹库</h3>
<p><span id="more-3157"></span></p>
<p>准确地说，GTK+仅指一个界面物件库。为了制作GTK+，一些副产品相继诞生，比如C语言界很有名的的GLib库。这些GTK+的“姊妹库”都是GTK+所依赖的，而且，制作GTK+程序时可能需要直接使用这些库。</p>
<ul>
<li><strong>GLib</strong>：目前最好的C语言数据结构库之一。除数据结构外，它还包括许多常用小工具，比如多线程管理、定时器。GTK+界面无关的部分基本都被并入GLib中。</li>
<li><strong>GIO</strong>：GLib库相对独立的一部分，专门处理输入输出流。新版本的GIO还包括了网络连接功能。</li>
<li><strong>GObject</strong>：GLib库相对独立的一部分，维护一套对象系统。GTK+疯狂地使用这个系统。</li>
<li><strong>ATK</strong>：ATK提供一组查看和控制接口以方便对GTK+程序的访问。</li>
<li><strong>pango</strong>：负责处理GTK+中和字体有关的部分。</li>
<li><strong>cairo</strong>：著名的2D渲染库，被Firefox等很多程序使用。它也是目前GTK+使用的2D渲染库，通过它可以进行矢量绘图。</li>
<li><strong>gdk-pixbuf</strong>：GDK的一个部分，提供了一组位图函数，包括位图变换、位图文件读写等等。</li>
<li><strong>GDK</strong>：提供一组接口，把GTK+从桌面系统细节中隔离出来。它是一组底层函数，可以直接访问窗口细节。GTK+系统有关的部分多数在这里。</li>
</ul>
<p>这些库的API参考都可以在GNOME参考（<a href="http://library.gnome.org/devel/references.html.zh_CN">http://library.gnome.org/devel/references.html.zh_CN</a>）中找到。</p>
<p>还有一些库是GTK+依赖的第三方库，下面是几个重要的。</p>
<ul>
<li><strong>gettext</strong>：国际化库。主要用于制作多语言程序。运行时gettext自动识别操作系统语言，然后从已有语言包中选择一个最合适用户的。</li>
<li><strong>iconv</strong>：字符集转换库。GTK+内部使用UTF-8字符集，有时需要字符集转换。</li>
</ul>
<h3>GTK+内部构成</h3>
<p>GTK+本身只负责界面组织。它提供的函数大致可分为三类，物件（Widget）、对象（Object）和其它工具函数。</p>
<p>工具函数提供一些与界面关系密切的实用功能，比如剪贴板读写。</p>
<p>对象是一些功能更加复杂的不可见元素，它们和界面息息相关，比如GtkBuilder。</p>
<h3>界面设计器Glade</h3>
<p>通过代码来组织界面繁琐而不直观，因而有人为GTK+做了一款界面设计器，名为Glade，现已成为GTK+最重要的辅助工具。</p>
<p>接下来用一个计算器制作的实例来讲解GTK+界面设计器的使用方法。</p>
<p>打开Glade。Glade会自动新建一个文件，新建后会弹出对话框设置文件格式，应选用GtkBuilder。</p>
<p><img class="aligncenter size-full wp-image-3161" title="gtk-3-1" src="http://blog.programet.org/index.php?feedimage=wp-content/uploads/gtk-3-1.jpg" alt="" width="407" height="459" /></p>
<p>首先建一个窗口。在左栏中找到“窗口”一项，点一下即可。中间部分的黑框即为窗口中的内容。</p>
<p>下面要组织窗口中的内容了。要注意的是，一个灰色区域只能放置一个物件。如果需要放置多个物件，可以使用水平框、垂直框或表格物件，这些容器可以把一个灰色区域分成多个。</p>
<p><img class="aligncenter size-full wp-image-3160" title="gtk-3-2" src="http://blog.programet.org/index.php?feedimage=wp-content/uploads/gtk-3-2.jpg" alt="" width="617" height="346" /></p>
<p>添加Spin按钮（Spin按钮用于输入数字）、表格、按钮等物件，可以把界面画成想要的样子，在右下方的属性设置中，可以设置物件的各种属性。在“常规”选项卡中，可以设置一些重要的初始值，物件名等。注意：需要动态更改的物件，物件名很重要。</p>
<p>“包装”选项卡负责物件的间距控制和大小改变方式等。GTK+在窗口大小改变时会智能地调整物件大小，其依据的就是这个选项卡里的设置。</p>
<p><img class="aligncenter size-full wp-image-3159" title="gtk-3-3" src="http://blog.programet.org/index.php?feedimage=wp-content/uploads/gtk-3-3.jpg" alt="" width="454" height="346" /></p>
<p>计算器的界面成形了。记得经常保存，Glade有时会比较脆弱。</p>
<p>注意：在输入完某项属性之后务必使输入焦点离开当前输入区，然后才可以保存文件，否则当前输入区的更改不会被立即保存到文件中。</p>
<h3>载入界面</h3>
<p>Glade文件的本质是个XML文件，这个文件可以用GtkBuilder对象载入并生成界面。下面这样写可以载入一个Glade文件。</p>

<div class="wp_codebox"><table><tr id="p31576"><td class="code" id="p3157code6"><pre class="c" style="font-family:monospace;">GtkBuilder<span style="color: #339933;">*</span> gtk_load_glade<span style="color: #009900;">&#40;</span>gchar<span style="color: #339933;">*</span> filename<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	GtkBuilder <span style="color: #339933;">*</span>gb<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">//新建一个GtkBuider对象</span>
	gb<span style="color: #339933;">=</span>gtk_builder_new<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #666666; font-style: italic;">//载入文件，失败则返回NULL</span>
	<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>gtk_builder_add_from_file<span style="color: #009900;">&#40;</span>gb<span style="color: #339933;">,</span>filename<span style="color: #339933;">,</span>NULL<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #b1b100;">return</span> NULL<span style="color: #339933;">;</span>
	<span style="color: #666666; font-style: italic;">//连接文件中包含的所有信号</span>
	gtk_builder_connect_signals<span style="color: #009900;">&#40;</span>gb<span style="color: #339933;">,</span>NULL<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">//返回GtkBuilder对象供后面操作使用</span>
	<span style="color: #b1b100;">return</span> gb<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>载入后还需要还需要获得已载入的物件地址，并将储存在物件指针里以便以后动态更改物件。一个聪明的策略是使指针名字和物件在Glade里设置的名字一样。用函数gtk_builder_get_object()可以获得指定名字的物件地址。为了简便，可以写一段宏代替冗长的函数调用。下面这段代码演示了获得主窗口（名为WMain）和Spin按钮（名为SAns）地址的方法。</p>

<div class="wp_codebox"><table><tr id="p31577"><td class="code" id="p3157code7"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#define w_(builder,type,name) name=GTK_##type(gtk_builder_get_object(builder,#name))</span>
&nbsp;
GtkWindow <span style="color: #339933;">*</span>WMain<span style="color: #339933;">;</span>
GtkSpinButton <span style="color: #339933;">*</span>SAns<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">void</span> cal_get_widgets<span style="color: #009900;">&#40;</span>GtkBuilder<span style="color: #339933;">*</span> gb<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	w_<span style="color: #009900;">&#40;</span>gb<span style="color: #339933;">,</span>WINDOW<span style="color: #339933;">,</span>WMain<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	w_<span style="color: #009900;">&#40;</span>gb<span style="color: #339933;">,</span>SPIN_BUTTON<span style="color: #339933;">,</span>SAns<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>主窗口默认情况下应该显示出来。下面这个函数只能在获得物件地址后执行。</p>

<div class="wp_codebox"><table><tr id="p31578"><td class="code" id="p3157code8"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">void</span> cal_widget_init<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	gtk_widget_show_all<span style="color: #009900;">&#40;</span>GTK_WIDGET<span style="color: #009900;">&#40;</span>WMain<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<h3>编写回调函数</h3>
<p>现在的主要任务就是编写回调函数——这些函数才是程序的主角。在某个事件被触发时，对应的函数会被执行。这个函数可以在Glade中指定。在Glade中选定某个物件，然后在右下角“信号”选项卡中选择一个合适的事件，在“操作句柄”列填入函数名。</p>
<p>下面为窗口WMain指定destroy事件的回调函数on_WMain_destroy()。</p>
<p><img class="aligncenter size-full wp-image-3158" title="gtk-3-4" src="http://blog.programet.org/index.php?feedimage=wp-content/uploads/gtk-3-4.jpg" alt="" width="380" height="524" /></p>
<p>然后编写一个函数on_WMain_destroy()。在Windows下，这个函数要加上修饰词G_MODULE_EXPORT。</p>

<div class="wp_codebox"><table><tr id="p31579"><td class="code" id="p3157code9"><pre class="c" style="font-family:monospace;">G_MODULE_EXPORT <span style="color: #993333;">void</span> on_WMain_destroy<span style="color: #009900;">&#40;</span>GtkObject<span style="color: #339933;">*</span> widget<span style="color: #339933;">,</span> gpointer user_data<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	gtk_main_quit<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>这个回调函数只是退出程序而已。最后献上一段main()。</p>

<div class="wp_codebox"><table><tr id="p315710"><td class="code" id="p3157code10"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> argc<span style="color: #339933;">,</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>argv<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	GtkBuilder <span style="color: #339933;">*</span>gb<span style="color: #339933;">;</span>
&nbsp;
	gtk_init<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>argc<span style="color: #339933;">,&amp;</span>argv<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	gb<span style="color: #339933;">=</span>gtk_load_glade<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;gtk-cal.glade&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>gb<span style="color: #339933;">==</span>NULL<span style="color: #009900;">&#41;</span><span style="color: #b1b100;">return</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
	cal_get_widgets<span style="color: #009900;">&#40;</span>gb<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	cal_widget_init<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	gtk_main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>这个计算器程序目前只完成了最基本的部分，这个系列后续的文章会把它做完。有关回调函数、物件函数的信息，请参考GTK+ API参考。</p>
<p><small>本文由 最后的叶子 创作，转载或引用前请<a href="mailto:programet.org@gmail.com">联系我们</a>。</small></p>

<p>相关文章：<ol><li><a href='http://blog.programet.org/2010/08/gtk-1.html' rel='bookmark' title='Permanent Link: 学习使用GTK+ 1.构建GTK+编译环境'>学习使用GTK+ 1.构建GTK+编译环境</a></li><li><a href='http://blog.programet.org/2010/09/gtk-2.html' rel='bookmark' title='Permanent Link: 学习使用GTK+ 2.GTK+“Hello World”——对GTK+运作机制的通俗介绍'>学习使用GTK+ 2.GTK+“Hello World”——对GTK+运作机制的通俗介绍</a></li><li><a href='http://blog.programet.org/2008/08/blogger.html' rel='bookmark' title='Permanent Link: 为自己的blogger博客加上标签云'>为自己的blogger博客加上标签云</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.programet.org/2010/09/gtk-3.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<series:name><![CDATA[学习使用GTK+]]></series:name>
	</item>
		<item>
		<title>软件推荐-VirtuaWin</title>
		<link>http://blog.programet.org/2010/09/%e8%bd%af%e4%bb%b6%e6%8e%a8%e8%8d%90-virtuawin.html</link>
		<comments>http://blog.programet.org/2010/09/%e8%bd%af%e4%bb%b6%e6%8e%a8%e8%8d%90-virtuawin.html#comments</comments>
		<pubDate>Mon, 06 Sep 2010 15:52:43 +0000</pubDate>
		<dc:creator>最后的叶子</dc:creator>
				<category><![CDATA[原创博文]]></category>
		<category><![CDATA[计算机]]></category>

		<guid isPermaLink="false">http://blog.programet.org/?p=3148</guid>
		<description><![CDATA[相信用过Linux桌面的童鞋都会对虚拟桌面功能印象深刻。Linux的桌面系统本身有虚拟桌面功能，虽然只显示一个桌面，但包含了几个虚拟桌面，可以把一个窗口放在任何一个虚拟桌面上，可以切换当前显示的虚拟桌面。如果打开的窗口很多，这个功能会很有用，窗口管理起来会很方便，比如办公的窗口放在一个虚拟桌面，娱乐的窗口放在另一个虚拟桌面，工作累了想放松时可以方便地从办公状态切换到娱乐状态。还有一个有点邪恶的功能——把游戏窗口放在一个虚拟桌面里，老师或领导来了就飞速切换出这个虚拟桌面，窗口就被藏好了，任务栏和Alt+Tab都找不到这个窗口，xixi。

前段时间在网上找一个在Windows下实现虚拟桌面功能的软件，谷歌+百度出来的东东都很不尽如人意，不是功能不全面就是不稳定不高效。于是索性去Sourceforge上搜，找到了一个灰常强大的东东（sf真是卧虎藏龙啊！），叫做VirtuaWin。这个软件不仅免费开源，而且性能甚至比收费软件更强大，桌面切换速度飞快，功能也非常丰富，比多数其他同类软件多得多。
它在我的Vista上表现很稳定（目前没出过错），而且一直在更新，想必XP和Win7应该都不成问题。唯一的问题是，它只支持英文，有些词对大家还有点困难。
大家可以到这里下载安装包，有便携版（portable）。初次启动之后设置一下快捷键之类的（建议把快捷键设为Windows徽标键+方向键），把它最小化到托盘区就可以了，托盘区的图标会指示目前显示的是哪个虚拟桌面。在窗口标题栏上点鼠标中键（滚轮）可以得到一个功能菜单，包含更丰富的功能，比如窗口置顶。
本文由 最后的叶子 创作，转载或引用前请联系我们。

相关文章：小学的方法，超越数与其它统计与推理(1)：描述性统计每周软件推荐-Firefox火狐及其插件


相关文章：<ol><li><a href='http://blog.programet.org/2009/06/%e5%b0%8f%e5%ad%a6%e7%9a%84%e6%96%b9%e6%b3%95%ef%bc%8c%e8%b6%85%e8%b6%8a%e6%95%b0%e4%b8%8e%e5%85%b6%e5%ae%83.html' rel='bookmark' title='Permanent Link: 小学的方法，超越数与其它'>小学的方法，超越数与其它</a></li><li><a href='http://blog.programet.org/2010/07/%e7%bb%9f%e8%ae%a1%e4%b8%8e%e6%8e%a8%e7%90%861%ef%bc%9a%e6%8f%8f%e8%bf%b0%e6%80%a7%e7%bb%9f%e8%ae%a1.html' rel='bookmark' title='Permanent Link: 统计与推理(1)：描述性统计'>统计与推理(1)：描述性统计</a></li><li><a href='http://blog.programet.org/2009/10/%e6%af%8f%e5%91%a8%e8%bd%af%e4%bb%b6%e6%8e%a8%e8%8d%90-firefox%e7%81%ab%e7%8b%90%e5%8f%8a%e5%85%b6%e6%8f%92%e4%bb%b6.html' rel='bookmark' title='Permanent Link: 每周软件推荐-Firefox火狐及其插件'>每周软件推荐-Firefox火狐及其插件</a></li></ol>]]></description>
			<content:encoded><![CDATA[<p>相信用过Linux桌面的童鞋都会对虚拟桌面功能印象深刻。Linux的桌面系统本身有虚拟桌面功能，虽然只显示一个桌面，但包含了几个虚拟桌面，可以把一个窗口放在任何一个虚拟桌面上，可以切换当前显示的虚拟桌面。如果打开的窗口很多，这个功能会很有用，窗口管理起来会很方便，比如办公的窗口放在一个虚拟桌面，娱乐的窗口放在另一个虚拟桌面，工作累了想放松时可以方便地从办公状态切换到娱乐状态。还有一个有点邪恶的功能——把游戏窗口放在一个虚拟桌面里，老师或领导来了就飞速切换出这个虚拟桌面，窗口就被藏好了，任务栏和Alt+Tab都找不到这个窗口，xixi。</p>
<p><span id="more-3148"></span></p>
<p>前段时间在网上找一个在Windows下实现虚拟桌面功能的软件，谷歌+百度出来的东东都很不尽如人意，不是功能不全面就是不稳定不高效。于是索性去Sourceforge上搜，找到了一个灰常强大的东东（sf真是卧虎藏龙啊！），叫做VirtuaWin。这个软件不仅免费开源，而且性能甚至比收费软件更强大，桌面切换速度飞快，功能也非常丰富，比多数其他同类软件多得多。</p>
<div id="attachment_3149" class="wp-caption aligncenter" style="width: 364px"><img class="size-full wp-image-3149" title="VirtuaWin" src="http://blog.programet.org/index.php?feedimage=wp-content/uploads/VirtuaWin.jpg" alt="" width="354" height="525" /><p class="wp-caption-text">VirtuaWin设置窗口</p></div>
<p>它在我的Vista上表现很稳定（目前没出过错），而且一直在更新，想必XP和Win7应该都不成问题。唯一的问题是，它只支持英文，有些词对大家还有点困难。</p>
<p>大家可以到<a href="http://virtuawin.sourceforge.net/downloads.php">这里</a>下载安装包，有便携版（portable）。初次启动之后设置一下快捷键之类的（建议把快捷键设为Windows徽标键+方向键），把它最小化到托盘区就可以了，托盘区的图标会指示目前显示的是哪个虚拟桌面。在窗口标题栏上点鼠标中键（滚轮）可以得到一个功能菜单，包含更丰富的功能，比如窗口置顶。</p>
<p><small>本文由 最后的叶子 创作，转载或引用前请<a href="mailto:programet.org@gmail.com">联系我们</a>。</small></p>

<p>相关文章：<ol><li><a href='http://blog.programet.org/2009/06/%e5%b0%8f%e5%ad%a6%e7%9a%84%e6%96%b9%e6%b3%95%ef%bc%8c%e8%b6%85%e8%b6%8a%e6%95%b0%e4%b8%8e%e5%85%b6%e5%ae%83.html' rel='bookmark' title='Permanent Link: 小学的方法，超越数与其它'>小学的方法，超越数与其它</a></li><li><a href='http://blog.programet.org/2010/07/%e7%bb%9f%e8%ae%a1%e4%b8%8e%e6%8e%a8%e7%90%861%ef%bc%9a%e6%8f%8f%e8%bf%b0%e6%80%a7%e7%bb%9f%e8%ae%a1.html' rel='bookmark' title='Permanent Link: 统计与推理(1)：描述性统计'>统计与推理(1)：描述性统计</a></li><li><a href='http://blog.programet.org/2009/10/%e6%af%8f%e5%91%a8%e8%bd%af%e4%bb%b6%e6%8e%a8%e8%8d%90-firefox%e7%81%ab%e7%8b%90%e5%8f%8a%e5%85%b6%e6%8f%92%e4%bb%b6.html' rel='bookmark' title='Permanent Link: 每周软件推荐-Firefox火狐及其插件'>每周软件推荐-Firefox火狐及其插件</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.programet.org/2010/09/%e8%bd%af%e4%bb%b6%e6%8e%a8%e8%8d%90-virtuawin.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<series:name><![CDATA[软件推荐]]></series:name>
	</item>
		<item>
		<title>学习使用GTK+ 2.GTK+“Hello World”——对GTK+运作机制的通俗介绍</title>
		<link>http://blog.programet.org/2010/09/gtk-2.html</link>
		<comments>http://blog.programet.org/2010/09/gtk-2.html#comments</comments>
		<pubDate>Sun, 05 Sep 2010 17:10:29 +0000</pubDate>
		<dc:creator>最后的叶子</dc:creator>
				<category><![CDATA[原创博文]]></category>
		<category><![CDATA[程序]]></category>
		<category><![CDATA[计算机]]></category>

		<guid isPermaLink="false">http://blog.programet.org/?p=3143</guid>
		<description><![CDATA[这一部分是对最简单的GTK+（C语言）程序的一个解释，并介绍GTK+的基本概念和运作方式。如果内容存在错误，或者方法不适用与你的电脑，请在下方评论区留言给我，谢谢！
几个概念
首先先来解释GTK+中几个基本的概念，以方便将来的分析。
物件（GtkWidget）：GTK+中每一个窗口里的组成要素都被视为一个物件，如按钮、文本等等，窗口本身也是一个物件。总之GTK+的界面就是由物件构成的。注意，物件都使用指针来管理，物件外在表现就是一个特定类型的指针。
容器（GtkContainer）：物件里的一大类，容器的特点是其内部能够容纳其他物件。容器最基本的功能之一是将各种物件良好地组织起来。GTK+的容器能在大小改变时自动调整内含物件的大小，这使得GTK+能够很智能地相应窗口或其他物件的大小改变。这为我们提供了很大的方便，往往我们不需要指定某个物件的大小，只需说明他所在的容器位置，GTK+会把物件的实际位置和大小自动计算出来（这比MFC强多了！）。
继承、组合：虽然是C语言写的，但GTK+灵活地运用了面向对象思想。GTK+的物件体系中就有继承、组合这样的关系，如窗口（GtkWindow）是由容器（GtkContainer）派生出来的。
类型转换宏：C语言本身没有“继承”这个概念，那么，如果直接把派生的物件直接当做基物件使用，会出现一个编译警告，即“隐式指针类型转换”，但不会出错。为了消除这个警告，需要做指针类型转换。一般情况下类型转换使用类型转换宏。类型转换宏内部会检查物件的继承关系，确定能否进行转换，然后再做显式类型转换。
事件（event）：用户的操作，比如按下某个按钮或快捷键，被视为一个事件。
信号（signal）：GTK+是基于信号回调（signal-slot）机制的。信号捆绑了一个事件和一个函数，在用户触发这个事件时，这个函数会被调用一次。从这个角度来说，GTK+是基于物件的，即程序围绕物件属性、事件、方法进行。
主循环（main loop）：GTK+程序在一个主循环中运行。当一个事件被触发时，它将被插入队列中；在主循环中被触发的事件会被逐个处理（和这个事件绑定的函数被逐个调用）；没有事件被触发时，程序就处于等待状态，等待下一个事件被用户触发。直到退出主循环的函数被调用，GTK+程序才结束。
GTK+命名规范
GTK+拥有开源软件的很多特点，比如结构高度严谨，可读性甚好。现在介绍一下GTK+的关键字命名方式，以便阅读一段GTK+程序。
普通变量类型名：全小写写法，以“g”开头，如“gint”。
物件类型名：驼峰写法（首字母大写），以“Gtk”开头，形如“GtkWindow”。在GTK+内部，类型是向下面这样定义的（以GtkWindow为例）。

typedef _GtkWindow &#123; ... &#125; GtkWindow;

函数名：小写夹下划线写法，以“gtk_”为前缀，形如“gtk_main()”。如果是针对某类物件的函数，则前缀中还有物件类型名，形如“gtk_window_new()”。
常数名：大写夹下划线写法，以“GTK_”为前缀，形如“GTK_WINDOW_TOPLEVEL”。
类型转换宏：大写夹下划线写法，以“GTK_”为前缀。一般来说，宏名字和类型名相仿，比如要把GtkWindow*类型的物件转换为GtkContainer*类型，就使用宏“GTK_CONTAINER()”。
GTK+的“Hello World”
下面这段程序是GTK+的Hello World，它创建一个普通窗口，里面只有一句“Hello, World”。在前文的基础上，可以分析一下这一段Hello World。

//下面来分析一下这其中每句话的含义，介绍如何初始化GTK+，使C语言程序在GTK+环境下运行。
&#160;
#include &#60;gtk/gtk.h&#62; //包含gtk库
&#160;
int main &#40;int argc, char *argv&#91;&#93;&#41;
&#123;
	GtkWidget *window;
	GtkWidget *label; //定义两个物件指针，用于操作物件。
&#160;
	//这一句是所有GTK+程序必须的：初始化GTK+库。每个GTK+程序必须用这个来使GTK+做好准备。
	gtk_init &#40;&#38;argc, &#38;argv&#41;;
&#160;
	//接下来这三句用于建立并设置一个窗口，几乎所有的GTK+程序都要新建窗口。
&#160;
	//建立一个新窗口，让window指向它。之后window就相当于这个窗口了。目前窗口中不包含任何物件。
	window = gtk_window_new &#40;GTK_WINDOW_TOPLEVEL&#41;;
&#160;
	//设置window标题为“Hello World”。
	//这里使用了类型转换宏GTK_WINDOW()。因为这里函数参数需要是GtkWindow*型，而window在定义的时候是GtkWidget*型的。
	gtk_window_set_title &#40;GTK_WINDOW &#40;window&#41;, &#34;Hello World&#34;&#41;;
&#160;
	//连接信号：将window的关闭（destroy）事件与退出主循环函数gtk_main_quit()绑定在一起，即窗口被关闭时程序结束。
	//G_CALLBACK()也是一个类型转换宏，它把普通函数变成信号回调函数。
	g_signal_connect &#40;window, &#34;destroy&#34;, G_CALLBACK &#40;gtk_main_quit&#41;, NULL&#41;;
&#160;
	//接下来写入窗口内容。窗口只包含一个文本(GtkLabel)。
&#160;
	//新建一个GtkLabel，让label指向它。之后label就相当于这个文本了。
	label = gtk_label_new &#40;&#34;Hello, World&#34;&#41;;
&#160;
	//把label插入母容器中。把window转换为容器（这是允许的，因为GtkWindow由GtkContainer派生），然后插入label。
	gtk_container_add &#40;GTK_CONTAINER &#40;window&#41;, label&#41;;
&#160;
	//接下来这两句也是所有GTK+程序必须的。
&#160;
	//显示所有物件。物件新建好后是隐藏的，用这个函数来显示window及它包含的内容。
	gtk_widget_show_all &#40;window&#41;;
&#160;
	//进入主循环，开始接受用户操作并处理各种事件。
	gtk_main &#40;&#41;;
&#160;
	return 0;
&#125;

程序内容很简洁，它只处理一个事件：关闭窗口。但是这个程序已经摆出了GTK+程序主函数编写的基本形式：使用gtk_init()初始化；建立窗口、组织窗口内容并连接信号；显示窗口；进入主循环。此外，编写回调函数并动态修改窗口内容通常也是必须的。基本所有GTK+程序都遵循这个规律。
可以想见的是，建立窗口、组织窗口内容是非常麻烦的事情。于是界面设计器应运而生，使得组织界面的工作不再由代码完成。下一部分内容会介绍使用界面设计器Glade的方法。
另外，有关GTK+物件、函数、常数的说明都可以在GTK+参考中找到。记得收藏GTK+参考的网址http://library.gnome.org/devel/gtk/stable/index.html，将来查找函数就靠它了！
还有疑问的话，请转至GTK+参考，或者在评论区留言给我。
本文由 最后的叶子 创作，转载或引用前请联系我们。

相关文章：学习使用GTK+ 1.构建GTK+编译环境学习使用GTK+ 3.使用GtkBuilder、界面设计器Glade和其他GTK+组件为自己的blogger博客加上标签云


相关文章：<ol><li><a href='http://blog.programet.org/2010/08/gtk-1.html' rel='bookmark' title='Permanent Link: 学习使用GTK+ 1.构建GTK+编译环境'>学习使用GTK+ 1.构建GTK+编译环境</a></li><li><a href='http://blog.programet.org/2010/09/gtk-3.html' rel='bookmark' title='Permanent Link: 学习使用GTK+ 3.使用GtkBuilder、界面设计器Glade和其他GTK+组件'>学习使用GTK+ 3.使用GtkBuilder、界面设计器Glade和其他GTK+组件</a></li><li><a href='http://blog.programet.org/2008/08/blogger.html' rel='bookmark' title='Permanent Link: 为自己的blogger博客加上标签云'>为自己的blogger博客加上标签云</a></li></ol>]]></description>
			<content:encoded><![CDATA[<p>这一部分是对最简单的GTK+（C语言）程序的一个解释，并介绍GTK+的基本概念和运作方式。如果内容存在错误，或者方法不适用与你的电脑，请在下方评论区留言给我，谢谢！<span id="more-3143"></span></p>
<h3>几个概念</h3>
<p>首先先来解释GTK+中几个基本的概念，以方便将来的分析。</p>
<p><strong>物件（GtkWidget）</strong>：GTK+中每一个窗口里的组成要素都被视为一个物件，如按钮、文本等等，窗口本身也是一个物件。总之GTK+的界面就是由物件构成的。注意，物件都使用指针来管理，物件外在表现就是一个特定类型的指针。</p>
<p><strong>容器（GtkContainer）</strong>：物件里的一大类，容器的特点是其内部能够容纳其他物件。容器最基本的功能之一是将各种物件良好地组织起来。GTK+的容器能在大小改变时自动调整内含物件的大小，这使得GTK+能够很智能地相应窗口或其他物件的大小改变。这为我们提供了很大的方便，往往我们不需要指定某个物件的大小，只需说明他所在的容器位置，GTK+会把物件的实际位置和大小自动计算出来（这比MFC强多了！）。</p>
<p><strong>继承、组合</strong>：虽然是C语言写的，但GTK+灵活地运用了面向对象思想。GTK+的物件体系中就有继承、组合这样的关系，如窗口（GtkWindow）是由容器（GtkContainer）派生出来的。</p>
<p><strong>类型转换宏</strong>：C语言本身没有“继承”这个概念，那么，如果直接把派生的物件直接当做基物件使用，会出现一个编译警告，即“隐式指针类型转换”，但不会出错。为了消除这个警告，需要做指针类型转换。一般情况下类型转换使用类型转换宏。类型转换宏内部会检查物件的继承关系，确定能否进行转换，然后再做显式类型转换。</p>
<p><strong>事件</strong>（event）：用户的操作，比如按下某个按钮或快捷键，被视为一个事件。</p>
<p><strong>信号</strong>（signal）：GTK+是基于信号回调（signal-slot）机制的。信号捆绑了一个事件和一个函数，在用户触发这个事件时，这个函数会被调用一次。从这个角度来说，GTK+是基于物件的，即程序围绕物件属性、事件、方法进行。</p>
<p><strong>主循环</strong>（main loop）：GTK+程序在一个主循环中运行。当一个事件被触发时，它将被插入队列中；在主循环中被触发的事件会被逐个处理（和这个事件绑定的函数被逐个调用）；没有事件被触发时，程序就处于等待状态，等待下一个事件被用户触发。直到退出主循环的函数被调用，GTK+程序才结束。</p>
<h3>GTK+命名规范</h3>
<p>GTK+拥有开源软件的很多特点，比如结构高度严谨，可读性甚好。现在介绍一下GTK+的关键字命名方式，以便阅读一段GTK+程序。</p>
<p><strong>普通变量类型名</strong>：全小写写法，以“g”开头，如“gint”。</p>
<p><strong>物件类型名</strong>：驼峰写法（首字母大写），以“Gtk”开头，形如“GtkWindow”。在GTK+内部，类型是向下面这样定义的（以GtkWindow为例）。</p>

<div class="wp_codebox"><table><tr id="p314313"><td class="code" id="p3143code13"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">typedef</span> _GtkWindow <span style="color: #009900;">&#123;</span> ... <span style="color: #009900;">&#125;</span> GtkWindow<span style="color: #339933;">;</span></pre></td></tr></table></div>

<p><strong>函数名</strong>：小写夹下划线写法，以“gtk_”为前缀，形如“gtk_main()”。如果是针对某类物件的函数，则前缀中还有物件类型名，形如“gtk_window_new()”。</p>
<p><strong>常数名</strong>：大写夹下划线写法，以“GTK_”为前缀，形如“GTK_WINDOW_TOPLEVEL”。</p>
<p><strong>类型转换宏</strong>：大写夹下划线写法，以“GTK_”为前缀。一般来说，宏名字和类型名相仿，比如要把GtkWindow*类型的物件转换为GtkContainer*类型，就使用宏“GTK_CONTAINER()”。</p>
<h3>GTK+的“Hello World”</h3>
<p>下面这段程序是GTK+的Hello World，它创建一个普通窗口，里面只有一句“Hello, World”。在前文的基础上，可以分析一下这一段Hello World。</p>

<div class="wp_codebox"><table><tr id="p314314"><td class="code" id="p3143code14"><pre class="c" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">//下面来分析一下这其中每句话的含义，介绍如何初始化GTK+，使C语言程序在GTK+环境下运行。</span>
&nbsp;
<span style="color: #339933;">#include &lt;gtk/gtk.h&gt; //包含gtk库</span>
&nbsp;
<span style="color: #993333;">int</span> main <span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> argc<span style="color: #339933;">,</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>argv<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	GtkWidget <span style="color: #339933;">*</span>window<span style="color: #339933;">;</span>
	GtkWidget <span style="color: #339933;">*</span>label<span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//定义两个物件指针，用于操作物件。</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">//这一句是所有GTK+程序必须的：初始化GTK+库。每个GTK+程序必须用这个来使GTK+做好准备。</span>
	gtk_init <span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>argc<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>argv<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">//接下来这三句用于建立并设置一个窗口，几乎所有的GTK+程序都要新建窗口。</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">//建立一个新窗口，让window指向它。之后window就相当于这个窗口了。目前窗口中不包含任何物件。</span>
	window <span style="color: #339933;">=</span> gtk_window_new <span style="color: #009900;">&#40;</span>GTK_WINDOW_TOPLEVEL<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">//设置window标题为“Hello World”。</span>
	<span style="color: #666666; font-style: italic;">//这里使用了类型转换宏GTK_WINDOW()。因为这里函数参数需要是GtkWindow*型，而window在定义的时候是GtkWidget*型的。</span>
	gtk_window_set_title <span style="color: #009900;">&#40;</span>GTK_WINDOW <span style="color: #009900;">&#40;</span>window<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;Hello World&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">//连接信号：将window的关闭（destroy）事件与退出主循环函数gtk_main_quit()绑定在一起，即窗口被关闭时程序结束。</span>
	<span style="color: #666666; font-style: italic;">//G_CALLBACK()也是一个类型转换宏，它把普通函数变成信号回调函数。</span>
	g_signal_connect <span style="color: #009900;">&#40;</span>window<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;destroy&quot;</span><span style="color: #339933;">,</span> G_CALLBACK <span style="color: #009900;">&#40;</span>gtk_main_quit<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> NULL<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">//接下来写入窗口内容。窗口只包含一个文本(GtkLabel)。</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">//新建一个GtkLabel，让label指向它。之后label就相当于这个文本了。</span>
	label <span style="color: #339933;">=</span> gtk_label_new <span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Hello, World&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">//把label插入母容器中。把window转换为容器（这是允许的，因为GtkWindow由GtkContainer派生），然后插入label。</span>
	gtk_container_add <span style="color: #009900;">&#40;</span>GTK_CONTAINER <span style="color: #009900;">&#40;</span>window<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> label<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">//接下来这两句也是所有GTK+程序必须的。</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">//显示所有物件。物件新建好后是隐藏的，用这个函数来显示window及它包含的内容。</span>
	gtk_widget_show_all <span style="color: #009900;">&#40;</span>window<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">//进入主循环，开始接受用户操作并处理各种事件。</span>
	gtk_main <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>程序内容很简洁，它只处理一个事件：关闭窗口。但是这个程序已经摆出了GTK+程序主函数编写的基本形式：使用gtk_init()初始化；建立窗口、组织窗口内容并连接信号；显示窗口；进入主循环。此外，编写回调函数并动态修改窗口内容通常也是必须的。基本所有GTK+程序都遵循这个规律。</p>
<p>可以想见的是，建立窗口、组织窗口内容是非常麻烦的事情。于是界面设计器应运而生，使得组织界面的工作不再由代码完成。下一部分内容会介绍使用界面设计器Glade的方法。</p>
<p>另外，有关GTK+物件、函数、常数的说明都可以在GTK+参考中找到。记得收藏GTK+参考的网址<a href="http://library.gnome.org/devel/gtk/stable/index.html">http://library.gnome.org/devel/gtk/stable/index.html</a>，将来查找函数就靠它了！</p>
<p>还有疑问的话，请转至GTK+参考，或者在评论区留言给我。</p>
<p><small>本文由 最后的叶子 创作，转载或引用前请<a href="mailto:programet.org@gmail.com">联系我们</a>。</small></p>

<p>相关文章：<ol><li><a href='http://blog.programet.org/2010/08/gtk-1.html' rel='bookmark' title='Permanent Link: 学习使用GTK+ 1.构建GTK+编译环境'>学习使用GTK+ 1.构建GTK+编译环境</a></li><li><a href='http://blog.programet.org/2010/09/gtk-3.html' rel='bookmark' title='Permanent Link: 学习使用GTK+ 3.使用GtkBuilder、界面设计器Glade和其他GTK+组件'>学习使用GTK+ 3.使用GtkBuilder、界面设计器Glade和其他GTK+组件</a></li><li><a href='http://blog.programet.org/2008/08/blogger.html' rel='bookmark' title='Permanent Link: 为自己的blogger博客加上标签云'>为自己的blogger博客加上标签云</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.programet.org/2010/09/gtk-2.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<series:name><![CDATA[学习使用GTK+]]></series:name>
	</item>
		<item>
		<title>简单的隐匿</title>
		<link>http://blog.programet.org/2010/08/%e7%ae%80%e5%8d%95%e7%9a%84%e9%9a%90%e5%8c%bf.html</link>
		<comments>http://blog.programet.org/2010/08/%e7%ae%80%e5%8d%95%e7%9a%84%e9%9a%90%e5%8c%bf.html#comments</comments>
		<pubDate>Tue, 31 Aug 2010 15:07:19 +0000</pubDate>
		<dc:creator>最后的叶子</dc:creator>
				<category><![CDATA[原创博文]]></category>
		<category><![CDATA[情感]]></category>
		<category><![CDATA[文学]]></category>

		<guid isPermaLink="false">http://blog.programet.org/?p=3129</guid>
		<description><![CDATA[从学校教学区走出去，有一个村子。村子拥有一个很有广州味的名字：穗石。
村里我去过一次，有些晕头转向，出来的时候一下子弄不清楚位置。不过靠近学校的位置我已经很熟悉了——那是一个商业小广场。可是这里并不很热闹，只是会有少部分学校学生来撑撑场。

广场靠近学校的一角有一家“正宗桂林米粉”。对于一个在外地的桂林人，这种店是不会轻易迈进的；大家都知道，全世界只有一座城市出产正宗桂林米粉。
在广州，我也进过几家桂林米粉店，无一例外让我失望。于是我的心态好了很多：就权当吃一次普通的煮粉或炒粉吧。
于是我终于走进了那家“正宗桂林米粉”。店里布置得很简单，也很干净，在穗石村所有小店里，应该算是装修最简洁的吧。白色的墙上有一本挂历，是桂林的。
“来桂林街头卖的那种米粉！”我突然觉得这样行得通。
“要不要辣？”“不要。”不过老板娘还是给我上了一盘带有酸笋的干拌粉。
我一惊。不禁拿起手机拍了下来。

吃了几口，味道和口感都还是让我满意了。不，这是个惊喜。
后来我和老板娘聊了起来，得知老板娘是桂林人，粉是从全州县进货的。我一下子明白了一些。我曾断言广州不可能有正宗的桂林米粉，因为广州没有米粉工艺和足够大的需求；看来早已有一群人让我的推理失效了。
我心中便升起一种感动来。对于在外的桂林人来说，桂林米粉便是家乡最朴素的象征，吃着米粉，就像呼吸到了家乡的新鲜空气，让人一下从四周的纷杂中抽出身来，投入家乡的美好印象中。
于是我特别敬重起这些在外的米粉工作者来。“我还会再来的。”我说。
只是临走前老板的一句叹息又不禁让我心中一沉：“这生意不好做啊……”我瞬间意识到，这家店几乎是村里最冷清的店之一。
的确，这样的米粉保持了桂林的特色，然而却不是那么容易赚钱。有时，这是一种不可调和的矛盾。
然而，却需要这样的专业精神。经济利益并不是一切。纵然这家店只是简单地隐匿在一个角落，也不能抛弃掉作为桂林人最基本的文化和追求。
我想，对于我也是一样，无论是创作还是工作，都要怀揣着精神原则与追求，不要让自己成为除利益外一无是处的东西。
“老板娘，我以后还会再来的！”
本文由 最后的叶子 创作，转载或引用前请联系我们。]]></description>
			<content:encoded><![CDATA[<p>从学校教学区走出去，有一个村子。村子拥有一个很有广州味的名字：穗石。</p>
<p>村里我去过一次，有些晕头转向，出来的时候一下子弄不清楚位置。不过靠近学校的位置我已经很熟悉了——那是一个商业小广场。可是这里并不很热闹，只是会有少部分学校学生来撑撑场。</p>
<p><span id="more-3129"></span></p>
<p>广场靠近学校的一角有一家“正宗桂林米粉”。对于一个在外地的桂林人，这种店是不会轻易迈进的；大家都知道，全世界只有一座城市出产正宗桂林米粉。</p>
<p>在广州，我也进过几家桂林米粉店，无一例外让我失望。于是我的心态好了很多：就权当吃一次普通的煮粉或炒粉吧。</p>
<p>于是我终于走进了那家“正宗桂林米粉”。店里布置得很简单，也很干净，在穗石村所有小店里，应该算是装修最简洁的吧。白色的墙上有一本挂历，是桂林的。</p>
<p>“来桂林街头卖的那种米粉！”我突然觉得这样行得通。</p>
<p>“要不要辣？”“不要。”不过老板娘还是给我上了一盘带有酸笋的干拌粉。</p>
<p>我一惊。不禁拿起手机拍了下来。</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-3130" title="IMG00157" src="http://blog.programet.org/index.php?feedimage=wp-content/uploads/IMG00157.jpg" alt="" width="461" height="346" /></p>
<p>吃了几口，味道和口感都还是让我满意了。不，这是个惊喜。</p>
<p>后来我和老板娘聊了起来，得知老板娘是桂林人，粉是从全州县进货的。我一下子明白了一些。我曾断言广州不可能有正宗的桂林米粉，因为广州没有米粉工艺和足够大的需求；看来早已有一群人让我的推理失效了。</p>
<p>我心中便升起一种感动来。对于在外的桂林人来说，桂林米粉便是家乡最朴素的象征，吃着米粉，就像呼吸到了家乡的新鲜空气，让人一下从四周的纷杂中抽出身来，投入家乡的美好印象中。</p>
<p>于是我特别敬重起这些在外的米粉工作者来。“我还会再来的。”我说。</p>
<p>只是临走前老板的一句叹息又不禁让我心中一沉：“这生意不好做啊……”我瞬间意识到，这家店几乎是村里最冷清的店之一。</p>
<p>的确，这样的米粉保持了桂林的特色，然而却不是那么容易赚钱。有时，这是一种不可调和的矛盾。</p>
<p>然而，却需要这样的专业精神。经济利益并不是一切。纵然这家店只是简单地隐匿在一个角落，也不能抛弃掉作为桂林人最基本的文化和追求。</p>
<p>我想，对于我也是一样，无论是创作还是工作，都要怀揣着精神原则与追求，不要让自己成为除利益外一无是处的东西。</p>
<p>“老板娘，我以后还会再来的！”</p>
<p><small>本文由 最后的叶子 创作，转载或引用前请<a href="mailto:programet.org@gmail.com">联系我们</a>。</small></p>]]></content:encoded>
			<wfw:commentRss>http://blog.programet.org/2010/08/%e7%ae%80%e5%8d%95%e7%9a%84%e9%9a%90%e5%8c%bf.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>天际</title>
		<link>http://blog.programet.org/2010/08/%e5%a4%a9%e9%99%85.html</link>
		<comments>http://blog.programet.org/2010/08/%e5%a4%a9%e9%99%85.html#comments</comments>
		<pubDate>Mon, 30 Aug 2010 16:42:11 +0000</pubDate>
		<dc:creator>最后的叶子</dc:creator>
				<category><![CDATA[原创博文]]></category>
		<category><![CDATA[情感]]></category>
		<category><![CDATA[抒情小说]]></category>
		<category><![CDATA[文学]]></category>

		<guid isPermaLink="false">http://blog.programet.org/?p=3124</guid>
		<description><![CDATA[她已经上船了。独自，还有那伴着她多年的藤椅。
我们望着对方，默默地，伤愁，却又装着淡然。周围的人也和我一样，只是默默地注视，仿佛什么庄重与神圣即将降临。

然而似乎什么也没发生。我们仅仅是一群蚂蚁，呆呆地看着；和蚂蚁不同的是，我们在掩饰着心中的低沉。
低沉。就像天上的云，沉沉的灰色遮住了明丽的天蓝。云压得很低，然而它们还不能完全体味我的心境。
并没有下雨。人们也没有悲痛。只是默默地注视。
一片叶子落下来，躺在了我和她之间的土地上。
我蹲下来，轻轻拾起，把它捧在手心，又用脸轻触它，然后走到树根前，轻轻把它插在土地上。也许，它感到我的温暖了吧。
又有一片叶子缓缓飘下来。它到了水面上，随着它的水儿飘走了，离岸边越来越远。
谁都不知道它会在哪里落脚。也许，它会漂泊，它会去环游世界吧。
人们没有动，只是在心里惦念着，就像叶子们。
一位长者走了出来，从容，又有些迟缓，我似乎看得到他的心情。
他给了小船自由。
蝉鸣停住了，鸟儿也静止了。没有什么在变化，没有任何声响，只是，船儿越飘越远……
她飘向了天边。小了，模糊了。几近消失。
天边亮着。没有云遮住，阳光肆意地给天边染色。
我看到她了，在天边的，是她慈祥的笑容——对，就挂在那儿，那个明亮的角落。她在那里点亮了一盏灯，试着消除我们心中一切不安与伤痛。
那是她最美丽的时刻，最美丽的样子，胜过从前的任何……
很久，却期待着能再久一些。
可是渐渐地，人们散去了。我也转过身去。
有人又拿起锯子，开始造下一只小船来。的确，有些东西消失得太快太快，过去得太快太快了。
“什么时候能做好？”我问他。
“不知道。也许马上，也许很久很久以后。”
祖母于26日去世，作此文以表达思念。
本文由 最后的叶子 创作，转载或引用前请联系我们。

相关文章：从不知道你在想什么？想她。(3)你在想什么？想她。(5)


相关文章：<ol><li><a href='http://blog.programet.org/2009/06/neverknow.html' rel='bookmark' title='Permanent Link: 从不知道'>从不知道</a></li><li><a href='http://blog.programet.org/2009/10/%e4%bd%a0%e5%9c%a8%e6%83%b3%e4%bb%80%e4%b9%88%ef%bc%9f%e6%83%b3%e5%a5%b9%e3%80%823.html' rel='bookmark' title='Permanent Link: 你在想什么？想她。(3)'>你在想什么？想她。(3)</a></li><li><a href='http://blog.programet.org/2010/02/%e4%bd%a0%e5%9c%a8%e6%83%b3%e4%bb%80%e4%b9%88%ef%bc%9f%e6%83%b3%e5%a5%b9%e3%80%825.html' rel='bookmark' title='Permanent Link: 你在想什么？想她。(5)'>你在想什么？想她。(5)</a></li></ol>]]></description>
			<content:encoded><![CDATA[<p>她已经上船了。独自，还有那伴着她多年的藤椅。</p>
<p>我们望着对方，默默地，伤愁，却又装着淡然。周围的人也和我一样，只是默默地注视，仿佛什么庄重与神圣即将降临。</p>
<p><span id="more-3124"></span></p>
<p>然而似乎什么也没发生。我们仅仅是一群蚂蚁，呆呆地看着；和蚂蚁不同的是，我们在掩饰着心中的低沉。</p>
<p>低沉。就像天上的云，沉沉的灰色遮住了明丽的天蓝。云压得很低，然而它们还不能完全体味我的心境。</p>
<p>并没有下雨。人们也没有悲痛。只是默默地注视。</p>
<p>一片叶子落下来，躺在了我和她之间的土地上。</p>
<p>我蹲下来，轻轻拾起，把它捧在手心，又用脸轻触它，然后走到树根前，轻轻把它插在土地上。也许，它感到我的温暖了吧。</p>
<p>又有一片叶子缓缓飘下来。它到了水面上，随着它的水儿飘走了，离岸边越来越远。</p>
<p>谁都不知道它会在哪里落脚。也许，它会漂泊，它会去环游世界吧。</p>
<p>人们没有动，只是在心里惦念着，就像叶子们。</p>
<p>一位长者走了出来，从容，又有些迟缓，我似乎看得到他的心情。</p>
<p>他给了小船自由。</p>
<p>蝉鸣停住了，鸟儿也静止了。没有什么在变化，没有任何声响，只是，船儿越飘越远……</p>
<p>她飘向了天边。小了，模糊了。几近消失。</p>
<p>天边亮着。没有云遮住，阳光肆意地给天边染色。</p>
<p>我看到她了，在天边的，是她慈祥的笑容——对，就挂在那儿，那个明亮的角落。她在那里点亮了一盏灯，试着消除我们心中一切不安与伤痛。</p>
<p>那是她最美丽的时刻，最美丽的样子，胜过从前的任何……</p>
<p>很久，却期待着能再久一些。</p>
<p>可是渐渐地，人们散去了。我也转过身去。</p>
<p>有人又拿起锯子，开始造下一只小船来。的确，有些东西消失得太快太快，过去得太快太快了。</p>
<p>“什么时候能做好？”我问他。</p>
<p>“不知道。也许马上，也许很久很久以后。”</p>
<p><em><span style="color: #3366ff;"><strong>祖母于26日去世，作此文以表达思念。</strong></span></em></p>
<p><small>本文由 最后的叶子 创作，转载或引用前请<a href="mailto:programet.org@gmail.com">联系我们</a>。</small></p>

<p>相关文章：<ol><li><a href='http://blog.programet.org/2009/06/neverknow.html' rel='bookmark' title='Permanent Link: 从不知道'>从不知道</a></li><li><a href='http://blog.programet.org/2009/10/%e4%bd%a0%e5%9c%a8%e6%83%b3%e4%bb%80%e4%b9%88%ef%bc%9f%e6%83%b3%e5%a5%b9%e3%80%823.html' rel='bookmark' title='Permanent Link: 你在想什么？想她。(3)'>你在想什么？想她。(3)</a></li><li><a href='http://blog.programet.org/2010/02/%e4%bd%a0%e5%9c%a8%e6%83%b3%e4%bb%80%e4%b9%88%ef%bc%9f%e6%83%b3%e5%a5%b9%e3%80%825.html' rel='bookmark' title='Permanent Link: 你在想什么？想她。(5)'>你在想什么？想她。(5)</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.programet.org/2010/08/%e5%a4%a9%e9%99%85.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>学习使用GTK+ 1.构建GTK+编译环境</title>
		<link>http://blog.programet.org/2010/08/gtk-1.html</link>
		<comments>http://blog.programet.org/2010/08/gtk-1.html#comments</comments>
		<pubDate>Sun, 29 Aug 2010 17:07:19 +0000</pubDate>
		<dc:creator>最后的叶子</dc:creator>
				<category><![CDATA[原创博文]]></category>
		<category><![CDATA[程序]]></category>
		<category><![CDATA[计算机]]></category>

		<guid isPermaLink="false">http://blog.programet.org/?p=3114</guid>
		<description><![CDATA[这一部分介绍的是在Windows/Linux下配置GTK+（C语言）编译及运行环境的方法。如果内容存在错误，或者方法不适用与你的电脑，请在下方评论区留言给我，谢谢！
在Linux下配置GTK+编译环境
Linux的X Window是GTK+主要应用的地方，在Linux下配置GTK+应该是比较容易成功的。当然，你的Linux需要有GNOME或Xfce这样的桌面环境（不建议在KDE下运行GTK+应用程序）。
如果你的Linux像Ubuntu这样有一个软件库，那就太方便了，直接安装包libgtk2.0-dev即可。如果不能直接安装软件包，你还可以直接到http://www.gtk.org/download-linux.html下载，那个安装指南会对你有帮助的。
然后是编辑器的问题。像Anjuta这样的编辑器可以直接创建GTK+项目，你可以利用这个功能，很方便。如果你的编辑器不能创建GTK+项目，或者你根本不打算用编辑器，你可以用pkgconfig命令获得你用gcc编译时所需的参数：

pkg-config --cflags --libs gtk+-2.0

这一系列以后的文章中会用到Glade界面设计器，请安装包glade或到http://ftp.gnome.org/pub/GNOME/sources/glade3/3.6/下载Source来编译。要注意的是，Glade本身也是一个GTK+应用程序，需要在GTK+的桌面环境中运行。
在Windows下配置GTK+编译环境
在Windows下配置编译环境就有些麻烦。这里看来要用支持创建GTK+项目的编辑器来帮忙了。
这里介绍在Code::Blocks编辑器和MinGW GCC编译器下编译GTK+程序的方法。（其实在Visual Studio下也可以编译GTK+的，但是这里不推荐。）
装好Code::Blocks
如果你不熟悉Code::Blocks，建议看看我以前写的这篇文章。
安装GTK+开发库和Glade界面编辑器
这里介绍一个简单的方法。Glade有的发布版直接包含有GTK+开发库。到Glade主页http://glade.gnome.org/右边的Windows Binaries中找Glade3-x.x.x-with-gtk.exe这样的版本下载安装。建议装到C:\gtk\。
但是可能Glade自带的GTK+开发库不是最新的，无法实现一下高版本的GTK+提供的功能，因此最好到GTK+下载页http://www.gtk.org/download-windows.html下载一个All-in-one bundles。下载下来之后直接解压到刚刚Glade的安装目录即可。
在Code::Blocks中建立GTK+项目
Code::Blocks中，File-&#62;New-&#62;Project中应该会有GTK+ Project这一选项。按着向导新建即可，但要注意几个地方：项目文件完整路径必须是英文的，Code::Blocks对中文路径和文件名支持不佳；GTK&#8217;s location必须指定为你刚刚安装的GTK+开发库所在文件夹。
测试你的编译环境
就拿Code::Blocks为我们自动生成的这段程序做测试吧：

#include &#60;stdlib.h&#62;
#include &#60;gtk/gtk.h&#62;
&#160;
static void helloWorld &#40;GtkWidget *wid, GtkWidget *win&#41;
&#123;
  GtkWidget *dialog = NULL;
&#160;
  dialog = gtk_message_dialog_new &#40;GTK_WINDOW &#40;win&#41;, GTK_DIALOG_MODAL, GTK_MESSAGE_INFO, GTK_BUTTONS_CLOSE, &#34;Hello World!&#34;&#41;;
  gtk_window_set_position &#40;GTK_WINDOW &#40;dialog&#41;, GTK_WIN_POS_CENTER&#41;;
  gtk_dialog_run &#40;GTK_DIALOG &#40;dialog&#41;&#41;;
  gtk_widget_destroy &#40;dialog&#41;;
&#125;
&#160;
int main &#40;int argc, char *argv&#91;&#93;&#41;
&#123;
  GtkWidget *button [...]


相关文章：<ol><li><a href='http://blog.programet.org/2010/09/gtk-2.html' rel='bookmark' title='Permanent Link: 学习使用GTK+ 2.GTK+“Hello World”——对GTK+运作机制的通俗介绍'>学习使用GTK+ 2.GTK+“Hello World”——对GTK+运作机制的通俗介绍</a></li><li><a href='http://blog.programet.org/2010/09/gtk-3.html' rel='bookmark' title='Permanent Link: 学习使用GTK+ 3.使用GtkBuilder、界面设计器Glade和其他GTK+组件'>学习使用GTK+ 3.使用GtkBuilder、界面设计器Glade和其他GTK+组件</a></li><li><a href='http://blog.programet.org/2010/08/gtk-0.html' rel='bookmark' title='Permanent Link: 学习使用GTK+ 0.概述'>学习使用GTK+ 0.概述</a></li></ol>]]></description>
			<content:encoded><![CDATA[<p>这一部分介绍的是在Windows/Linux下配置GTK+（C语言）编译及运行环境的方法。如果内容存在错误，或者方法不适用与你的电脑，请在下方评论区留言给我，谢谢！<span id="more-3114"></span></p>
<h3>在Linux下配置GTK+编译环境</h3>
<p>Linux的X Window是GTK+主要应用的地方，在Linux下配置GTK+应该是比较容易成功的。当然，你的Linux需要有GNOME或Xfce这样的桌面环境（不建议在KDE下运行GTK+应用程序）。</p>
<p>如果你的Linux像Ubuntu这样有一个软件库，那就太方便了，直接安装包libgtk2.0-dev即可。如果不能直接安装软件包，你还可以直接到<a href="http://www.gtk.org/download-linux.html">http://www.gtk.org/download-linux.html</a>下载，那个<a href="http://library.gnome.org/devel/gtk/unstable/gtk-building.html">安装指南</a>会对你有帮助的。</p>
<p>然后是编辑器的问题。像Anjuta这样的编辑器可以直接创建GTK+项目，你可以利用这个功能，很方便。如果你的编辑器不能创建GTK+项目，或者你根本不打算用编辑器，你可以用pkgconfig命令获得你用gcc编译时所需的参数：</p>

<div class="wp_codebox"><table><tr id="p311417"><td class="code" id="p3114code17"><pre class="c" style="font-family:monospace;">pkg<span style="color: #339933;">-</span>config <span style="color: #339933;">--</span>cflags <span style="color: #339933;">--</span>libs gtk<span style="color: #339933;">+-</span><span style="color:#800080;">2.0</span></pre></td></tr></table></div>

<p>这一系列以后的文章中会用到Glade界面设计器，请安装包glade或到<a href="http://ftp.gnome.org/pub/GNOME/sources/glade3/3.6/">http://ftp.gnome.org/pub/GNOME/sources/glade3/3.6/</a>下载Source来编译。要注意的是，Glade本身也是一个GTK+应用程序，需要在GTK+的桌面环境中运行。</p>
<h3>在Windows下配置GTK+编译环境</h3>
<p>在Windows下配置编译环境就有些麻烦。这里看来要用支持创建GTK+项目的编辑器来帮忙了。</p>
<p>这里介绍在Code::Blocks编辑器和MinGW GCC编译器下编译GTK+程序的方法。（其实在Visual Studio下也可以编译GTK+的，但是这里不推荐。）</p>
<p><strong>装好Code::Blocks</strong></p>
<p>如果你不熟悉Code::Blocks，建议看看我以前写的<a href="http://blog.programet.org/2010/04/mingw-codeblocks.html">这篇文章</a>。</p>
<p><strong>安装GTK+开发库和Glade界面编辑器</strong></p>
<p>这里介绍一个简单的方法。Glade有的发布版直接包含有GTK+开发库。到Glade主页<a href="http://glade.gnome.org/">http://glade.gnome.org/</a>右边的Windows Binaries中找Glade3-x.x.x-with-gtk.exe这样的版本下载安装。建议装到C:\gtk\。</p>
<p>但是可能Glade自带的GTK+开发库不是最新的，无法实现一下高版本的GTK+提供的功能，因此最好到GTK+下载页<a href="http://www.gtk.org/download-windows.html">http://www.gtk.org/download-windows.html</a>下载一个All-in-one bundles。下载下来之后直接解压到刚刚Glade的安装目录即可。</p>
<p><strong>在Code::Blocks中建立GTK+项目</strong></p>
<p>Code::Blocks中，File-&gt;New-&gt;Project中应该会有GTK+ Project这一选项。按着向导新建即可，但要注意几个地方：项目文件完整路径必须是英文的，Code::Blocks对中文路径和文件名支持不佳；GTK&#8217;s location必须指定为你刚刚安装的GTK+开发库所在文件夹。</p>
<h3>测试你的编译环境</h3>
<p>就拿Code::Blocks为我们自动生成的这段程序做测试吧：</p>

<div class="wp_codebox"><table><tr id="p311418"><td class="code" id="p3114code18"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;stdlib.h&gt;</span>
<span style="color: #339933;">#include &lt;gtk/gtk.h&gt;</span>
&nbsp;
<span style="color: #993333;">static</span> <span style="color: #993333;">void</span> helloWorld <span style="color: #009900;">&#40;</span>GtkWidget <span style="color: #339933;">*</span>wid<span style="color: #339933;">,</span> GtkWidget <span style="color: #339933;">*</span>win<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  GtkWidget <span style="color: #339933;">*</span>dialog <span style="color: #339933;">=</span> NULL<span style="color: #339933;">;</span>
&nbsp;
  dialog <span style="color: #339933;">=</span> gtk_message_dialog_new <span style="color: #009900;">&#40;</span>GTK_WINDOW <span style="color: #009900;">&#40;</span>win<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> GTK_DIALOG_MODAL<span style="color: #339933;">,</span> GTK_MESSAGE_INFO<span style="color: #339933;">,</span> GTK_BUTTONS_CLOSE<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;Hello World!&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  gtk_window_set_position <span style="color: #009900;">&#40;</span>GTK_WINDOW <span style="color: #009900;">&#40;</span>dialog<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> GTK_WIN_POS_CENTER<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  gtk_dialog_run <span style="color: #009900;">&#40;</span>GTK_DIALOG <span style="color: #009900;">&#40;</span>dialog<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  gtk_widget_destroy <span style="color: #009900;">&#40;</span>dialog<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">int</span> main <span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> argc<span style="color: #339933;">,</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>argv<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  GtkWidget <span style="color: #339933;">*</span>button <span style="color: #339933;">=</span> NULL<span style="color: #339933;">;</span>
  GtkWidget <span style="color: #339933;">*</span>win <span style="color: #339933;">=</span> NULL<span style="color: #339933;">;</span>
  GtkWidget <span style="color: #339933;">*</span>vbox <span style="color: #339933;">=</span> NULL<span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #808080; font-style: italic;">/* Initialize GTK+ */</span>
  g_log_set_handler <span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Gtk&quot;</span><span style="color: #339933;">,</span> G_LOG_LEVEL_WARNING<span style="color: #339933;">,</span> <span style="color: #009900;">&#40;</span>GLogFunc<span style="color: #009900;">&#41;</span> gtk_false<span style="color: #339933;">,</span> NULL<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  gtk_init <span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>argc<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>argv<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  g_log_set_handler <span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Gtk&quot;</span><span style="color: #339933;">,</span> G_LOG_LEVEL_WARNING<span style="color: #339933;">,</span> g_log_default_handler<span style="color: #339933;">,</span> NULL<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #808080; font-style: italic;">/* Create the main window */</span>
  win <span style="color: #339933;">=</span> gtk_window_new <span style="color: #009900;">&#40;</span>GTK_WINDOW_TOPLEVEL<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  gtk_container_set_border_width <span style="color: #009900;">&#40;</span>GTK_CONTAINER <span style="color: #009900;">&#40;</span>win<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">8</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  gtk_window_set_title <span style="color: #009900;">&#40;</span>GTK_WINDOW <span style="color: #009900;">&#40;</span>win<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;Hello World&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  gtk_window_set_position <span style="color: #009900;">&#40;</span>GTK_WINDOW <span style="color: #009900;">&#40;</span>win<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> GTK_WIN_POS_CENTER<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  gtk_widget_realize <span style="color: #009900;">&#40;</span>win<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  g_signal_connect <span style="color: #009900;">&#40;</span>win<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;destroy&quot;</span><span style="color: #339933;">,</span> gtk_main_quit<span style="color: #339933;">,</span> NULL<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #808080; font-style: italic;">/* Create a vertical box with buttons */</span>
  vbox <span style="color: #339933;">=</span> gtk_vbox_new <span style="color: #009900;">&#40;</span>TRUE<span style="color: #339933;">,</span> <span style="color: #0000dd;">6</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  gtk_container_add <span style="color: #009900;">&#40;</span>GTK_CONTAINER <span style="color: #009900;">&#40;</span>win<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> vbox<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  button <span style="color: #339933;">=</span> gtk_button_new_from_stock <span style="color: #009900;">&#40;</span>GTK_STOCK_DIALOG_INFO<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  g_signal_connect <span style="color: #009900;">&#40;</span>G_OBJECT <span style="color: #009900;">&#40;</span>button<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;clicked&quot;</span><span style="color: #339933;">,</span> G_CALLBACK <span style="color: #009900;">&#40;</span>helloWorld<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#40;</span>gpointer<span style="color: #009900;">&#41;</span> win<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  gtk_box_pack_start <span style="color: #009900;">&#40;</span>GTK_BOX <span style="color: #009900;">&#40;</span>vbox<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> button<span style="color: #339933;">,</span> TRUE<span style="color: #339933;">,</span> TRUE<span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  button <span style="color: #339933;">=</span> gtk_button_new_from_stock <span style="color: #009900;">&#40;</span>GTK_STOCK_CLOSE<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  g_signal_connect <span style="color: #009900;">&#40;</span>button<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;clicked&quot;</span><span style="color: #339933;">,</span> gtk_main_quit<span style="color: #339933;">,</span> NULL<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  gtk_box_pack_start <span style="color: #009900;">&#40;</span>GTK_BOX <span style="color: #009900;">&#40;</span>vbox<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> button<span style="color: #339933;">,</span> TRUE<span style="color: #339933;">,</span> TRUE<span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #808080; font-style: italic;">/* Enter the main loop */</span>
  gtk_widget_show_all <span style="color: #009900;">&#40;</span>win<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  gtk_main <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>这段程序会建立一个有两个按钮的窗口。Windows下还会另外有个小黑窗口，方便调试用的；指定Build-&gt;Select target-&gt;Release之后再编译，编译出来的“Release”版本就没有小黑窗口了。</p>
<p>如果你编译失败——不幸，但是你可以在下面留言给我。</p>
<h3>在Windows下制作一个GTK+运行环境</h3>
<p>你需要明白的是，GTK+是需要运行库的——Linux下一般都会自带有，Windows下就没那么幸运了。如果你的程序需要在别人的电脑上运行，你往往需要附带一个GTK+运行库，运行库的制作方法是把<a href="http://www.gtk.org/download-windows.html">http://www.gtk.org/download-windows.html</a>中的所有Binary组合起来。</p>
<p>为了方便大家，我自己做了一个运行库，经过一定精简（只有中英两种语言），大小13MB（压缩后3MB）。大家可以<a href="http://www.brsbox.com/filebox/down/fc/31f19cd4e423b9193cc57ccb35346228" target="_blank">到这里下载</a>。</p>
<p>用法就是把程序及程序用到的文件放进来，使程序与运行库的那堆dll在同一级文件夹下。然后整个文件夹就可以作为便携软件在不含GTK+的Windows中使用了。</p>
<p>另外，GTK+运行库是支持主题的。你可以为GTK+指定主题，给那些按钮换一个样子。GTK+主题文件位于运行库的\etc\gtk-2.0文件夹中，名为gtkrc。我制作的运行库指定了GTK+使用Windows主题。你可以在网上搜出很多GTK+ themes，使用方法就是替换gtkrc文件。</p>
<p><small>本文由 最后的叶子 创作，转载或引用前请<a href="mailto:programet.org@gmail.com">联系我们</a>。</small></p>

<p>相关文章：<ol><li><a href='http://blog.programet.org/2010/09/gtk-2.html' rel='bookmark' title='Permanent Link: 学习使用GTK+ 2.GTK+“Hello World”——对GTK+运作机制的通俗介绍'>学习使用GTK+ 2.GTK+“Hello World”——对GTK+运作机制的通俗介绍</a></li><li><a href='http://blog.programet.org/2010/09/gtk-3.html' rel='bookmark' title='Permanent Link: 学习使用GTK+ 3.使用GtkBuilder、界面设计器Glade和其他GTK+组件'>学习使用GTK+ 3.使用GtkBuilder、界面设计器Glade和其他GTK+组件</a></li><li><a href='http://blog.programet.org/2010/08/gtk-0.html' rel='bookmark' title='Permanent Link: 学习使用GTK+ 0.概述'>学习使用GTK+ 0.概述</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.programet.org/2010/08/gtk-1.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<series:name><![CDATA[学习使用GTK+]]></series:name>
	</item>
		<item>
		<title>你在想什么？想她。(24)</title>
		<link>http://blog.programet.org/2010/08/%e4%bd%a0%e5%9c%a8%e6%83%b3%e4%bb%80%e4%b9%88%ef%bc%9f%e6%83%b3%e5%a5%b9%e3%80%8224.html</link>
		<comments>http://blog.programet.org/2010/08/%e4%bd%a0%e5%9c%a8%e6%83%b3%e4%bb%80%e4%b9%88%ef%bc%9f%e6%83%b3%e5%a5%b9%e3%80%8224.html#comments</comments>
		<pubDate>Sun, 22 Aug 2010 02:27:09 +0000</pubDate>
		<dc:creator>最后的叶子</dc:creator>
				<category><![CDATA[原创博文]]></category>
		<category><![CDATA[情感]]></category>

		<guid isPermaLink="false">http://blog.programet.org/?p=3092</guid>
		<description><![CDATA[怎样才能把你暂时藏在脑子的角落里？
想你。不论什么时候，不论身在何方，不论在做什么、想什么。
想着想着，便会想到你。原本的思路中断了，思维的空间被你占领了，久久不能摆脱你；可以想到的都和你有关，各种想法都在绕着你打转，逃不出来。你就像那个可爱又有些淘气的小女孩，在安静的时候突然跳出来，献出一个惊喜，然后把目光和思维都牵走，让它们都指向你而不能移开，让你成为它们的主宰和装饰，占领我的整个世界。

虽然你不在我旁边，我依然可以清晰地感觉。
想你。脑子里不能没有你。于是特别关注起你的点点滴滴来。当出现有关你的风吹草动，当你的名字出现在屏幕上，我都会感到心跳加速，你的样子，在眼前久久不散……
无论世事如何变迁，有你在我心里就好……
本文由 最后的叶子 创作，转载或引用前请联系我们。

相关文章：纪念短篇小说家欧·亨利逝世100周年


相关文章：<ol><li><a href='http://blog.programet.org/2010/06/%e7%ba%aa%e5%bf%b5%e7%9f%ad%e7%af%87%e5%b0%8f%e8%af%b4%e5%ae%b6%e6%ac%a7%c2%b7%e4%ba%a8%e5%88%a9%e9%80%9d%e4%b8%96100%e5%91%a8%e5%b9%b4.html' rel='bookmark' title='Permanent Link: 纪念短篇小说家欧·亨利逝世100周年'>纪念短篇小说家欧·亨利逝世100周年</a></li></ol>]]></description>
			<content:encoded><![CDATA[<p>怎样才能把你暂时藏在脑子的角落里？</p>
<p>想你。不论什么时候，不论身在何方，不论在做什么、想什么。</p>
<p>想着想着，便会想到你。原本的思路中断了，思维的空间被你占领了，久久不能摆脱你；可以想到的都和你有关，各种想法都在绕着你打转，逃不出来。你就像那个可爱又有些淘气的小女孩，在安静的时候突然跳出来，献出一个惊喜，然后把目光和思维都牵走，让它们都指向你而不能移开，让你成为它们的主宰和装饰，占领我的整个世界。</p>
<p><span id="more-3092"></span></p>
<p>虽然你不在我旁边，我依然可以清晰地感觉。</p>
<p>想你。脑子里不能没有你。于是特别关注起你的点点滴滴来。当出现有关你的风吹草动，当你的名字出现在屏幕上，我都会感到心跳加速，你的样子，在眼前久久不散……</p>
<p>无论世事如何变迁，有你在我心里就好……</p>
<p><small>本文由 最后的叶子 创作，转载或引用前请<a href="mailto:programet.org@gmail.com">联系我们</a>。</small></p>

<p>相关文章：<ol><li><a href='http://blog.programet.org/2010/06/%e7%ba%aa%e5%bf%b5%e7%9f%ad%e7%af%87%e5%b0%8f%e8%af%b4%e5%ae%b6%e6%ac%a7%c2%b7%e4%ba%a8%e5%88%a9%e9%80%9d%e4%b8%96100%e5%91%a8%e5%b9%b4.html' rel='bookmark' title='Permanent Link: 纪念短篇小说家欧·亨利逝世100周年'>纪念短篇小说家欧·亨利逝世100周年</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.programet.org/2010/08/%e4%bd%a0%e5%9c%a8%e6%83%b3%e4%bb%80%e4%b9%88%ef%bc%9f%e6%83%b3%e5%a5%b9%e3%80%8224.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<series:name><![CDATA[你在想什么？想她。]]></series:name>
	</item>
		<item>
		<title>Half a World Away (5)</title>
		<link>http://blog.programet.org/2010/08/half-a-world-away-5.html</link>
		<comments>http://blog.programet.org/2010/08/half-a-world-away-5.html#comments</comments>
		<pubDate>Wed, 18 Aug 2010 16:50:55 +0000</pubDate>
		<dc:creator>最后的叶子</dc:creator>
				<category><![CDATA[原创博文]]></category>
		<category><![CDATA[情感]]></category>
		<category><![CDATA[文学]]></category>
		<category><![CDATA[现代主义]]></category>
		<category><![CDATA[音乐]]></category>

		<guid isPermaLink="false">http://blog.programet.org/2010/08/half-a-world-away-5.html</guid>
		<description><![CDATA[我听得到，雨打在叶子上的声音。
那像是钢琴键盘被无意触动了，轻轻地，流出一个音符。音符是如此纯净，没有丝毫杂质；然而她又久久不愿离去，似乎就在那儿看着我。我便沉迷于她创造的氛围中，悠长，宁谧。

似乎世界上也只剩下这音符了。周围都静了，只有它还在扩散，慢慢地，铺遍了天边。
人们都止住了步子，中断了闲谈，看着音符激起的波纹向四周扩散开去。没有了喧闹，没有了熙熙攘攘，只是若有所思。
雨。
就像这雨。黯淡，伤感。心境。
窗外多了几层白纱。视界灰白了。就像老照片，把色彩都抹去了，只留下枯燥的明明暗暗。然而这样的明暗差异也被雨冲淡了，没有黑，没有白。只有灰。那是墨迹被雨水浸润扩散了。或许再过一会儿，深深浅浅的灰也将最终归于一致，那是心里的颜色。
视界乱了。原本明晰的楼、树也被揉成了一团。像是龙卷风刚刚光临，把一切都搅得乱七八糟。只想，只想把它们撕下，彻底地揉成一个纸团，狠狠地扔向那个最遥远的角落；可是我是那么无力……
只好颤颤巍巍地伸出手，触摸那些雨滴。它们砸得很重、很重，不，不是砸在我的手上，是砸在我的神经上，我最敏感最脆弱的神经上。忽然，又觉得那不是太多的痛苦，而是，心伤。
雨滴们弄湿了我的手，还有我的眼睛，还有我的心。更模糊了，连雨声也模糊了，原本的尖利被浇得暗淡了，却显得愈发伤重起来，就像那首Half a World Away……
不知道，在半个世界之外，是不是也在下雨，是不是也有人呆呆地站在窗边。是不是她也和我在分享心情……
这里，在下雨，在你的半个世界之外。你，也是吗？
我会为你 / 跨越半个世界 / 可这又能怎样 / 如果你已不在那里 / 直到你回来 / 直到你的前路已经清晰 / 我会在这里 / 而不在半个世界之外……

本文由 最后的叶子 创作，转载或引用前请联系我们。

相关文章：Half a World Away (4)Half a World AwayHalf A World Away (2)


相关文章：<ol><li><a href='http://blog.programet.org/2010/03/half-a-world-away-4.html' rel='bookmark' title='Permanent Link: Half a World Away (4)'>Half a World Away (4)</a></li><li><a href='http://blog.programet.org/2009/07/half-a-world-away.html' rel='bookmark' title='Permanent Link: Half a World Away'>Half a World Away</a></li><li><a href='http://blog.programet.org/2009/08/half-a-world-away-2.html' rel='bookmark' title='Permanent Link: Half A World Away (2)'>Half A World Away (2)</a></li></ol>]]></description>
			<content:encoded><![CDATA[<p>我听得到，雨打在叶子上的声音。</p>
<p>那像是钢琴键盘被无意触动了，轻轻地，流出一个音符。音符是如此纯净，没有丝毫杂质；然而她又久久不愿离去，似乎就在那儿看着我。我便沉迷于她创造的氛围中，悠长，宁谧。</p>
<p><span id="more-3074"></span></p>
<p>似乎世界上也只剩下这音符了。周围都静了，只有它还在扩散，慢慢地，铺遍了天边。</p>
<p>人们都止住了步子，中断了闲谈，看着音符激起的波纹向四周扩散开去。没有了喧闹，没有了熙熙攘攘，只是若有所思。</p>
<p>雨。</p>
<p>就像这雨。黯淡，伤感。心境。</p>
<p>窗外多了几层白纱。视界灰白了。就像老照片，把色彩都抹去了，只留下枯燥的明明暗暗。然而这样的明暗差异也被雨冲淡了，没有黑，没有白。只有灰。那是墨迹被雨水浸润扩散了。或许再过一会儿，深深浅浅的灰也将最终归于一致，那是心里的颜色。</p>
<p>视界乱了。原本明晰的楼、树也被揉成了一团。像是龙卷风刚刚光临，把一切都搅得乱七八糟。只想，只想把它们撕下，彻底地揉成一个纸团，狠狠地扔向那个最遥远的角落；可是我是那么无力……</p>
<p>只好颤颤巍巍地伸出手，触摸那些雨滴。它们砸得很重、很重，不，不是砸在我的手上，是砸在我的神经上，我最敏感最脆弱的神经上。忽然，又觉得那不是太多的痛苦，而是，心伤。</p>
<p>雨滴们弄湿了我的手，还有我的眼睛，还有我的心。更模糊了，连雨声也模糊了，原本的尖利被浇得暗淡了，却显得愈发伤重起来，就像那首Half a World Away……</p>
<p>不知道，在半个世界之外，是不是也在下雨，是不是也有人呆呆地站在窗边。是不是她也和我在分享心情……</p>
<p>这里，在下雨，在你的半个世界之外。你，也是吗？</p>
<p>我会为你 / 跨越半个世界 / 可这又能怎样 / 如果你已不在那里 / 直到你回来 / 直到你的前路已经清晰 / 我会在这里 / 而不在半个世界之外……</p>
<p><object id="KugouPlayer" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="200" height="46" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="name" value="KugouPlayer" /><param name="align" value="middle" /><param name="src" value="http://disk.kugou.com/player/0/2/0/1/039AFF/200/1F73029710613ACE/mini.swf" /><param name="wmode" value="transparent" /><param name="quality" value="high" /><embed id="KugouPlayer" type="application/x-shockwave-flash" width="200" height="46" src="http://disk.kugou.com/player/0/2/0/1/039AFF/200/1F73029710613ACE/mini.swf" quality="high" wmode="transparent" align="middle" name="KugouPlayer"></embed></object></p>
<p><small>本文由 最后的叶子 创作，转载或引用前请<a href="mailto:programet.org@gmail.com">联系我们</a>。</small></p>

<p>相关文章：<ol><li><a href='http://blog.programet.org/2010/03/half-a-world-away-4.html' rel='bookmark' title='Permanent Link: Half a World Away (4)'>Half a World Away (4)</a></li><li><a href='http://blog.programet.org/2009/07/half-a-world-away.html' rel='bookmark' title='Permanent Link: Half a World Away'>Half a World Away</a></li><li><a href='http://blog.programet.org/2009/08/half-a-world-away-2.html' rel='bookmark' title='Permanent Link: Half A World Away (2)'>Half A World Away (2)</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.programet.org/2010/08/half-a-world-away-5.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>你在想什么？想她。(23)</title>
		<link>http://blog.programet.org/2010/08/%e4%bd%a0%e5%9c%a8%e6%83%b3%e4%bb%80%e4%b9%88%ef%bc%9f%e6%83%b3%e5%a5%b9%e3%80%8223.html</link>
		<comments>http://blog.programet.org/2010/08/%e4%bd%a0%e5%9c%a8%e6%83%b3%e4%bb%80%e4%b9%88%ef%bc%9f%e6%83%b3%e5%a5%b9%e3%80%8223.html#comments</comments>
		<pubDate>Fri, 13 Aug 2010 16:56:56 +0000</pubDate>
		<dc:creator>最后的叶子</dc:creator>
				<category><![CDATA[原创博文]]></category>
		<category><![CDATA[情感]]></category>

		<guid isPermaLink="false">http://blog.programet.org/?p=3059</guid>
		<description><![CDATA[距离常常是不能以长度来衡量的。常常会很喜欢接近的感觉，比如，回来。那是一种莫名的兴奋，因而每次回来都充溢着迫不及待，不愿多停留片刻。只是，接近似乎没有带来什么实际的价值，近处和远处一样，还是看不到人影。

迷恋的是那种感觉，那种相隔不远的感觉。
于是便讨厌起远离来，即便那毫无损失。那样的遥远总会暗暗地散发出伤感。
或许是因为接近把很多都变为可能了吧。在某个角落，就可以偶然地相遇；也许不需要偶然，只需要创造出那么点点惊喜。
我会记住那些彼此接近的日子。它们占据了岁月的一小块——最闪亮的一小块。
阳光，清新，动人心弦。感谢那些日子收获的阳光。我记得那些期盼，那些在一起时的点滴快乐，还有那些甜美的余音。我会把它们小心地封存在记忆中，放在那个特别的角落里；以后我还会时常光顾，去体味它的醇香。
那是最美好的记忆。
本文由 最后的叶子 创作，转载或引用前请联系我们。

相关文章：纪念短篇小说家欧·亨利逝世100周年


相关文章：<ol><li><a href='http://blog.programet.org/2010/06/%e7%ba%aa%e5%bf%b5%e7%9f%ad%e7%af%87%e5%b0%8f%e8%af%b4%e5%ae%b6%e6%ac%a7%c2%b7%e4%ba%a8%e5%88%a9%e9%80%9d%e4%b8%96100%e5%91%a8%e5%b9%b4.html' rel='bookmark' title='Permanent Link: 纪念短篇小说家欧·亨利逝世100周年'>纪念短篇小说家欧·亨利逝世100周年</a></li></ol>]]></description>
			<content:encoded><![CDATA[<p>距离常常是不能以长度来衡量的。常常会很喜欢接近的感觉，比如，回来。那是一种莫名的兴奋，因而每次回来都充溢着迫不及待，不愿多停留片刻。只是，接近似乎没有带来什么实际的价值，近处和远处一样，还是看不到人影。</p>
<p><span id="more-3059"></span></p>
<p>迷恋的是那种感觉，那种相隔不远的感觉。</p>
<p>于是便讨厌起远离来，即便那毫无损失。那样的遥远总会暗暗地散发出伤感。</p>
<p>或许是因为接近把很多都变为可能了吧。在某个角落，就可以偶然地相遇；也许不需要偶然，只需要创造出那么点点惊喜。</p>
<p>我会记住那些彼此接近的日子。它们占据了岁月的一小块——最闪亮的一小块。</p>
<p>阳光，清新，动人心弦。感谢那些日子收获的阳光。我记得那些期盼，那些在一起时的点滴快乐，还有那些甜美的余音。我会把它们小心地封存在记忆中，放在那个特别的角落里；以后我还会时常光顾，去体味它的醇香。</p>
<p>那是最美好的记忆。</p>
<p><small>本文由 最后的叶子 创作，转载或引用前请<a href="mailto:programet.org@gmail.com">联系我们</a>。</small></p>

<p>相关文章：<ol><li><a href='http://blog.programet.org/2010/06/%e7%ba%aa%e5%bf%b5%e7%9f%ad%e7%af%87%e5%b0%8f%e8%af%b4%e5%ae%b6%e6%ac%a7%c2%b7%e4%ba%a8%e5%88%a9%e9%80%9d%e4%b8%96100%e5%91%a8%e5%b9%b4.html' rel='bookmark' title='Permanent Link: 纪念短篇小说家欧·亨利逝世100周年'>纪念短篇小说家欧·亨利逝世100周年</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.programet.org/2010/08/%e4%bd%a0%e5%9c%a8%e6%83%b3%e4%bb%80%e4%b9%88%ef%bc%9f%e6%83%b3%e5%a5%b9%e3%80%8223.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<series:name><![CDATA[你在想什么？想她。]]></series:name>
	</item>
		<item>
		<title>学习使用GTK+ 0.概述</title>
		<link>http://blog.programet.org/2010/08/gtk-0.html</link>
		<comments>http://blog.programet.org/2010/08/gtk-0.html#comments</comments>
		<pubDate>Sun, 08 Aug 2010 16:57:02 +0000</pubDate>
		<dc:creator>最后的叶子</dc:creator>
				<category><![CDATA[原创博文]]></category>
		<category><![CDATA[程序]]></category>
		<category><![CDATA[计算机]]></category>

		<guid isPermaLink="false">http://blog.programet.org/?p=3035</guid>
		<description><![CDATA[GTK+是当下流行的图形界面库之一，使用GTK+可以方便地构造出应用程序界面。叶子觉得GTK+很好用，在这里推荐给大家，并留下自己的一些使用心得。希望你也喜欢~

在Programet这个系列中，你可以看到GTK+通俗的介绍，了解使用方法和常用API，我们希望能对你有所帮助。下面是这个系列的内容线索（本系列不断更新中，这个列表可能随更新而有少量变化）：

构建GTK+编译环境
GTK+“Hello World”——对GTK+运作机制的通俗介绍
使用GtkBuilder、界面设计器Glade和其他GTK+组件
GTK+常用物件及API（窗口）
GTK+常用物件及API（文本）
GTK+常用物件及API（按钮）
GTK+常用物件及API（其他）
GLib中的小工具
使用gettext实现国际化和制作语言包
【高级主题】使用GDK访问底层屏幕和事件
【高级主题】使用gtk-pixbuf处理图像和图像文件
【高级主题】使用GIO中的GSocket访问网络
【高级主题】使用cairo绘图

上面的列表中并没有“GTK+介绍”一项，因为我要在这篇文章后半部分完成它！
GTK+究竟能做什么
GTK+是图形界面库，能帮助我们简洁方便地绘制窗口和里面的输入框、按钮等等。这能减少我们很多麻烦——有经验的童鞋可能深有体会，图形界面几乎是应用程序编写中最繁琐的部分。图形界面库就是为了方便我们组织界面而出现的，使用它可以大大减少我们花在组织界面上的代码量。
同时，GTK+可以配合界面设计器Glade，换句话说，做界面不用敲冗长的代码，界面可以画出来！
更重要的是，GTK+是跨平台的。只要代码写得标准，在Windows、Linux和Mac OS下，不用做任何修改就可以展现出同样的界面，方便吧~
GTK+支持的
GTK+是一个开源跨平台的库，支持很多平台，这里就不一一列举了。它遵循LGPL协议，也就是说我们可以自由地使用它，使用它制作的程序可以自行选择开源与否。
GTK+是用C语言编写的，很多GTK+应用程序也使用C语言完成。但如果你讨厌C语言的话，你同样可以选用其他多种语言，包括C++、Java、Python等等，甚至还可以是PHP。而且在各种语言中的API很相似，这让我们在各种语言下玩GTK+变得很方便。
谁在用GTK+
GTK+现在为很多软件所使用，最典型的是Linux桌面环境GNOME和Xfce，包括在它们中运行的众多软件（很多时候GNOME和Xfce软件可以混用，因为他们都是GTK+的）。
还有号称“开源PS”的GIMP、矢量图编辑器Inkscape等等，还有只是使用部分GTK+库（尤其是GLib）的众多软件，还有偷偷拿GTK+代码来用的软件……
与GTK+相似的图形界面库
目前，还有很多流行的图形界面库：

MFC——微软的一个C++库，很多人用，但功能落后，也被讽刺为“半成品”。
Qt——大红大紫的一个图形界面库，各方面表现都很好。现归属于Nokia。（传说很久很久以前QT和GTK+的支持者喜欢对骂……）
WxWidgets——个人认为这个库灰常强大！它在不同操作系统中都可以生成“原生”的界面，甚至不需要运行库！只是有人说不稳定……

还有其他的一些，这里就不提了吧。
毫无疑问的是，GTK+是它们中很有特点的一个。你很难找出第二个C语言图形界面库。GTK+以架构严谨优秀高效著称，是GNU项目的一部分，像是很标准的GNU式的开源项目。它和GNU项目中的其他部分配合良好，遇到麻烦时，常常可以让其他库帮忙。
GTK+的历史与前景
GTK+是1999年开始发展的一个项目，在图形界面库中算很年轻的，但是发展飞速，以至于网络上对其的描述都难以跟上其发展（现在搜索到的很多描述不正确）。GTK+一直由社区维护，但同时又备受众多商业公司青睐，应用领域在不断扩展中。
有关本系列
在这一系列文章中，GTK+原生语言——C语言将被用来举例，其他语言使用方法类似，具体请参见不同语言的文档。这也要求读者能熟练运用C语言。
文章中的例子使用Windows下的GTK+ 2.16（GLib 2.24）编译通过，并特别照顾Windows下的配置、使用，相较而言，在Linux下的配置、使用简单一些。
最后声明
若本系列中出现错误，欢迎指正~
本系列涉及的内容未经Programet同意不得转载！
本文由 最后的叶子 创作，转载或引用前请联系我们。

相关文章：学习使用GTK+ 3.使用GtkBuilder、界面设计器Glade和其他GTK+组件学习使用GTK+ 1.构建GTK+编译环境学习使用GTK+ 2.GTK+“Hello World”——对GTK+运作机制的通俗介绍


相关文章：<ol><li><a href='http://blog.programet.org/2010/09/gtk-3.html' rel='bookmark' title='Permanent Link: 学习使用GTK+ 3.使用GtkBuilder、界面设计器Glade和其他GTK+组件'>学习使用GTK+ 3.使用GtkBuilder、界面设计器Glade和其他GTK+组件</a></li><li><a href='http://blog.programet.org/2010/08/gtk-1.html' rel='bookmark' title='Permanent Link: 学习使用GTK+ 1.构建GTK+编译环境'>学习使用GTK+ 1.构建GTK+编译环境</a></li><li><a href='http://blog.programet.org/2010/09/gtk-2.html' rel='bookmark' title='Permanent Link: 学习使用GTK+ 2.GTK+“Hello World”——对GTK+运作机制的通俗介绍'>学习使用GTK+ 2.GTK+“Hello World”——对GTK+运作机制的通俗介绍</a></li></ol>]]></description>
			<content:encoded><![CDATA[<p>GTK+是当下流行的图形界面库之一，使用GTK+可以方便地构造出应用程序界面。叶子觉得GTK+很好用，在这里推荐给大家，并留下自己的一些使用心得。希望你也喜欢~</p>
<p><span id="more-3035"></span></p>
<p>在Programet这个系列中，你可以看到GTK+通俗的介绍，了解使用方法和常用API，我们希望能对你有所帮助。下面是这个系列的内容线索（<span style="color: #3366ff;"><strong>本系列不断更新中，这个列表可能随更新而有少量变化</strong></span>）：</p>
<ol>
<li>构建GTK+编译环境</li>
<li>GTK+“Hello World”——对GTK+运作机制的通俗介绍</li>
<li>使用GtkBuilder、界面设计器Glade和其他GTK+组件</li>
<li>GTK+常用物件及API（窗口）</li>
<li>GTK+常用物件及API（文本）</li>
<li>GTK+常用物件及API（按钮）</li>
<li>GTK+常用物件及API（其他）</li>
<li>GLib中的小工具</li>
<li>使用gettext实现国际化和制作语言包</li>
<li>【高级主题】使用GDK访问底层屏幕和事件</li>
<li>【高级主题】使用gtk-pixbuf处理图像和图像文件</li>
<li>【高级主题】使用GIO中的GSocket访问网络</li>
<li>【高级主题】使用cairo绘图</li>
</ol>
<p>上面的列表中并没有“GTK+介绍”一项，因为我要在这篇文章后半部分完成它！</p>
<h3>GTK+究竟能做什么</h3>
<p>GTK+是图形界面库，能帮助我们简洁方便地绘制窗口和里面的输入框、按钮等等。这能减少我们很多麻烦——有经验的童鞋可能深有体会，图形界面几乎是应用程序编写中最繁琐的部分。图形界面库就是为了方便我们组织界面而出现的，使用它可以大大减少我们花在组织界面上的代码量。</p>
<p>同时，GTK+可以配合界面设计器Glade，换句话说，做界面不用敲冗长的代码，界面可以画出来！</p>
<p>更重要的是，GTK+是跨平台的。只要代码写得标准，在Windows、Linux和Mac OS下，不用做任何修改就可以展现出同样的界面，方便吧~</p>
<h3>GTK+支持的</h3>
<p>GTK+是一个开源跨平台的库，支持很多平台，这里就不一一列举了。它遵循LGPL协议，也就是说我们可以自由地使用它，使用它制作的程序可以自行选择开源与否。</p>
<p>GTK+是用C语言编写的，很多GTK+应用程序也使用C语言完成。但如果你讨厌C语言的话，你同样可以选用其他多种语言，包括C++、Java、Python等等，甚至还可以是PHP。而且在各种语言中的API很相似，这让我们在各种语言下玩GTK+变得很方便。</p>
<h3>谁在用GTK+</h3>
<p>GTK+现在为很多软件所使用，最典型的是Linux桌面环境GNOME和Xfce，包括在它们中运行的众多软件（很多时候GNOME和Xfce软件可以混用，因为他们都是GTK+的）。</p>
<p>还有号称“开源PS”的GIMP、矢量图编辑器Inkscape等等，还有只是使用部分GTK+库（尤其是GLib）的众多软件，还有偷偷拿GTK+代码来用的软件……</p>
<h3>与GTK+相似的图形界面库</h3>
<p>目前，还有很多流行的图形界面库：</p>
<ul>
<li>MFC——微软的一个C++库，很多人用，但功能落后，也被讽刺为“半成品”。</li>
<li>Qt——大红大紫的一个图形界面库，各方面表现都很好。现归属于Nokia。（传说很久很久以前QT和GTK+的支持者喜欢对骂……）</li>
<li>WxWidgets——个人认为这个库灰常强大！它在不同操作系统中都可以生成“原生”的界面，甚至不需要运行库！只是有人说不稳定……</li>
</ul>
<p>还有其他的一些，这里就不提了吧。</p>
<p>毫无疑问的是，GTK+是它们中很有特点的一个。你很难找出第二个C语言图形界面库。GTK+以架构严谨优秀高效著称，是GNU项目的一部分，像是很标准的GNU式的开源项目。它和GNU项目中的其他部分配合良好，遇到麻烦时，常常可以让其他库帮忙。</p>
<h3>GTK+的历史与前景</h3>
<p>GTK+是1999年开始发展的一个项目，在图形界面库中算很年轻的，但是发展飞速，以至于网络上对其的描述都难以跟上其发展（现在搜索到的很多描述不正确）。GTK+一直由社区维护，但同时又备受众多商业公司青睐，应用领域在不断扩展中。</p>
<h3>有关本系列</h3>
<p>在这一系列文章中，GTK+原生语言——C语言将被用来举例，其他语言使用方法类似，具体请参见不同语言的文档。这也要求读者能熟练运用C语言。</p>
<p>文章中的例子使用Windows下的GTK+ 2.16（GLib 2.24）编译通过，并特别照顾Windows下的配置、使用，相较而言，在Linux下的配置、使用简单一些。</p>
<h3>最后声明</h3>
<p>若本系列中出现错误，欢迎指正~</p>
<p><strong>本系列涉及的内容未经Programet同意不得转载！</strong></p>
<p><small>本文由 最后的叶子 创作，转载或引用前请<a href="mailto:programet.org@gmail.com">联系我们</a>。</small></p>

<p>相关文章：<ol><li><a href='http://blog.programet.org/2010/09/gtk-3.html' rel='bookmark' title='Permanent Link: 学习使用GTK+ 3.使用GtkBuilder、界面设计器Glade和其他GTK+组件'>学习使用GTK+ 3.使用GtkBuilder、界面设计器Glade和其他GTK+组件</a></li><li><a href='http://blog.programet.org/2010/08/gtk-1.html' rel='bookmark' title='Permanent Link: 学习使用GTK+ 1.构建GTK+编译环境'>学习使用GTK+ 1.构建GTK+编译环境</a></li><li><a href='http://blog.programet.org/2010/09/gtk-2.html' rel='bookmark' title='Permanent Link: 学习使用GTK+ 2.GTK+“Hello World”——对GTK+运作机制的通俗介绍'>学习使用GTK+ 2.GTK+“Hello World”——对GTK+运作机制的通俗介绍</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.programet.org/2010/08/gtk-0.html/feed</wfw:commentRss>
		<slash:comments>14</slash:comments>
	
		<series:name><![CDATA[学习使用GTK+]]></series:name>
	</item>
	</channel>
</rss>
