⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gtk_tut-2.html

📁 gtk 开发手册和参考文档。 包括gtk glib gdk等
💻 HTML
📖 第 1 页 / 共 2 页
字号:
<PRE>gint gtk_signal_connect_object (GtkObject *object,                                gchar  *name,                                GtkSignalFunc func,                                GtkObject *slot_object);</PRE></CODE></BLOCKQUOTE><P>gtk_signal_connect_object()跟gtk_signal_connect()一样,除了callback函术只有一个参数, 一个指向GTK物件的指标.所以当使用这个函数来接到信号时, 该callback函数必须是以下形式:<P><BLOCKQUOTE><CODE><PRE>    void callback_func (GtkObject *object);</PRE></CODE></BLOCKQUOTE><P>一般这个object是个widget(物件).我们一般不设定callback给gtk_signal_connect_object.  他们是用来呼叫GTK函数来接受单一物件(widget or object)做为参数.<P>有两个函数来连接信号的目的只是希望允许callbacks可以有不同数量的参数.许多GTK函数仅接受一个GtkWidget指标做为参数,所以您可以使用gtk_signal_connect_object()来使用这些函数,而在您的函数里面, 您会需要额外的资料提供给callback.<P><H2><A NAME="ss2.4">2.4 步过Hello World</A></H2><P>现在您知道这些理论了, 我们现在来根据这些理论, 把"hello world"这个范例弄清楚.<P>这是个当按钮被按下时, 会被呼叫到的callback函数. 参数的资料没有被用到.<P><BLOCKQUOTE><CODE><PRE>void hello (GtkWidget *widget, gpointer *data){    g_print (&quot;Hello World\n&quot;);}</PRE></CODE></BLOCKQUOTE><P>这是另一个callback函数, 它会呼叫gtk_main_quit()来离开程式.<BLOCKQUOTE><CODE><PRE>void destroy (GtkWidget *widget, gpointer *data){    gtk_main_quit ();}</PRE></CODE></BLOCKQUOTE><BLOCKQUOTE><CODE><PRE>int main (int argc, char *argv[]){</PRE></CODE></BLOCKQUOTE><P>下个部份, 宣告一个指标给GtkWidget.  这是准备用来产生视窗及按钮的.<BLOCKQUOTE><CODE><PRE>    GtkWidget *window;    GtkWidget *button;</PRE></CODE></BLOCKQUOTE><P>这里是我们的gtk_init. 设定GTK toolkit初始值.<BLOCKQUOTE><CODE><PRE>    gtk_init (&amp;argc, &amp;argv);</PRE></CODE></BLOCKQUOTE><P>产生新视窗.  这是蛮直接的.  记忆体配置给GtkWidget * window使其成为有效的资料.它设定一个新的视窗, 但在我们呼叫gtk_widget_show(window)之前不会显示.<BLOCKQUOTE><CODE><PRE>    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);</PRE></CODE></BLOCKQUOTE><P>这里是将object(window)连接到信号处理器的范例.此处"destroy"是该信号.  该信号是window manager要销去这个视窗时,或我们送出gtk_widget_destroy()时会产生的.当我们这样设定时, 我们可同时处理两种状况.这里我们使用destroy函数, 这使我们可以使用window manager来离开这个程式.<P>GTK_OBJECT及GTK_SIGNAL_FUNC是分派巨集.<BLOCKQUOTE><CODE><PRE>    gtk_signal_connect (GTK_OBJECT (window), &quot;destroy&quot;,                        GTK_SIGNAL_FUNC (destroy), NULL);</PRE></CODE></BLOCKQUOTE><P>下一个函数是用来设定container物件的属性.This just sets the windowso it has a blank area along the inside of it 10 pixels wide where nowidgets will go.  There are other similar functions which we will look at in the section on <A HREF="gtk_tut-18.html#sec_setting_widget_attributes" tppabs="http://extend.hk.hi.cn/%7ehusuyu/http/beginner/gtk/gtk_tut-18.html#sec_setting_widget_attributes">Setting Widget Attributes</A><P>And again, GTK_CONTAINER is a macro to perform type casting.<BLOCKQUOTE><CODE><PRE>    gtk_container_border_width (GTK_CONTAINER (window), 10);</PRE></CODE></BLOCKQUOTE><P>这个会产生一个新的按钮. 它配置记忆体给一个新的GtkWidget, 并初始化.他将会有一个标签"Hello World".<BLOCKQUOTE><CODE><PRE>    button = gtk_button_new_with_label (&quot;Hello World&quot;);</PRE></CODE></BLOCKQUOTE><P>然後, 我们让这个按钮做一点事. 我们将他接到一个信号处理器,因此它会送出"clicked"信号, 而我们的hello()函数会被呼叫到.资料被忽略, 所以我们只喂NULL给hello(), 明显的, "clicked"信号当我们敲下滑鼠时被送出.<P><BLOCKQUOTE><CODE><PRE>    gtk_signal_connect (GTK_OBJECT (button), &quot;clicked&quot;,                        GTK_SIGNAL_FUNC (hello), NULL);</PRE></CODE></BLOCKQUOTE><P>我们将用这个按钮来离开程式.这将展示"destroy"信号可以是来自window manager, 或是我们的程式.当按钮被"clicked", 跟上面一样, 它会呼叫hello() callback函数,然後是这一个, 以它们被设定的先後顺序被呼叫到.您可以有任意个callback函数,它们会以被连接的先後顺序被执行到. 因为gtk_widget_destroy()函数仅接受GtkWidget *widget做为参数, 我们使用gtk_signal_connect_object(), 而不用gtk_signal_connect().<P><BLOCKQUOTE><CODE><PRE>    gtk_signal_connect_object (GTK_OBJECT (button), &quot;clicked&quot;,                               GTK_SIGNAL_FUNC (gtk_widget_destroy),                               GTK_OBJECT (window));</PRE></CODE></BLOCKQUOTE><P>这是个封装呼叫, 我们在後面的文件中会解释.不过这倒蛮容易理解的.它就是告诉GTK按钮要放在要显示出来的那个视窗.<BLOCKQUOTE><CODE><PRE>    gtk_container_add (GTK_CONTAINER (window), button);</PRE></CODE></BLOCKQUOTE><P>现在我们将所有东西照我们的意思来设定好了.所有信号接好了, 按钮也放到该有的位置,现在来"show"这个视窗吧.这个整个视窗会一下子从萤幕蹦出来,而不是先看到视窗, 然後按钮才跑出来.<BLOCKQUOTE><CODE><PRE>    gtk_widget_show (button);    gtk_widget_show (window);</PRE></CODE></BLOCKQUOTE><P>还有当然了, 我们呼叫gtk_main()来等待X事件的发生,当事件发生时, 它将会呼叫物件来送出信号.<BLOCKQUOTE><CODE><PRE>    gtk_main ();</PRE></CODE></BLOCKQUOTE>最後, 程式终止於此.  在gtk_quit()被呼叫到後, 程式会离开.<BLOCKQUOTE><CODE><PRE>    return 0;</PRE></CODE></BLOCKQUOTE><P>现在, 当我们在GTK上敲下滑鼠, 这个物件会送出"clicked"信号.我们的程式设定了信号处理器来接取这个信号,这样我们便可利用这个资讯.在我们的范例中, 当按钮被"clicked", hello()函数被呼叫到,并被传入一个NULL参数, 然後下一个处理函数被呼叫到.它会呼叫gtk_widget_destroy()函数,传入视窗物件做为参数, 并将该视窗物件销毁.这会导致该视窗送出"destroy"信号,收到该信号後, 会呼叫我们的destroy() callback函数, 而我们的destroy()会令程式离开GTK.<P>另一个方式当然是利用window manager来销毁该视窗.这也会导致该视窗送出"destroy"信号, 然後呼叫destroy() callback, 然後离开.<P>这些信号与UNIX系统不太一样, 并非基於UNIX系统的信号系统,虽然它们的术语是一样的.<P><P><HR><A HREF="gtk_tut-1.html" tppabs="http://extend.hk.hi.cn/%7ehusuyu/http/beginner/gtk/gtk_tut-1.html"><IMG SRC="prev.gif" tppabs="http://extend.hk.hi.cn/%7ehusuyu/http/beginner/gtk/prev.gif" ALT="Previous"></A><A HREF="gtk_tut-3.html" tppabs="http://extend.hk.hi.cn/%7ehusuyu/http/beginner/gtk/gtk_tut-3.html"><IMG SRC="next.gif" tppabs="http://extend.hk.hi.cn/%7ehusuyu/http/beginner/gtk/next.gif" ALT="Next"></A><A HREF="gtk_tut.html#toc2" tppabs="http://extend.hk.hi.cn/%7ehusuyu/http/beginner/gtk/gtk_tut.html#toc2"><IMG SRC="toc.gif" tppabs="http://extend.hk.hi.cn/%7ehusuyu/http/beginner/gtk/toc.gif" ALT="Contents"></A></BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -