´ÙÀ½ ÀÌÀü Â÷·Ê

4. ¾ÕÀ¸·Î ³ª¾Æ°¡¸ç

4.1 ÀÚ·áÇü

¾Õ¼­ÀÇ ¿¹Á¦¿¡¼­ ÁÖ¸ñÇß°ÚÁö¸¸ ¼³¸íÀÌ ÇÊ¿äÇÑ °ÍÀÌ Á» ÀÖ´Ù. gint, gchar µîÀº °¢°¢ int¿Í char¿¡ ´ëÇÑ typedefµéÀÌ´Ù. ÀÌ°ÍÀº °è»êÀ» ÇÒ ¶§ °£´ÜÇÑ ÀÚ·áÇüµéÀÇ Å©±â¿¡ ´ëÇÑ ÁöÀúºÐÇÑ ÀÇÁ¸¼ºÀ» ÇÇÇϱâ À§ÇÑ °ÍÀÌ´Ù. 64ºñÆ®ÀÇ ¾ËÆĵç 32ºñÆ®ÀÇ ÀÎÅÚÀ̵ç "gint32"´Â Ç÷§Æû¿¡ °ü°è¾øÀÌ 32ºñÆ® Á¤¼ö·Î typedefµÇ¾î ÀÖ´Â °ÍÀÌ ÁÁÀº ¿¹°¡ µÉ °ÍÀÌ´Ù. ÀÌ typedefÀº »ó´çÈ÷ Á÷°üÀûÀÌ´Ù. ±×µéÀº ¸ðµÎ glib/ glib.h¿¡¼­ Á¤ÀǵǾî ÀÖ´Ù(ÀÌ°ÍÀº gtk.h¿¡¼­ Æ÷ÇÔ½ÃÅ°°Ô µÈ´Ù.). ´ç½ÅÀº ¶ÇÇÑ ÇÔ¼ö°¡ GtkObject¸¦ ºÎ¸¦ ¶§ GtkWidgetÀ» ÀÌ¿ëÇÏ´Â °Í¿¡µµ ÁÖ¸ñÇÒ °ÍÀÌ´Ù. GTK´Â °´Ã¼ÁöÇâÀûÀ¸·Î ¼³°èµÈ °ÍÀÌ°í, widgetÀº ÇϳªÀÇ objectÀÌ´Ù.

4.2 ½Ã±×³Î Çڵ鷯¿¡ ´ëÇØ Á» ´õ ¾Ë¾Æº¸±â

gtk_signal_connectÀÇ ¼±¾ðÀ» ¶Ç ´Ù¸£°Ô »ìÆ캸ÀÚ.

gint gtk_signal_connect (GtkObject *object, gchar *name,
                         GtkSignalFunc func, gpointer func_data);

gintÇüÀÇ ¸®ÅÏ°ª? ÀÌ°ÍÀº callbackÇÔ¼ö¸¦ È®ÀÎÇϱâ À§ÇÑ ²¿¸®Ç¥´Ù. ¾Õ¼­ ¾ê±âÇßµíÀÌ ¿ì¸®´Â ½Ã±×³Î°ú object¿¡ ´ëÇØ ÇÊ¿äÇÑ ¸¸Å­ÀÇ ¸¹Àº callbackÀ» °¡Áú ¼ö ÀÖ°í, ±×°ÍµéÀº ºÙ¿©Á® ÀÖ´Â ¼ø¼­´ë·Î °¢°¢ ½ÇÇàµÉ °ÍÀÌ´Ù. ÀÌ ²¿¸®Ç¥´Â ¿ì¸®°¡ ¸®½ºÆ®¿¡¼­ ÀÌ·± callbackÀ» Á¦°ÅÇϵµ·Ï ÇØÁØ´Ù.

void gtk_signal_disconnect (GtkObject *object,
                            gint id);

±×·¡¼­, Çڵ鷯·ÎºÎÅÍ Á¦°ÅÇÏ°íÀÚ ÇÏ´Â widget°ú signal_connectÇÔ¼ö·ÎºÎÅÍ ¸®ÅÏµÈ±× widgetÀÇ ²¿¸®Ç¥ ȤÀº id¸¦ ³Ñ°ÜÁÜÀ¸·Î½á ½Ã±×³Î Çڵ鷯¸¦ ²÷¾îÁÙ ¼ö ÀÖ´Ù.

Object¿¡¼­ ¸ðµç ½Ã±×³Î Çڵ鷯¸¦ Á¦°ÅÇÏ´Â ¶Ç´Ù¸¥ ÇÔ¼ö´Â ÀÌ°ÍÀÌ´Ù.

gtk_signal_handlers_destroy (GtkObject *object);
ÀÌ È£ÃâÀº º¸ÀÌ´Â ±×´ë·Î´Ù. ÀÌ°ÍÀº ù¹ø° ÀÎÀÚ·Î ³Ñ°Ü¹ÞÀº object¿¡¼­, ´ÜÁö ÇöÀç ¼³Á¤µÈ ¸ðµç ½Ã±×³Î Çڵ鷯¸¦ Á¦°ÅÇØ ÁØ´Ù.

