📄 xplore 查看主题 - gtk+编程入门[原创].htm
字号:
<TABLE cellSpacing=1 cellPadding=3 width="90%" align=center
border=0>
<TBODY>
<TR>
<TD><SPAN class=genmed><B>代码::</B></SPAN></TD></TR>
<TR>
<TD class=code><BR>gcc -Wall -o basicgtk basicgtk.c
`gtk-config --cflags --libs`
<BR> </TD></TR></TBODY></TABLE><SPAN
class=postbody><BR>编译通过后运行此程序,会在桌面上看到一个窗体。 <BR>下面来解释一下这段小程序
<BR>1、关于数据类型
<BR>这个程序中出现了gint,gchar等数据类型,这些都是GLIB的数据类型,GLIB有点像windows下C的STL,GLIB的数据类型的表示和C的差不多,基本上是在前面加一个g的前缀,但GLIB对数据类型的处理(主要指内存管理方面)比C要优化一些。如果这方面还有什么问题请参考GLIB的说明。
<BR>2、关于GtkWidget
<BR>GtkWidget从本质上说它只一个数据结构,在这里,我们可以把它理解为一个对象,这里好像用到了面向对象的概念,不错同GTK+就是基于面象对面的恩想设计的,你可能会问,GTK+程序不是用C语言写的吗?注意,这里只是用到了面向对象的思想和面向对象的编程方法,并不是面向对象语言,C++语言的发明人Bjarne
Stroustrup曾经说过,面向对像的程序设计是编写程序代码的一种方法。而向对像的程序设计语言是在语言内部明确的提供帮助。
<BR>因此,这里的GtkWidget可以说一个对象。 <BR>3、初始化GTK+
<BR>在调用GTK+的函数之前,必须先初始化GTK+。gtk_init()就是对GTK+进行初始化,它主要处理命令行的参数。
<BR>4、创建并显示窗体
<BR>函数gtk_window_new()的作用就是创建一个窗体,而该函数的参数是说明所要创建窗体的类型,它可以是以下三种中的一种:
<BR>GTK_WINDOW_TOPLEVEL、GTK_WINDOW_DIALOG、GTK_WINDOW_POPUP
<BR>5、gtk_main循环
<BR>gtk_main函数的作用就是进入GTK+循环,即程序不停的运行,直到程序的的另一个部分调用了gtk_main_quit或程序崩溃为止,这有点像win32程序的消息循环。
<BR><BR>三、信号与事件
<BR>这里将引入GTK+信号和事件的概念,信号和事件的概念十分相近,初学者比较难区别,简单的说,当用户点击一个按纽或是移动鼠标,就称该用户触发了一个事件,而X本身能够抓住的一些事情,如窗口删除、点击按纽,这些就称为信号。(的确很难区别,不过在程序里使用信号和事件的方法却没有区别)
<BR>对信号和事件的处理首先要连接信号,这里将使用到连接函数gtk_signal_connect,
<BR>这里给出一个例子 <BR></SPAN>
<TABLE cellSpacing=1 cellPadding=3 width="90%" align=center
border=0>
<TBODY>
<TR>
<TD><SPAN class=genmed><B>代码::</B></SPAN></TD></TR>
<TR>
<TD class=code>
<BR> //----------------------------------------
<BR>
TheWindow=gtk_window_new(GTK_WINDOW_TOPLEVEL);
<BR>
gtk_signal_connect(GTK_OBJECT(TheWindow),"destroy",GTK_SIGNAL_FUNC(StopTheApp),NULL);
<BR> gtk_widget_show(TheWindow); <BR>
//-----------------------------------------------
<BR> </TD></TR></TBODY></TABLE><SPAN
class=postbody><BR>gtk_signal_connect函数有四个参数,第一个是GTK+对象,GTK_OBJECT宏起到转化作用,第二个是要捕捉的信号名,第三个是信号处理程序名,GTK_SIGNAL_FUNC宏是将函数的指针转换成一个更便于GTK+内部使用的信号函数指针。最后一个参数是要传递给信号处理函数的数据指针,没有就是NULL。
<BR>接下来就要编写信号处理函数 <BR></SPAN>
<TABLE cellSpacing=1 cellPadding=3 width="90%" align=center
border=0>
<TBODY>
<TR>
<TD><SPAN class=genmed><B>代码::</B></SPAN></TD></TR>
<TR>
<TD class=code> <BR>void StopTheApp(GtkObject *
TheWindow,gpointer data) <BR> { <BR>
gtk_main_quit(); <BR> }
<BR> </TD></TR></TBODY></TABLE><SPAN
class=postbody><BR>下面再写一个程序来理解信号和事件 <BR></SPAN>
<TABLE cellSpacing=1 cellPadding=3 width="90%" align=center
border=0>
<TBODY>
<TR>
<TD><SPAN class=genmed><B>代码::</B></SPAN></TD></TR>
<TR>
<TD class=code>
<BR>/******************************** <BR> *
events.c <BR> * <BR>
***********************************/ <BR>
#include<gtk/gtk.c> <BR> //信处理函数 <BR>
void StopTheApp(GtkWinget *TheWindow,gpointer data)
<BR> { <BR> gtk_main_quit();
<BR> } <BR> //事件处理函数 <BR> gboolean
EventHandler(GtkWidget *TheWindow,GdkEvent
*event,gpointer data) <BR> { <BR>
switch(event->type) <BR> {
<BR> case GDK_EXPOSE: <BR>
g_print("the window contents were
redrawn\n"); <BR> break; <BR>
case GDK_LEAVE_NOTIFY: <BR>
g_print("the mouse left the window\n"); <BR>
break; <BR> case GDK_DELETE:
<BR> g_print("the window was
killed"); <BR> break; <BR>
default: <BR> break;
<BR> } <BR> return FALSE;
<BR> } <BR> <BR> ginit main(gint
argc,gchar **argv) <BR> { <BR>
GtkWidget TheWidow; <BR>
gtk_init(&argc,&argv); <BR>
TheWindow=gtk_window_new(GTK_WINDOW_TOPLEVEL);
<BR>
gtk_signal_connect(GTK_OBJECT(TheWidow),"event",GTK_SIGNAL_FUNC(EventHandler),NULL);
<BR>
gtk_signal_connect(GTK_OBJECT(TheWidow),"destroy",GTK_SIGNAL_FUNC(StopTheApp),NULL);
<BR> gtk_widget_show(TheWindow); <BR>
gtk_main(); <BR> return 0;
<BR> } <BR> </TD></TR></TBODY></TABLE><SPAN
class=postbody><BR><BR>这里第一个信号连接函数是连接的事件处理函数,而第二个是连接的信号处理函数。
<BR>最后,需要断开信号连接,使用函数gtk_signal_disconnect(); <BR></SPAN>
<TABLE cellSpacing=1 cellPadding=3 width="90%" align=center
border=0>
<TBODY>
<TR>
<TD><SPAN class=genmed><B>代码::</B></SPAN></TD></TR>
<TR>
<TD class=code>
<BR>//---------------------------------------------
<BR> gint SignalHandler; <BR>
SignalHandler=gtk_signal_connect(GTK_OBJECT(window),"destroy",GTK_SIGNALFUNC(HandlerFunc),NULL);
<BR>
gtk_signal_disconnect(GTK_OBJECT(window),GTK_SIGNAL_FUNC(HandlerFunc),NULL);
<BR> </TD></TR></TBODY></TABLE><SPAN
class=postbody><BR>到这里,我们应该对GTK+编程有了一个大概的了解了。
<BR>[/code]</SPAN><SPAN
class=postbody><BR>_________________<BR><IMG
src="Xplore 查看主题 - GTK+编程入门[原创].files/sign_xinhe.gif"
border=0> <BR><SPAN
style="COLOR: #ff0000">这人一到了大学就要写程序,过去用ASP,一天三遍的写,麻烦!现在有了PHP,一行顶过去五行,方便!PHP效率不错还挺实惠。</SPAN></SPAN><SPAN
class=gensmall></SPAN></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD class=row1 vAlign=center align=left width=150><SPAN class=nav><A
class=nav
href="http://bbs.xplore.cn/viewtopic.php?t=1010#top">返回顶部</A></SPAN></TD>
<TD class=row1 vAlign=bottom noWrap width="100%" height=28>
<TABLE height=18 cellSpacing=0 cellPadding=0 width=18 border=0>
<TBODY>
<TR>
<TD vAlign=center noWrap><A
href="http://bbs.xplore.cn/profile.php?mode=viewprofile&u=48"><IMG
title=浏览用户个人资料 alt=浏览用户个人资料
src="Xplore 查看主题 - GTK+编程入门[原创].files/icon_profile.gif"
border=0></A> <A
href="http://bbs.xplore.cn/privmsg.php?mode=post&u=48"><IMG
title=发送私人信息 alt=发送私人信息
src="Xplore 查看主题 - GTK+编程入门[原创].files/icon_pm.gif"
border=0></A>
<SCRIPT language=JavaScript type=text/javascript><!-- if ( navigator.userAgent.toLowerCase().indexOf('mozilla') != -1 && navigator.userAgent.indexOf('5.') == -1 && navigator.userAgent.indexOf('6.') == -1 ) document.write(' '); else document.write('</td><td> </td><td valign="top" nowrap="nowrap"><div style="position:relative"><div style="position:absolute"></div><div style="position:absolute;left:3px;top:-1px"></div></div>'); //--></SCRIPT>
<NOSCRIPT></NOSCRIPT></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD class=spaceRow colSpan=2 height=1><IMG height=1 alt=""
src="Xplore 查看主题 - GTK+编程入门[原创].files/spacer.gif" width=1></TD></TR>
<TR align=middle>
<TD class=catBottom colSpan=2 height=28>
<TABLE cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR>
<FORM action=viewtopic.php?t=1010&start=0 method=post>
<TD align=middle><SPAN class=gensmall>显示贴子范围: <SELECT
name=postdays><OPTION value=0 selected>所有贴子</OPTION><OPTION
value=1>1 天以来</OPTION><OPTION value=7>7 天以来</OPTION><OPTION
value=14>2 周以来</OPTION><OPTION value=30>1
个月来</OPTION><OPTION value=90>3 个月来</OPTION><OPTION
value=180>6 个月来</OPTION><OPTION value=364>1
年以来</OPTION></SELECT> <SELECT name=postorder><OPTION
value=asc selected>旧贴在前面</OPTION><OPTION
value=desc>新贴在前面</OPTION></SELECT> <INPUT class=liteoption type=submit value=确定 name=submit></SPAN></TD></FORM></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=2 cellPadding=2 width="100%" align=center border=0>
<TBODY>
<TR>
<TD vAlign=center noWrap align=left><SPAN class=nav><A
href="http://bbs.xplore.cn/posting.php?mode=newtopic&f=18"><IMG
alt=发表新贴 src="Xplore 查看主题 - GTK+编程入门[原创].files/post.gif"
align=middle border=0></A> <A
href="http://bbs.xplore.cn/posting.php?mode=reply&t=1010"><IMG
alt=回复主题 src="Xplore 查看主题 - GTK+编程入门[原创].files/reply.gif"
align=middle border=0></A></SPAN></TD>
<TD vAlign=center align=left width="100%"><SPAN
class=nav> <A class=nav
href="http://bbs.xplore.cn/index.php">Xplore 论坛首页</A> -> <A
class=nav href="http://bbs.xplore.cn/viewforum.php?f=18">UNIX/Linux
编程</A></SPAN></TD>
<TD vAlign=top noWrap align=right><SPAN class=gensmall>所有时间:
北京时间</SPAN><BR><SPAN class=nav></SPAN></TD></TR>
<TR>
<TD align=left colSpan=3><SPAN class=nav>页数: <B>1</B> (共 <B>1</B>
页)</SPAN></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=2 width="100%" align=center border=0>
<TBODY>
<TR>
<TD vAlign=top noWrap align=left width="40%"><SPAN class=gensmall><A
href="http://bbs.xplore.cn/viewtopic.php?t=1010&watch=topic&start=0&sid=38971f6fa859c4e0efc2bbfe80e1d56f">跟踪主题</A></SPAN><BR> <BR></TD>
<TD vAlign=top noWrap align=right>
<FORM name=jumpbox
onsubmit="if(document.jumpbox.f.value == -1){return false;}"
action=viewforum.php method=get>
<TABLE cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR>
<TD noWrap><SPAN class=gensmall>论坛跳转: <SELECT
onchange="if(this.options[this.selectedIndex].value != -1){ forms['jumpbox'].submit() }"
name=f><OPTION value=-1>选择论坛</OPTION><OPTION
value=-1> </OPTION><OPTION
value=-1>站内事务</OPTION><OPTION
value=-1>----------------</OPTION><OPTION
value=9>公告栏</OPTION><OPTION value=-1> </OPTION><OPTION
value=-1>我爱编程</OPTION><OPTION
value=-1>----------------</OPTION><OPTION
value=14>VB,VC,.net专栏</OPTION><OPTION
value=15>C/C++专栏</OPTION><OPTION
value=2>JAVA技术</OPTION><OPTION
value=16>脚本语言及WEB开发</OPTION><OPTION
value=17>XML编程</OPTION><OPTION value=18 selected>UNIX/Linux
编程</OPTION><OPTION value=29>编程技术</OPTION><OPTION
value=31>每周一题</OPTION><OPTION
value=-1> </OPTION><OPTION
value=-1>操作系统</OPTION><OPTION
value=-1>----------------</OPTION><OPTION
value=1>Linux/UNIX技术</OPTION><OPTION
value=3>Windows技术</OPTION><OPTION
value=-1> </OPTION><OPTION
value=-1>计算机应用</OPTION><OPTION
value=-1>----------------</OPTION><OPTION
value=20>电脑技术</OPTION><OPTION value=8>系统安全</OPTION><OPTION
value=30>数据库技术</OPTION><OPTION
value=-1> </OPTION><OPTION value=-1>设计</OPTION><OPTION
value=-1>----------------</OPTION><OPTION
value=27>图形图像设计</OPTION><OPTION
value=-1> </OPTION><OPTION
value=-1>休闲娱乐</OPTION><OPTION
value=-1>----------------</OPTION><OPTION
value=4>心情涂鸦</OPTION><OPTION value=32>跳蚤市场</OPTION><OPTION
value=-1> </OPTION><OPTION
value=-1>课程专栏</OPTION><OPTION
value=-1>----------------</OPTION><OPTION
value=13>汇编语言程序设计</OPTION></SELECT> <INPUT class=liteoption type=submit value=确定></SPAN></TD></TR></TBODY></TABLE></FORM><SPAN
class=gensmall>您 <B>可以</B> 发表新贴<BR>您 <B>可以</B> 回复主题<BR>您 <B>可以</B>
编辑发贴<BR>您 <B>可以</B> 删除发贴<BR>您 <B>可以</B> 投票贴子<BR>You <B>can</B>
attach files in this forum<BR>You <B>can</B> download files in this
forum<BR></SPAN></TD></TR></TBODY></TABLE>
<DIV align=center><SPAN class=copyright><BR><BR><!-- We request you retain the full copyright notice below including the link to www.phpbb.com. This not only gives respect to the large amount of time given freely by the developers but also helps build interest, traffic and use of phpBB 2.0. If you cannot (for good reason) retain the full copyright we request you at least leave in place the Powered by phpBB 2.0.8 line, with phpBB linked to www.phpbb.com. If you refuse to include even this then support on our forums may be affected. The phpBB Group : 2002// -->Powered
by <A class=copyright href="http://www.phpbb.com/" target=_phpbb>phpBB</A>
2.0.8 © 2001, 2002 phpBB
Group<BR></SPAN></DIV></TD></TR></TBODY></TABLE></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -