求助,关于GTK的js 退出函数数

众所周知gtk是基于事件驱动的,而windows则是基于消息驱动,至于这两者之间的区别,笔者能力有限,就不得而知了,但,今天的主题是GTK的毁掉函数的详解,所以还是抓紧步入正轨吧
1.一般情况下我们使用
gulong g_signal_connect( gpointer
const gchar
func_data );
来进行事件的绑定,我们来解析下这个函数的使用
object:指定事件来源对象
name:指定的是信号名称,是一个字符串类型的变量
func:回调函数指针
func_data:则是需要传递给回调函数的数据
而func的一般形式是这样的
void callback_func( GtkWidget *widget,
callback_data );
widget:是信号来源,也就是触发事件的Widget控件
callback_data:则是g_signal_connect传递的参数
该种形式的回调函数有两个参数http://write.blog.csdn.net/postedit
但是对于某些特别的信号会有特定的信号处理过程
gulong g_signal_connect_swapped( gpointer
const gchar
*slot_object );
我们可以看到,从形式上看到,信号处理函数的指定是没有什么区别的,但是,该种信号处理函数的指针是指定的,是一个指向gtk对象的指针
回调函数是:
void callback_func( GtkObject *object );
没有其他的参数,这种形式的回调函数常来调用一个只接受一个单独的构件,或者对象作为参数的GTK函数
除了这种信号机制以外,还有的就是events 说明X事件机制,回调函数可以与这些事件进行连接,进行特别的处理,她回调函数的指定形式是
g_signal_connect的,只是回调函数会有些不同
gint callback_func( GtkWidget *widget,
callback_data );
我们可以看到,这里面多了一个event,这里面的event是根据事件(name)的不同而传入不同的event对象的,他是一个结构体,依赖于事件的不同而又不同的类型
回调函数设置过程中name的取值有
eventbutton_press_eventbutton_release_eventscroll_eventmotion_notify_eventdelete_eventdestroy_eventexpose_eventkey_press_eventkey_release_evententer_notify_eventleave_notify_eventconfigure_eventfocus_in_eventfocus_out_eventmap_eventunmap_eventproperty_notify_eventselection_clear_eventselection_request_eventselection_notify_eventproximity_in_eventproximity_out_eventvisibility_notify_eventclient_eventno_expose_eventwindow_state_event
而event的取值有
GDK_NOTHING
GDK_DELETE
GDK_DESTROY
GDK_EXPOSE
GDK_MOTION_NOTIFY
GDK_BUTTON_PRESS
GDK_2BUTTON_PRESS
GDK_3BUTTON_PRESS
GDK_BUTTON_RELEASE
GDK_KEY_PRESS
GDK_KEY_RELEASE
GDK_ENTER_NOTIFY
GDK_LEAVE_NOTIFY
GDK_FOCUS_CHANGE
GDK_CONFIGURE
GDK_PROPERTY_NOTIFY
GDK_SELECTION_CLEAR
GDK_SELECTION_REQUEST
GDK_SELECTION_NOTIFY
GDK_PROXIMITY_IN
GDK_PROXIMITY_OUT
GDK_DRAG_ENTER
GDK_DRAG_LEAVE
GDK_DRAG_MOTION
GDK_DRAG_STATUS
GDK_DROP_START
GDK_DROP_FINISHED
GDK_CLIENT_EVENT
GDK_VISIBILITY_NOTIFY
GDK_NO_EXPOSE
GDK_SCROLL
GDK_WINDOW_STATE
GDK_SETTING
使用案例如下:
g_signal_connect (G_OBJECT (button), &button_press_event&,
G_CALLBACK (button_press_callback), NULL);
回调函数会是:
static gint button_press_callback( GtkWidget
GdkEventButton *event,
因为我们知道事件的类型,所以event也就可以具体到类型了,恩就到这里吧
本文已收录于以下专栏:
相关文章推荐
写了一个C++小游戏,想法是间接别人的C语言,但是真正自己操作起来,还是会遇到各种问题,同时也让自己更真切的学到了一些过眼即忘,只有亲自动手才能学到的知识。...
信号和回调函数的原理 在 2.0 版,信号系统已从 GTK 移到 GLib,因此在函数和类型的说明中有前缀 "g_" 而不是 "gtk_"。我们不打算介绍 GLib 2.0 信号系统相对 GTK 1....
前面我们学习的GTK界面都是静态的,我们按下按钮它是没有响应的,如何让它有响应呢?接下来我们一起学习GTK的信号与回调函数。
GTK采用了信号与回调函数来处理窗口外部传来的事件、消息...
C++中类成员函数作为回调函数 [转]
http://blog.csdn.net/this_capslock/article/details/
回调函数是基于C编程...
源码级调试C库。
C++信号槽使用方法 1.
为什么要使用信号槽.
可以将事件源和订阅处理者分开b.
降低耦合性,事件源只需要向外界暴露最少的信息,内部改变不影响外部行为...
学习应用编程,我们会经常接触到“信号”这个名词。GTK中的“信号”实际上是一种软件中断。“中断”在我们生活中经常遇到,譬如,我正在房间里打游戏,突然送快递的来了,把正在玩游戏的我给“中断”了,我去签收...
本来这个不应该成为重复的话题,但是花了好些功夫没在网上找到能一目了然的解决办法,
只好再啰嗦几句,也算给自己留条后路。
我个人理解一般函数的无类型指针参数就是传递用户自定义类型用,...
他的最新文章
讲师:李江龙
讲师:司徒正美
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)博客分类:
关于GTK各个循环函数的介绍与使用
Gtk+主循环的首要目的就是在连接到X服务器的文件描述符上监听事件,并将事件转发到构件上。本节解释怎样使用主循环,怎样给主循环添加新功能:当主循环在指定的时间间隔内空闲时、当一个文件描述符已经读或写就绪、以及当主循环退出时调用一个函数。
2.10.1主循环基本知识
从根本上来说,主循环是由glib实现的。Gtk+将glib主循环连接到Gdk的X服务器,并提供一个方便的接口(glib循环是比Gtk+的循环更低层的)。
gtk_main()函数运行主循环。直到调用gtk_main_quit()函数,gtk_main()才会退出。gtk_main()函数可以 递归调用,每次调用一个gtk_main_quit()就退出gtk_main()函数的一个实例。gtk_main_level()函数返回递归的层 次,也就是:如果没有gtk_main()运行,返回0;如果一个gtk_main()函数在运行,返回1,等等。
gtk_main()函数的所有实例功能都是一样的,它们都监视同一个与X服务器的连接,都对同样的事件队列起作用。gtk_main()实例用于阻塞、遮断一个函数的控制流直到满足某些条件。
所有的Gtk+程序都用这个技巧使应用程序正在运行时main()函数不能退出去。gnome_dialog_run()函数使用了一个递归的主循环,此循环直到用户点击对话框的按钮时它才会返回。
有时候想处理一些事件,又不想将控制交给gtk_main(),可以调用gtk_main_iteration()函数对主循环进行迭代。例如,这 样可以处理单独的一个事件,它依赖于想将什么任务挂起。可以检查是否有任何事件需要通过调用gtk_events_pending()函数处理。同样地, 这两个函数允许临时将控制交还给Gtk+。例如,在一个很长的计算中,想显示一个进度条,必须允许Gtk+主循环周期性地返回,让Gtk+能重画进度条。 可以使用下面的代码:
while(gtk_events_pending())
gtk_main_iteration();
下面是有关主循环的函数:
#include&gtk/gtkmain.h&
voidgtk_main()
voidgtk_main_quit()
voidgtk_main_iteration()
gintgtk_events_pending()
guintgtk_main_level()
2.10.2退出函数
退出函数就是当调用gtk_main_quit()函数时要调用的回调函数。换句话说,回调函数只在 gtk_main()返回之前运行。回调函数应该是一个像下面这样定义的GtkFunction:
typedefgint(*GtkFunction)(gpointerdata);
退出函数是用gtk_quit_add()添加进去的。添加退出函数时,必须指定一个由gtk_main_level()返回的主循环的级别。第二 个和第三个参数指定一个回调函数和回调数据。回调函数的返回值说明了回调函数是否应该再次调用。只要回调函数返回TRUE,它会被重复调用。只要它返回 FALSE,将取消与主循环的连接,并且不会再次调用。所有的退出函数都返回FALSE时,gtk_main()会返回。
gtk_quit_add()函数返回一个ID号码,可以用于用gtk_quit_remove()函数删除该退出函数。还可以通过将回调数据传递给gtk_quit_remove_by_data()函数来删除退出函数。函数列表:退出函数
#include&gtk/gtkmain.h&
guintgtk_quit_add(guintmain_level,
GtkFunctionfunction,
gpointerdata)
voidgtk_quit_remove(guintquit_handler_id)
voidgtk_quit_remove_by_data(gpointerdata)
2.10.3Timeout函数
有时候可能想应该在gtk_main主循环中怎样让GTK做点什么。这时可以创建一个定时(Timeout)函数,隔一定时间(毫秒)就调用一次。Timeout类似于其他编程环境中的定时器控件。下面的函数用于添加一
Timeout函数。
#include&gtk/gtkmain.h&
gintgtk_timeout_add(guint32interval,
GtkFunctionfunction,
gpointerdata);
第一个参数调用定时函数的时间间隔,以毫秒计。第二个参数是要调用的函数,第三个是要传递给函数的参数。函数返回一个整数值“标志”。可以用下面的函数停止调用定时函数:
#include&gtk/gtkmain.h&
voidgtk_timeout_remove(ginttag);
其中tag参数是前一个函数返回的“标志”值。还可以让回调函数返回FALSE或0来停止调用定时函数。也就是说,要想让函数继续调用,必须让它返回一个非0值或TRUE。定期调用的回调函数声明应该是下面的形式:
ginttimeout_callback(gpointerdata);
可以看到,Timeout函数类似于许多可视化编程工具中的Timer控件(计时器)。
2.10.4idle函数
当Gtk+主循环没有其他事情做时,idle函数连续运行。只有在事件队列是空的,并且主循环正常空闲着,正等待着有什么事情发生时,idle函数 才会运行。只要它们返回TRUE,这个函数就会一次又一次地调用;当它们返回FALSE时,函数会被删除,就像调用了gtk_idle_remove() 函数一样。
列在下面函数列表中的idle函数API,与timeout以及退出函数API是一样的。不过,不能在idle函数中调用 gtk_idle_remove()函数,因为它会破坏Gtk+的函数列表。要返回FALSE来删除idle函数。idle函数在对“只此一次”的代码排 队时通常是很有用的,这样的代码一般在所有的事件已经处理之后才运行。相对昂贵(耗费系统资源较多)的操作,比如Gtk+的大小协商以及 GnomeCanvas重绘一般在返回FALSE的idle函数中发生。这保证了代价昂贵的操作只会执行一次,即使多个连续的事件独立地要求重新执行。
Gtk+的主循环包含一个简单的调度程序。idle函数有一个分配给它们的优先级,就像UNIX进程所做的一样,也可以分配一个非缺省的优先级给idle函数。
函数列表:idle函数
#include&gtk/gtkmain.h&
guintgtk_idle_add(GtkFunctionfunction,
gpointerdata)
voidgtk_idle_remove(guintidle_handler_id)
voidgtk_idle_remove_by_data(gpointerdata)
2.10.5输入函数
输入函数用于检查文件描述符的数据(由open(2)或socket(2)返回的文件描述符)。输入函数是在Gdk级处理的。当给定的文件描述符已 经读写就绪时,会调用输入函数。它们对网络应用程序特别有用。关于文件描述符请参考Unix编程方面的参考书。要添加一个输入函数,需要指定要监视的文件 描述符、要等待的状态(读或写就绪),以及一个回调函数/数据对。下面的函数列表列出了这些API。该函数可以用gdk_input_add()返回
的标识符删除。不像quit、timeout和idle函数,从输入函数里面调用gdk_input_remove()函数删除该函数是安全的,Gtk+不会处于输入函数列表的迭代状态。
要指定等待的条件,使用GdkInputCondition标志:
GDK_INPUT_READ
GDK_INPUT_WRITE
GDK_INPUT_EXCEPTION
可以用OR将一个以上的标志连在一起。这些标志对应于传到select()系统调用的三种文件描述符集。要了解详细的内容,请参考UNIX的编程参考书。如果所有条件都得到满足,就会调用输入函数。
回调函数应该是这个样子:
typedefvoid(*GdkInputFunction)(gpointerdata,
gintsource_fd,
GdkInputConditioncondition);
它接受回调数据、被监视的文件描述符以及要满足的条件(可能是一个正在监视的条件的子集)。函数列表:输入函数
#include&gdk/gdk.h&
gintgdk_input_add(gintsource_fd,
GdkInputConditioncondition,
GdkInputFunctionfunction,
gpointerdata)
voidgdk_input_remove(ginttag)
2.11编译应用程序
用前面所介绍的基本概念,已经可以编译全功能的Gtk+/Gnome应用程序了。但是还有一个大问题:如何配置编译选项?一些实用工具如automake、autoconf、libtool等,可以用来简化这一过程。
为了方便维护,同时,也是为了便于使用这些实用工具,应该在编写代码时遵从一些约定。如果要将程序发布为自由软件,最好能使程序源代码的目录结构遵 从 “GNU项目编码标准”。即使应用程序是私有的商用程序,不想公开源代码,从技术上来说,这么做也是一个非常好的选择,因为这些标准都是经过实践检验,能 够让你节省大量的时间和精力。另外还应该在程序代码中包含INSTALL、README的文件。
trackback:
浏览: 42555 次
来自: 厦门
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'.............................&&&&温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(2185)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_',
blogTitle:'关于GTK编程中的关闭窗口的信号',
blogAbstract:'1: 当点击主窗口的最右上角的“关闭按钮”;2: 或者程序调用gtk_widget_destroy()函数销毁以上都会产生两个信号: delete_event和destroy,但二者存在如下关系,(1): 首先GTK会发出\"delete_event信号\";(2): 如果用g_signal_connect (G_OBJECT (window), \"delete_event\", G_CALLBACK (DeleteEvent), NULL);&',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:5,
publishTime:5,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}GTK编程,为什么对话框关不掉_百度知道
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。
GTK编程,为什么对话框关不掉
void on_button_fileSel_clicked()
GtkWidget *
//创建文件选择对话框,参数是显示在对话框标题栏的文字
dialog =gtk_file_selection_new(&请选择:&);
gtk_window_set_position(GTK_WINDOW(dialog),GTK_WIN_POS_CENTER);
//关闭dialog窗口...
我有更好的答案
因为你没有销毁,当然不可以,学过C++人都知道,这个就相当于析构函数!gtk_widget_destroy(dialog)
采纳率:26%
为您推荐:
其他类似问题
gtk的相关知识
等待您来回答

我要回帖

更多关于 python 退出函数 的文章

 

随机推荐