4.3 Çâ»óµÈ Hello World ÇÁ·Î±×·¥

CallbackÇÔ¼ö¿¡ ´ëÇÑ ´õ ³ªÀº ¿¹Á¦°¡ µÉ ¾à°£ °³¼±µÈ hello world¸¦ º¸ÀÚ. ÀÌ°ÍÀº ¶ÇÇÑ ¿ì¸®ÀÇ ´ÙÀ½ Àý¿¡¼­ÀÇ ÁÖÁ¦ÀÎ ÆÐÅ· widgetÀ» ¼Ò°³ÇÒ °ÍÀÌ´Ù.

/* helloworld2.c */

#include <gtk/gtk.h>

/* ¿ì¸®ÀÇ ¾à°£ °³¼±µÈ callback.  ÀÌ ÇÔ¼ö·Î ÀüÇØÁø µ¥ÀÌÅʹ ǥÁØÃâ·ÂÀ¸·Î
 * º¸¿©Áø´Ù. */
void callback (GtkWidget *widget, gpointer data)
{
        g_print ("Hello again - %s was pressed\n", (char *) data);
}
/* ´Ù¸¥ callback */
void delete_event (GtkWidget *widget, GdkEvent *event, gpointer data)
{
        gtk_main_quit ();
}
int main (int argc, char *argv[])
{
        /* GtkWidgetÀº widgetµéÀ» À§ÇÑ ÀúÀåÀå¼Ò ŸÀÔÀÌ´Ù. */ 
        GtkWidget *window;
        GtkWidget *button;
        GtkWidget *box1;
        /* ÀÌ°ÍÀº ¸ðµç GTK ¾îÇÿ¡¼­ ¾´´Ù.  ¸í·ÉÇà¿¡¼­ ÁÖ¾îÁø ÀÎÀÚµéÀº ÀÌ°ÍÀ»
         * Åë°úÇؼ­ ¾îÇÿ¡ Àü´ÞµÈ´Ù. */
        gtk_init (&argc, &argv);
        /* »õ·Î¿î À©µµ¸¦ ¸¸µç´Ù. */
        window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
        /* »õ·Î Á¢ÇÏ´Â ÇÔ¼ö·Î, À©µµ¿¡ "Hello Buttons!"¶ó´Â ŸÀÌƲÀ» ÁØ´Ù. */
        gtk_window_set_title (GTK_WINDOW (window), "Hello Buttons!");
        /* ¿©±â¼­ ¿ì¸®´Â GTK¸¦ Áï½Ã ³¡³ª°Ô ÇÏ´Â delete_event¸¦ À§ÇÑ Çڵ鷯¸¦
         * ¼¼ÆÃÇÑ´Ù. */
        gtk_signal_connect (GTK_OBJECT (window), "delete_event",
                        GTK_SIGNAL_FUNC (delete_event), NULL);
        /* À©µµÀÇ border width¸¦ ¼¼ÆÃÇÑ´Ù. */
        gtk_container_border_width (GTK_CONTAINER (window), 10);
        /* widgetµéÀÌ ÆÐÅ·µÉ ¹Ú½º¸¦ ¸¸µç´Ù.  ÀÌ°ÍÀº ÆÐÅ·¿¡ ´ëÇÑ ºÎºÐ¿¡¼­
         * ÀÚ¼¼È÷ ¼³¸íµÉ °ÍÀÌ´Ù.  ¹Ú½º´Â ½ÇÁ¦·Î º¸ÀÌ´Â °Ç ¾Æ´Ï¸ç ´ÜÁö
         * widgetµéÀ» Á¤·ÄÇØ ³õÀ» µµ±¸·Î¼­ ¾²ÀδÙ. */
        box1 = gtk_hbox_new(FALSE, 0);
        /* ¹Ú½º¸¦ À©µµ ¾È¿¡ ³õ´Â´Ù. */
        gtk_container_add (GTK_CONTAINER (window), box1);
        /* "Button 1"À̶õ ¶óº§À» °¡Áø »õ·Î¿î ¹öÆ°À» ¸¸µç´Ù. */
        button = gtk_button_new_with_label ("Button 1");
        /* ÀÌÁ¦ ¹öÆ°ÀÌ Å¬¸¯µÇ¸é ¿ì¸®´Â ÀÌ ¹öÆ°¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ ÀÎÀÚ·Î °¡Áö´Â
         * "callback" ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù. */
        gtk_signal_connect (GTK_OBJECT (button), "clicked",
                        GTK_SIGNAL_FUNC (callback), (gpointer) "button 1");
        /* gtk_container_add ´ë½Å¿¡, ¿ì¸®´Â ÀÌ¹Ì À©µµ¿¡ ÆÐÅ·µÇ¾î ÀÖ´Â º¸ÀÌÁö
         * ¾Ê´Â ¹Ú½º¿¡ ¹öÆ°À» ÆÐÅ·ÇÑ´Ù. */
        gtk_box_pack_start(GTK_BOX(box1), button, TRUE, TRUE, 0);
        /* ÀÌ ¼ø¼­¸¦ ²À ±â¾ïÇ϶ó.  ¿©±â¼­ ¹öÆ°¿¡ ´ëÇÑ ¼¼ÆÃÀÌ ¿ÏÀüÈ÷ ³¡³µÀ½À»
         * GTK¿¡°Ô ¾Ë¸®°í, µû¶ó¼­ ±×°ÍÀº ÀÌÁ¦ º¸¿©Áú ¼ö ÀÖ´Ù. */
        gtk_widget_show(button);
        /* µÎ¹ø° ¹öÆ°À» ¸¸µé±â À§ÇØ °°Àº ÀýÂ÷¸¦ °ÅÄ£´Ù. */
        button = gtk_button_new_with_label ("Button 2");
        /* °°Àº callbackÀ» È£ÃâÇÑ´Ù.  ¹°·Ð ÀÎÀÚ´Â "button 2"¿¡ ´ëÇÑ
         * Æ÷ÀÎÅÍ´Ù. */
        gtk_signal_connect (GTK_OBJECT (button), "clicked",
                        GTK_SIGNAL_FUNC (callback), (gpointer) "button 2");
        gtk_box_pack_start(GTK_BOX(box1), button, TRUE, TRUE, 0);
        /* ¿ì¸®°¡ ¹öÆ°À» ¸ÕÀú º¸¿©Áà¾ß ÇÏ´Â ±× ¼ø¼­´Â ½ÇÁ¦·Î Áß¿äÇÑ °ÍÀº
         * ¾Æ´Ï´Ù.  ÇÏÁö¸¸ ³ª´Â ¸ðµç °ÍµéÀÌ ÇѲ¨¹ø¿¡ Æ¢¾î ³ª¿À¸ç º¸¿©Áú ¼ö
         * ÀÖµµ·Ï À©µµ¸¦ °¡Àå ³ªÁß¿¡ º¸¿©ÁÙ °ÍÀ» ±ÇÀåÇÑ´Ù. */
        gtk_widget_show(button);
        gtk_widget_show(box1);
        gtk_widget_show (window);
        /* ¿©±â¼­ ¾ÕÀ¸·ÎÀÇ Àç¹ÌÀÖ´Â °ÍµéÀ» ±â´Ù¸®°Ô µÈ´Ù! */
        gtk_main ();
        return 0;
}

ÀÌ ÇÁ·Î±×·¥À» ¿ì¸®ÀÇ Ã¹¹ø° ¿¹Á¦¿Í °°Àº ¸µÅ© ÀÎÀÚ¸¦ ÁÖ°í ÄÄÆÄÀÏÇÏÀÚ. ¿ª½Ã ¿ì¸®´Â ÀÌ ÇÁ·Î±×·¥À» Á¾·áÇϱâ À§Çؼ­ À©µµ¸Å´ÏÀú¸¦ ÀÌ¿ëÇϰųª ¸í·ÉÇà¿¡¼­ Á×ÀÌ´Â °Í ¸»°í´Â ´Ù¸¥ ¹æ¹ýÀÌ ¾ø´Ù´Â °É ¾Ë °ÍÀÌ´Ù. ¿¬½À»ï¾Æ ¼¼¹ø°·Î "Quit" ¹öÆ°À» ¸¸µé¾î Ãß°¡ÇØ º¸´Â °Íµµ ÁÁÀ» °ÍÀÌ´Ù. ¶ÇÇÑ ´ÙÀ½ ÀýÀ» Àо¸ç gtk_box_pack_start()¿¡ ¿É¼ÇÀ» Á־ ¼öµµ ÀÖ´Ù. À©µµÀÇ Å©±â¸¦ ¹Ù²Ù·Á°í ½Ãµµµµ Çغ¸°í, µ¿ÀÛÀ» °üÂûÇØ º¸¶ó.

Âü°í·Î, gtk_window_new()¸¦ À§ÇÑ ¶Ç´Ù¸¥ À¯¿ëÇÑ defineÀ¸·Î GTK_WINDOW_DIALOG µµ ÀÖ´Ù. ÀÌ°ÍÀº À©µµ¸Å´ÏÀú¿Í ¾à°£ ´Ù¸¥ ¹æ½ÄÀ¸·Î »óÈ£ÀÛ¿ëÇϸç, ÀϽÃÀûÀÎ À©µµ µé¿¡ ´ëÇØ ¾²¿©Á®¾ß ÇÑ´Ù.


´ÙÀ½ ÀÌÀü Â÷·Ê