?? xplore 查看主題 - gtk+編程入門(mén)[原創(chuàng)].htm
字號(hào):
<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>編譯通過(guò)后運(yùn)行此程序,會(huì)在桌面上看到一個(gè)窗體。 <BR>下面來(lái)解釋一下這段小程序
<BR>1、關(guān)于數(shù)據(jù)類型
<BR>這個(gè)程序中出現(xiàn)了gint,gchar等數(shù)據(jù)類型,這些都是GLIB的數(shù)據(jù)類型,GLIB有點(diǎn)像windows下C的STL,GLIB的數(shù)據(jù)類型的表示和C的差不多,基本上是在前面加一個(gè)g的前綴,但GLIB對(duì)數(shù)據(jù)類型的處理(主要指內(nèi)存管理方面)比C要優(yōu)化一些。如果這方面還有什么問(wèn)題請(qǐng)參考GLIB的說(shuō)明。
<BR>2、關(guān)于GtkWidget
<BR>GtkWidget從本質(zhì)上說(shuō)它只一個(gè)數(shù)據(jù)結(jié)構(gòu),在這里,我們可以把它理解為一個(gè)對(duì)象,這里好像用到了面向?qū)ο蟮母拍睿诲e(cuò)同GTK+就是基于面象對(duì)面的恩想設(shè)計(jì)的,你可能會(huì)問(wèn),GTK+程序不是用C語(yǔ)言寫(xiě)的嗎?注意,這里只是用到了面向?qū)ο蟮乃枷牒兔嫦驅(qū)ο蟮木幊谭椒ǎ⒉皇敲嫦驅(qū)ο笳Z(yǔ)言,C++語(yǔ)言的發(fā)明人Bjarne
Stroustrup曾經(jīng)說(shuō)過(guò),面向?qū)ο竦某绦蛟O(shè)計(jì)是編寫(xiě)程序代碼的一種方法。而向?qū)ο竦某绦蛟O(shè)計(jì)語(yǔ)言是在語(yǔ)言內(nèi)部明確的提供幫助。
<BR>因此,這里的GtkWidget可以說(shuō)一個(gè)對(duì)象。 <BR>3、初始化GTK+
<BR>在調(diào)用GTK+的函數(shù)之前,必須先初始化GTK+。gtk_init()就是對(duì)GTK+進(jìn)行初始化,它主要處理命令行的參數(shù)。
<BR>4、創(chuàng)建并顯示窗體
<BR>函數(shù)gtk_window_new()的作用就是創(chuàng)建一個(gè)窗體,而該函數(shù)的參數(shù)是說(shuō)明所要?jiǎng)?chuàng)建窗體的類型,它可以是以下三種中的一種:
<BR>GTK_WINDOW_TOPLEVEL、GTK_WINDOW_DIALOG、GTK_WINDOW_POPUP
<BR>5、gtk_main循環(huán)
<BR>gtk_main函數(shù)的作用就是進(jìn)入GTK+循環(huán),即程序不停的運(yùn)行,直到程序的的另一個(gè)部分調(diào)用了gtk_main_quit或程序崩潰為止,這有點(diǎn)像win32程序的消息循環(huán)。
<BR><BR>三、信號(hào)與事件
<BR>這里將引入GTK+信號(hào)和事件的概念,信號(hào)和事件的概念十分相近,初學(xué)者比較難區(qū)別,簡(jiǎn)單的說(shuō),當(dāng)用戶點(diǎn)擊一個(gè)按紐或是移動(dòng)鼠標(biāo),就稱該用戶觸發(fā)了一個(gè)事件,而X本身能夠抓住的一些事情,如窗口刪除、點(diǎn)擊按紐,這些就稱為信號(hào)。(的確很難區(qū)別,不過(guò)在程序里使用信號(hào)和事件的方法卻沒(méi)有區(qū)別)
<BR>對(duì)信號(hào)和事件的處理首先要連接信號(hào),這里將使用到連接函數(shù)gtk_signal_connect,
<BR>這里給出一個(gè)例子 <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函數(shù)有四個(gè)參數(shù),第一個(gè)是GTK+對(duì)象,GTK_OBJECT宏起到轉(zhuǎn)化作用,第二個(gè)是要捕捉的信號(hào)名,第三個(gè)是信號(hào)處理程序名,GTK_SIGNAL_FUNC宏是將函數(shù)的指針轉(zhuǎn)換成一個(gè)更便于GTK+內(nèi)部使用的信號(hào)函數(shù)指針。最后一個(gè)參數(shù)是要傳遞給信號(hào)處理函數(shù)的數(shù)據(jù)指針,沒(méi)有就是NULL。
<BR>接下來(lái)就要編寫(xiě)信號(hào)處理函數(shù) <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>下面再寫(xiě)一個(gè)程序來(lái)理解信號(hào)和事件 <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> //信處理函數(shù) <BR>
void StopTheApp(GtkWinget *TheWindow,gpointer data)
<BR> { <BR> gtk_main_quit();
<BR> } <BR> //事件處理函數(shù) <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>這里第一個(gè)信號(hào)連接函數(shù)是連接的事件處理函數(shù),而第二個(gè)是連接的信號(hào)處理函數(shù)。
<BR>最后,需要斷開(kāi)信號(hào)連接,使用函數(shù)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>到這里,我們應(yīng)該對(duì)GTK+編程有了一個(gè)大概的了解了。
<BR>[/code]</SPAN><SPAN
class=postbody><BR>_________________<BR><IMG
src="Xplore 查看主題 - GTK+編程入門(mén)[原創(chuàng)].files/sign_xinhe.gif"
border=0> <BR><SPAN
style="COLOR: #ff0000">這人一到了大學(xué)就要寫(xiě)程序,過(guò)去用ASP,一天三遍的寫(xiě),麻煩!現(xiàn)在有了PHP,一行頂過(guò)去五行,方便!PHP效率不錯(cuò)還挺實(shí)惠。</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=瀏覽用戶個(gè)人資料 alt=瀏覽用戶個(gè)人資料
src="Xplore 查看主題 - GTK+編程入門(mén)[原創(chuàng)].files/icon_profile.gif"
border=0></A> <A
href="http://bbs.xplore.cn/privmsg.php?mode=post&u=48"><IMG
title=發(fā)送私人信息 alt=發(fā)送私人信息
src="Xplore 查看主題 - GTK+編程入門(mén)[原創(chuàng)].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+編程入門(mén)[原創(chuàng)].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 天以來(lái)</OPTION><OPTION value=7>7 天以來(lái)</OPTION><OPTION
value=14>2 周以來(lái)</OPTION><OPTION value=30>1
個(gè)月來(lái)</OPTION><OPTION value=90>3 個(gè)月來(lái)</OPTION><OPTION
value=180>6 個(gè)月來(lái)</OPTION><OPTION value=364>1
年以來(lái)</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=發(fā)表新貼 src="Xplore 查看主題 - GTK+編程入門(mén)[原創(chuàng)].files/post.gif"
align=middle border=0></A> <A
href="http://bbs.xplore.cn/posting.php?mode=reply&t=1010"><IMG
alt=回復(fù)主題 src="Xplore 查看主題 - GTK+編程入門(mén)[原創(chuàng)].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 論壇首頁(yè)</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>所有時(shí)間:
北京時(shí)間</SPAN><BR><SPAN class=nav></SPAN></TD></TR>
<TR>
<TD align=left colSpan=3><SPAN class=nav>頁(yè)數(shù): <B>1</B> (共 <B>1</B>
頁(yè))</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>論壇跳轉(zhuǎn): <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>站內(nèi)事務(wù)</OPTION><OPTION
value=-1>----------------</OPTION><OPTION
value=9>公告欄</OPTION><OPTION value=-1> </OPTION><OPTION
value=-1>我愛(ài)編程</OPTION><OPTION
value=-1>----------------</OPTION><OPTION
value=14>VB,VC,.net專欄</OPTION><OPTION
value=15>C/C++專欄</OPTION><OPTION
value=2>JAVA技術(shù)</OPTION><OPTION
value=16>腳本語(yǔ)言及WEB開(kāi)發(fā)</OPTION><OPTION
value=17>XML編程</OPTION><OPTION value=18 selected>UNIX/Linux
編程</OPTION><OPTION value=29>編程技術(shù)</OPTION><OPTION
value=31>每周一題</OPTION><OPTION
value=-1> </OPTION><OPTION
value=-1>操作系統(tǒng)</OPTION><OPTION
value=-1>----------------</OPTION><OPTION
value=1>Linux/UNIX技術(shù)</OPTION><OPTION
value=3>Windows技術(shù)</OPTION><OPTION
value=-1> </OPTION><OPTION
value=-1>計(jì)算機(jī)應(yīng)用</OPTION><OPTION
value=-1>----------------</OPTION><OPTION
value=20>電腦技術(shù)</OPTION><OPTION value=8>系統(tǒng)安全</OPTION><OPTION
value=30>數(shù)據(jù)庫(kù)技術(shù)</OPTION><OPTION
value=-1> </OPTION><OPTION value=-1>設(shè)計(jì)</OPTION><OPTION
value=-1>----------------</OPTION><OPTION
value=27>圖形圖像設(shè)計(jì)</OPTION><OPTION
value=-1> </OPTION><OPTION
value=-1>休閑娛樂(lè)</OPTION><OPTION
value=-1>----------------</OPTION><OPTION
value=4>心情涂鴉</OPTION><OPTION value=32>跳蚤市場(chǎng)</OPTION><OPTION
value=-1> </OPTION><OPTION
value=-1>課程專欄</OPTION><OPTION
value=-1>----------------</OPTION><OPTION
value=13>匯編語(yǔ)言程序設(shè)計(jì)</OPTION></SELECT> <INPUT class=liteoption type=submit value=確定></SPAN></TD></TR></TBODY></TABLE></FORM><SPAN
class=gensmall>您 <B>可以</B> 發(fā)表新貼<BR>您 <B>可以</B> 回復(fù)主題<BR>您 <B>可以</B>
編輯發(fā)貼<BR>您 <B>可以</B> 刪除發(fā)貼<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>
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -