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

5. ÆÐÅ· Widget

¿ì¸®°¡ ¾î¶² ¾îÇÃÀ» °³¹ßÇϸ鼭, ÇϳªÀÇ À©µµ¿¡ Çϳª ÀÌ»óÀÇ ¹öÆ°À» ³õÀ¸·Á ÇÒ °ÍÀÌ´Ù. ¿ì¸®ÀÇ Ã¹¹ø° hello world ¿¹Á¦´Â ÇϳªÀÇ widget¸¸ ½è°í µû¶ó¼­ ¿ì¸®´Â ±×°ÍÀ» À©µµ ³»ºÎ¿¡ "pack"Çϱâ À§ÇØ gtk_container_add ÇÔ¼ö¸¦ ½è´Ù. ±×·¯³ª ¿ì¸®°¡ ÇϳªÀÇ À©µµ¿¡ ´õ¸¹Àº widgetÀ» ³õÀ¸·Á ÇÒ ¶§, ¾î¶»°Ô ±×µéÀÌ ³õÀÏ À§Ä¡¸¦ Á¦¾îÇØ¾ß ÇÒ±î? ¿©±â¼­ ¹Ù·Î "packing"À̶õ °ÍÀÌ µîÀåÇÑ´Ù.

5.1 ¹Ú½º packingÀÇ ¿ø¸®

´ëºÎºÐÀÇ ÆÐÅ·Àº ¾Õ¼­ÀÇ ¿¹Á¦¿¡¼­Ã³·³ ¹Ú½º¸¦ ¸¸µå´Â °ÍÀ¸·Î ÀÌ·ç¾îÁø´Ù. À̵éÀº ¿ì¸®ÀÇ widgetÀ» ¼öÆò ȤÀº ¼öÁ÷ ¹æÇâÀ¸·Î ÆÐÅ·ÇØ ³ÖÀ» ¼ö ÀÖ´Â, º¸ÀÌÁö ¾Ê´Â widget ÄÁÅ×À̳ʵéÀÌ´Ù. ¼öÆò ¹Ú½º·ÎÀÇ ÆÐÅ·widgetÀÎ °æ¿ì, object´Â È£Ãâ ÇÏ´Â ¹æ½Ä¿¡ µû¶ó ¼öÆòÀ¸·Î ¿ÞÂÊ¿¡¼­ ¿À¸¥ÂÊÀ¸·Î ȤÀº ¿À¸¥ÂÊ¿¡¼­ ¿ÞÂÊÀ¸·Î »ðÀÔ µÈ´Ù. ¼öÁ÷ ¹Ú½º¿¡¼­´Â ¹Ý´ë·Î ¼öÁ÷À¸·Î »ðÀԵȴÙ. ¿ì¸®´Â ¿øÇÏ´Â È¿°ú¸¦ ³»±â À§ÇØ ´Ù¸¥ ¹Ú½ºµéÀÇ ¾ÈÆÆ¿¡¼­ ¾î¶»°Ô¶óµµ Á¶ÇÕÇؼ­ »ç¿ëÇÒ ¼ö ÀÖ´Ù.

»õ·Î¿î ¼öÆò¹Ú½º¸¦ ¸¸µé±â À§ÇØ ¿ì¸®´Â gtk_hbox_new()¸¦, ±×¸®°í ¼öÁ÷¹Ú½º¸¦ À§Çؼ­´Â gtk_vbox_new()¸¦ ÀÌ¿ëÇÑ´Ù. gtk_box_pack_start()¿Í gtk_box_pack_end ()´Â ÀÌ·± ÄÁÅ×À̳ÊÀÇ ³»ºÎ¿¡ objectµéÀ» À§Ä¡½ÃÅ°±â À§ÇØ »ç¿ëÇÑ´Ù. gtk_box_ pack_start()ÇÔ¼ö´Â ¼öÁ÷¹Ú½º¿¡¼­´Â À§¿¡¼­ ¾Æ·¡ÂÊÀ¸·Î, ±×¸®°í ¼öÆò¹Ú½º¿¡¼­´Â ¿ÞÂÊ¿¡¼­ ¿À¸¥ÂÊÀ¸·Î ÆÐÅ·ÇÒ °ÍÀÌ´Ù. ±×¸®°í gtk_box_pack_end()´Â ÀÌ¿Í ¹Ý´ë ¹æÇâÀ¸·Î ÆÐÅ·ÇÑ´Ù. ÀÌ ÇÔ¼öµéÀ» ÀÌ¿ëÇÔÀ¸·Î½á ¿ì¸®´Â ¿À¸¥ÂÊ ¶Ç´Â ¿ÞÂÊÀ¸·Î widgetÀ» Á¤·ÄÇÒ ¼ö ÀÖ°í, ¿øÇÏ´Â È¿°ú¸¦ ³¾ ¼ö ÀÖ´Ù. ¿ì¸®´Â ´ëºÎºÐÀÇ ¿¹Á¦¿¡¼­ gtk_box_pack_start()¸¦ ÀÌ¿ëÇÒ °ÍÀÌ´Ù. Object´Â ¶Ç´Ù¸¥ ÄÁÅ×À̳ʰųª widgetÀÌ µÉ ¼ö ÀÖ´Ù. ±×¸®°í »ç½Ç, ¸¹Àº widgetµéÀº ½ÇÁ¦·Î ¹öÆ°À» Æ÷ÇÔÇÏ°í ÀÖ´Â widget ÀÌÁö¸¸, ¿ì¸®´Â º¸Åë ¹öÆ° ¾ÈÀÇ ¶óº§¸¸À» ÀÌ¿ëÇÒ °ÍÀÌ´Ù.

ÀÌ·± ÇÔ¼öÈ£Ãâ·Î½á, GTK´Â ¿ì¸®°¡ widgetÀ» ³õÀ» À§Ä¡¸¦ ¾Ë°ÔµÇ°í µû¶ó¼­ ÀÚµ¿ÀûÀ¸·Î Å©±â¸¦ Á¶ÀýÇÑ´ÙµçÁö ¶Ç´Ù¸¥ ¸Å·ÂÀûÀÎ ÀϵéÀ» ÇÒ ¼ö ÀÖ°Ô µÈ´Ù. ¶ÇÇÑ ¿ì¸®ÀÇ widgetÀÌ ¾î¶»°Ô ÆÐÅ·µÇ¾î¾ß ÇÏ´À³Ä¿¡ µû¸¥ ¼ö¸¹Àº ¿É¼Çµéµµ ÀÖ´Ù. ¿ì¸®°¡ »ó»óÇϵíÀÌ, ÀÌ·± ¹æ½ÄÀº widgetÀ» ³õ°í ¸¸µå´Â µ¥ À־ »ó´çÇÑ À¯¿¬¼º À» Á¦°øÇØ ÁØ´Ù.

5.2 ¹Ú½º¿¡ ´ëÇØ ÀÚ¼¼È÷ ¾Ë¾Æº¸ÀÚ

ÀÌ·± À¯¿¬¼º ¶§¹®¿¡, GTK¿¡¼­ ¹Ú½º¸¦ ÆÐÅ·ÇÏ´Â °ÍÀº óÀ½¿£ È¥¶õ½º·¯¿ïÁö ¸ð¸¥´Ù. ¸¹Àº ¿É¼ÇµéÀÌ ÀÖÀ¸¸ç, ±×µéÀÌ ¾î¶»°Ô ¼­·Î ²ç¾î ¸ÂÃçÁö´ÂÁö Áï½Ã °£ÆÄ ÇÒ ¼ö´Â ¾øÀ» °ÍÀÌ´Ù. ±×·¯³ª °á±¹, ¿ì¸®´Â ´Ù¼¸ °¡ÁöÀÇ ±âº»ÀûÀÎ ½ºÅ¸ÀÏÀ» °¡Áö°Ô µÈ´Ù.

Box Packing Example Image

°¢°¢ÀÇ ÁÙÀº ¸î °³ÀÇ ¹öÆ°À» °¡Áö°í ÀÖ´Â ÇϳªÀÇ ¼öÆò¹Ú½º(hbox)¸¦ Æ÷ÇÔÇÑ´Ù. ÇÔ¼öÈ£Ãâ gtk_box_packÀº ÀÌ ¼öÆò¹Ú½º¿¡ °¢°¢ÀÇ ¹öÆ°À» ÆÐÅ·ÇÏ´Â °ÍÀ» ´ÜÃàÇÑ °ÍÀÌ´Ù. °¢°¢ÀÇ ¹öÆ°Àº ÀÌ ¼öÆò¹Ú½º¿¡ °°Àº ¹æ¹ýÀ¸·Î ÆÐÅ·µÈ´Ù(Áï, gtk_box_pack _startÇÔ¼ö¿¡ °°Àº ÀÎÀÚ¸¦ Áشٴ ¸»).

ÀÌ°ÍÀº gtk_box_pack_startÇÔ¼öÀÇ ¼±¾ðÀÌ´Ù.

void gtk_box_pack_start (GtkBox    *box,
                         GtkWidget *child,
                         gint       expand,
                         gint       fill,
                         gint       padding);

ù¹ø° ÀÎÀÚ´Â object¸¦ ÆÐÅ·ÇÒ ¹Ú½º°í µÎ¹ø°´Â ±× object´Ù. Object´Â ¿©±â¼­ ¸ðµÎ ¹öÆ°ÀÌ µÉ °ÍÀÌ°í, µû¶ó¼­ ¿ì¸®´Â ¹Ú½º¾È¿¡ ¹öÆ°µéÀ» ÆÐÅ·ÇÏ°Ô µÈ´Ù.

gtk_box_pack_start() ¶Ç´Â gtk_box_pack_end()¿¡¼­ÀÇ expand¶ó´Â ÀÎÀÚ°¡ TRUE ÀÏ ¶§, widgetÀº ¿©¹é°ø°£À» °¡µæ ä¿ì¸ç ¹Ú½º¿¡ µé¾î°¡°Ô µÉ °ÍÀÌ´Ù. ±×¸®°í ±×°ÍÀÌ FALSE¶ó¸é widgetÀº ÀûÀýÈ÷ ¿©¹éÀ» µÎ°Ô µÈ´Ù. ÀÌ expand¸¦ FALSE·Î µÎ¸é ¿ì¸®´Â widgetÀÇ Á¿ì Á¤·ÄÀ» °áÁ¤ÇÒ ¼ö ÀÖ´Ù. ±×·¸Áö ¾ÊÀ¸¸é ±×µéÀº ¹Ú½º¿¡ °¡µæÂ÷¼­ gtk_box_pack_start ¶Ç´Â gtk_box_pack_end ¾î´À ÂÊÀ» ÀÌ¿ëÇϵçÁö °°Àº È¿°ú¸¦ °¡Áö°Ô µÈ´Ù.

ÀÎÀÚ fillÀº TRUEÀÏ ¶§ object ÀÚ½ÅÀÇ ¿©¹é°ø°£À» Á¦¾îÇÑ´Ù. ±×¸®°í FALSE¶ó¸é object ÀÚ½ÅÀÇ ¿©¹é°ø°£À» µÎÁö ¾Ê´Â´Ù. ÀÌ°ÍÀº expand ÀÎÀÚ°¡ TRUEÀÏ ¶§¸¸ È¿°ú °¡ ÀÖ´Ù.

»õ·Î¿î ¹Ú½º¸¦ ¸¸µé ¶§´Â ÀÌ·± ÇÔ¼ö°¡ ÀÖ´Ù(¼öÆò¹Ú½º).

GtkWidget * gtk_hbox_new (gint homogeneous,
                          gint spacing);

¿©±â¼­ÀÇ ÀÎÀÚ homogeneous´Â ¹Ú½º ¾ÈÀÇ °¢ objectµéÀÌ °°Àº Å©±â¸¦ °¡Áöµµ·Ï Á¦¾îÇÑ´Ù(Áï ¼öÆò¹Ú½ºÀÏ °æ¿ì¿£ °°Àº ³Êºñ, ¼öÁ÷¹Ú½ºÀÏ °æ¿ì¿£ °°Àº ³ôÀÌ). ÀÌ°ÍÀÌ ¼¼ÆõǸé, gtk_box_packÇÔ¼öÀÇ expand ÀÎÀÚ´Â ¾ðÁ¦³ª TRUE°¡ µÈ´Ù.

¿©±â¼­ spacing(¹Ú½º°¡ ¸¸µé¾îÁö¸ç ¼¼ÆõÊ)¿Í padding(¿ä¼ÒµéÀÌ ÆÐÅ·µÇ¸ç ¼¼ÆõÊ)ÀÇ Â÷ÀÌÁ¡Àº ¹«¾ùÀϱî? SpacingÀº objectµé »çÀÌ¿¡ »ý°Ü³ª´Â °ÍÀ̸ç paddingÀº ÇÑ objectÀÇ °¢ ¹æÇâ¿¡¼­ »ý°Ü³ª´Â °ÍÀÌ´Ù. ÀÌ°ÍÀÌ ±× Á¡À» ¸íÈ®È÷ ÇØÁÙ °ÍÀÌ´Ù.

Box Packing Example Image

¿©±â ÀÌ À̹ÌÁö¸¦ ¸¸µé¾î ÁÖ´Â Äڵ尡 ÀÖ´Ù. ³ª´Â ¿©·¯ ¹ø °­Á¶ÇßÀ¸¹Ç·Î ÀÌ°Í¿¡¼­ º° ¹®Á¦´Â ¾øÀ¸¸®¶ó ¹Ï´Â´Ù. ½º½º·Î ÄÄÆÄÀÏÇؼ­ °¡Áö°í ³î¾Æ º¸µµ·Ï ÇÑ´Ù.

5.3 ÆÐÅ·¿¡ ´ëÇÑ ¿¹Á¦ ÇÁ·Î±×·¥

/* packbox.c */

#include "gtk/gtk.h"

void
delete_event (GtkWidget *widget, GdkEvent *event, gpointer data)
{
  gtk_main_quit ();
}

/* Button_labelµé·Î ÀÌ·ç¾îÁø hbox¸¦ ¸¸µç´Ù.  ¿ì¸®°¡ °ü½ÉÀ» °¡Áø º¯¼öµéÀ»
 * À§ÇÑ ÀÎÀÚµéÀÌ ÀÌ ÇÔ¼ö·Î ³Ñ°ÜÁø´Ù.
 * ¿ì¸®´Â ¹Ú½º¸¦ º¸ÀÌÁö ¾Ê°í, ±× ¾È¿¡ ÀÖ´Â ¸ðµç °ÍÀ» º¸ÀÏ °ÍÀÌ´Ù. */
GtkWidget *make_box (gint homogeneous, gint spacing,
                     gint expand, gint fill, gint padding)
{
  GtkWidget *box;
  GtkWidget *button;
  char padstr[80];
  /* Àû´çÇÑ homogenous¿Í spacingÀ» °¡Áø hbox¸¦ ¸¸µç´Ù. */
  box = gtk_hbox_new (homogeneous, spacing);
  /* ÀûÀýÈ÷ ¼¼ÆÃµÈ ¹öÆ°µéÀ» ¸¸µç´Ù. */
  button = gtk_button_new_with_label ("gtk_box_pack");
  gtk_box_pack_start (GTK_BOX (box), button, expand, fill, padding);
  gtk_widget_show (button);

  button = gtk_button_new_with_label ("(box,");
  gtk_box_pack_start (GTK_BOX (box), button, expand, fill, padding);
  gtk_widget_show (button);

  button = gtk_button_new_with_label ("button,");
  gtk_box_pack_start (GTK_BOX (box), button, expand, fill, padding);
  gtk_widget_show (button);
  /* expandÀÇ °ª¿¡ µû¸£´Â ¶óº§À» °¡Áø ÇÑ ¹öÆ°À» ¸¸µç´Ù. */
  if (expand == TRUE)
    button = gtk_button_new_with_label ("TRUE,");
  else
    button = gtk_button_new_with_label ("FALSE,");

  gtk_box_pack_start (GTK_BOX (box), button, expand, fill, padding);
  gtk_widget_show (button);
  /* À§ÀÇ °æ¿ì¿Í °°Àº ¹öÆ°À» ¸¸µéÁö¸¸, ´õ ´ÜÃàµÈ Ç¥ÇöÀÌ´Ù. */
  button = gtk_button_new_with_label (fill ? "TRUE," : "FALSE,");
  gtk_box_pack_start (GTK_BOX (box), button, expand, fill, padding);
  gtk_widget_show (button);

  sprintf (padstr, "%d);", padding);

  button = gtk_button_new_with_label (padstr);
  gtk_box_pack_start (GTK_BOX (box), button, expand, fill, padding);
  gtk_widget_show (button);

  return box;
}

int
main (int argc, char *argv[])
{
  GtkWidget *window;
  GtkWidget *button;
  GtkWidget *box1;
  GtkWidget *box2;
  GtkWidget *separator;
  GtkWidget *label;
  GtkWidget *quitbox;
  int which;

  /* ¾ðÁ¦³ª ÀÌ·¸°Ô ½ÃÀÛÇÏ´Â °ÍÀ» ÀØÁö ¸» °Í! */
  gtk_init (&argc, &argv);

  if (argc != 2) {
    fprintf (stderr, "usage: packbox num, where num is 1, 2, 3.\n");
    /* GTK¸¦ ³¡³»´Â ºÎºÐÀ̸ç, exit status´Â 1ÀÌ´Ù. */
    gtk_exit (1);
  }

  which = atoi (argv[1]);

    /* ¿ì¸®ÀÇ À©µµ¸¦ ¸¸µç´Ù. */
  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);

  /* Main À©µµ¿¡ destroy ½Ã±×³ÎÀ» ¿¬°á½ÃÄÑ Áà¾ß ÇÑ´Ù.  ÀÌ°ÍÀº Á¦´ë·Î µÈ
   * µ¿ÀÛÀ» À§ÇØ ¸Å¿ì Áß¿äÇÑ °ÍÀÌ´Ù. */
  gtk_signal_connect (GTK_OBJECT (window), "delete_event",
                      GTK_SIGNAL_FUNC (delete_event), NULL);
  gtk_container_border_width (GTK_CONTAINER (window), 10);

  /* ¿ì¸®´Â ¼öÆò¹Ú½ºµéÀ» ÆÐÅ·ÇØ ³ÖÀ» ¼öÁ÷¹Ú½º(vbox)¸¦ ¸¸µç´Ù.
   * ¹öÆ°ÀÌ µé¾îÀÖ´Â ¼öÆò¹Ú½º´Â ÀÌ ¼öÁ÷¹Ú½º ¾ÈÀ¸·Î ¼ø¼­´ë·Î ½×ÀδÙ.
   * (½ºÅà ±¸Á¶¸¦ »ý°¢ÇÏ¸é µÉ °ÍÀÌ´Ù.) */
  box1 = gtk_vbox_new (FALSE, 0);

  switch (which) {
  case 1:
        /* »õ·Î¿î ¶óº§À» ¸¸µç´Ù. */
        label = gtk_label_new ("gtk_hbox_new (FALSE, 0);");

        /* ¶óº§µéÀ» ¿ÞÂÊÀ¸·Î Á¤·Ä½ÃŲ´Ù.  ÀÌ°Í¿¡ ´ëÇؼ­ widgetÀÇ ¼Ó¼º
         * ¼¼ÆÃÇϱ⿡¼­ ´Ù½Ã ´Ù·ê °ÍÀÌ´Ù. */
        gtk_misc_set_alignment (GTK_MISC (label), 0, 0);

        /* ¶óº§À» ¼öÁ÷¹Ú½º(vbox box1)¿¡ ÆÐÅ·ÇÑ´Ù.  ÇÑ vbox¿¡ ÆÐÅ·µÇ´Â
         * widgetµéÀº ¼ø¼­´ë·Î ´Ù¸¥ °ÍµéÀÇ À§ÂÊÀ¸·Î ÆÐÅ·µÈ´Ù. */
        gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 0);

        /* ¶óº§À» º¸¿©ÁØ´Ù. */
        gtk_widget_show (label);

        /* make_box ÇÔ¼ö¸¦ ÀûÀýÇÑ ÀÎÀڷνá È£ÃâÇÑ´Ù. */
        box2 = make_box (FALSE, 0, FALSE, FALSE, 0);
        gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0);
        gtk_widget_show (box2);

        box2 = make_box (FALSE, 0, TRUE, FALSE, 0);
        gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0);
        gtk_widget_show (box2);

        box2 = make_box (FALSE, 0, TRUE, TRUE, 0);
        gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0);
        gtk_widget_show (box2);
        /* ÇϳªÀÇ separator¸¦ ¸¸µç´Ù.  À̵鿡 ´ëÇؼ­ µÚ¿¡¼­ ÀÚ¼¼È÷
         * ´Ù·ê °ÍÀ̸ç, ²Ï³ª °£´ÜÇÑ °ÍÀÌ´Ù. */
        separator = gtk_hseparator_new ();

        /* separator¸¦ vbox ¾ÈÀ¸·Î ÆÐÅ·ÇÑ´Ù.  ÀÌµé °¢°¢ÀÇ widgetÀº
         * vbox ¾ÈÀ¸·Î ÆÐÅ·µÇ¹Ç·Î, ¼öÁ÷ ¹æÇâÀ¸·Î ½×ÀÏ °ÍÀÌ´Ù. */
        gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5);
        gtk_widget_show (separator);

        /* ¶Ç´Ù¸¥ ¶óº§À» ¸¸µé¾î ±×°ÍÀ» º¸¿©ÁØ´Ù. */
        label = gtk_label_new ("gtk_hbox_new (TRUE, 0);");
        gtk_misc_set_alignment (GTK_MISC (label), 0, 0);
        gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 0);
        gtk_widget_show (label);

        /* °¢ ÀÎÀÚ´Â homogeneous, spacing, expand, fill, paddingÀÌ´Ù. */
        box2 = make_box (TRUE, 0, TRUE, FALSE, 0);
        gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0);
        gtk_widget_show (box2);

        box2 = make_box (TRUE, 0, TRUE, TRUE, 0);
        gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0);
        gtk_widget_show (box2);

        /* ¶Ç´Ù¸¥ separator */
        separator = gtk_hseparator_new ();
        /* gtk_box_pack_start ÀÇ ¸¶Áö¸· 3°¡Áö ÀÎÀÚµéÀº
         * expand, fill, padding ÀÌ´Ù. */
        gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5);
        gtk_widget_show (separator);

        break;

    case 2:

        /* ¶óº§À» »õ·Î ¸¸µç´Ù. box1Àº main()ÀÇ ½ÃÀۺκп¡¼­ ¸¸µé¾îÁø
         * ´ë·Î vboxÀÌ´Ù. */
        label = gtk_label_new ("gtk_hbox_new (FALSE, 10);");
        gtk_misc_set_alignment (GTK_MISC (label), 0, 0);
        gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 0);
        gtk_widget_show (label);

        box2 = make_box (FALSE, 10, TRUE, FALSE, 0);
        gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0);
        gtk_widget_show (box2);

        box2 = make_box (FALSE, 10, TRUE, TRUE, 0);
        gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0);
        gtk_widget_show (box2);

        separator = gtk_hseparator_new ();
        gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5);
        gtk_widget_show (separator);

        label = gtk_label_new ("gtk_hbox_new (FALSE, 0);");
        gtk_misc_set_alignment (GTK_MISC (label), 0, 0);
        gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 0);
        gtk_widget_show (label);

        box2 = make_box (FALSE, 0, TRUE, FALSE, 10);
        gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0);
        gtk_widget_show (box2);

        box2 = make_box (FALSE, 0, TRUE, TRUE, 10);
        gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0);
        gtk_widget_show (box2);

        separator = gtk_hseparator_new ();
        gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5);
        gtk_widget_show (separator);
        break;

    case 3:
        /* ÀÌ°ÍÀº gtk_box_pack_end()¸¦ ÀÌ¿ëÇÏ¿© widgetÀ» ¿À¸¥ÂÊ Á¤·ÄÇÏ´Â
         * °É º¸¿©ÁØ´Ù.  ¸ÕÀú, ¾Õ¿¡¼­Ã³·³ »õ·Î¿î ¹Ú½º¸¦ Çϳª ¸¸µç´Ù. */
        box2 = make_box (FALSE, 0, FALSE, FALSE, 0);
        /* ¶óº§À» Çϳª ¸¸µç´Ù. */
        label = gtk_label_new ("end");
        /* ±×°ÍÀ» gtk_box_pack_end()·Î½á ÆÐÅ·ÇϹǷÎ, make_box()·Î ¸¸µé¾îÁø
         * hboxÀÇ ¿À¸¥ÂÊÀ¸·Î ³õ¿©Áö°Ô µÈ´Ù.
        gtk_box_pack_end (GTK_BOX (box2), label, FALSE, FALSE, 0);
        /* ¶óº§À» º¸ÀδÙ. */
        gtk_widget_show (label);

        /* box2¸¦ box1 ¾ÈÀ¸·Î ÆÐÅ·ÇÑ´Ù. */
        gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0);
        gtk_widget_show (box2);

        /* bottom ÂÊÀ» À§ÇÑ separator. */
        separator = gtk_hseparator_new ();
        /* ÀÌ°ÍÀº 400Çȼ¿ÀÇ ³Êºñ¿¡ 5Çȼ¿ÀÇ ³ôÀÌ(µÎ²²)·Î separator¸¦
         * ¼¼ÆÃÇÑ´Ù. ÀÌ°ÍÀº ¿ì¸®°¡ ¸¸µç hbox°¡ ¶ÇÇÑ 400Çȼ¿ÀÇ ³ÊºñÀ̱â
         * ¶§¹®ÀÌ°í, "end" ¶óº§Àº hboxÀÇ ´Ù¸¥ ¶óº§µé°ú ±¸ºÐµÉ(separated)
         * °ÍÀÌ´Ù.  ±×·¸Áö ¾ÊÀ¸¸é, hbox ³»ºÎÀÇ ¸ðµç widgetµéÀº °¡´ÉÇѸ¸Å­
         * ¼­·Î »ª»ªÈ÷ ºÙ¾î¼­ ÆÐÅ·µÉ °ÍÀÌ´Ù. */
        gtk_widget_set_usize (separator, 400, 5);
        /* main()ÇÔ¼öÀÇ ½ÃÀۺκп¡¼­ ¸¸µé¾îÁø vbox(box1)À¸·Î separator¸¦ 
         * ÆÐÅ·ÇÑ´Ù. */
        gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5);
        gtk_widget_show (separator);
    }

    /* ¶Ç´Ù¸¥ hbox¸¦ ¸¸µç´Ù.. ¿ì¸®°¡ ¿øÇÏ´Â ¸¸Å­ ¾ó¸¶µçÁö ¸¸µé¼ö ÀÖ´Ù! */
    quitbox = gtk_hbox_new (FALSE, 0);

    /* ¿ì¸®ÀÇ quit ¹öÆ°ÀÌ´Ù. */
    button = gtk_button_new_with_label ("Quit");

    /* À©µµ¸¦ Æı«Çϱ⠽ñ׳ÎÀ» ¼¼ÆÃÇÑ´Ù.  ÀÌ°ÍÀº À§¿¡¼­ Á¤ÀÇµÈ ¿ì¸®ÀÇ 
     * ½Ã±×³Î Çڵ鷯¿¡ ÀÇÇØ Æ÷ÂøµÉ, "destroy"½Ã±×³ÎÀ» À©µµ·Î º¸³»ÁØ´Ù. */
    gtk_signal_connect_object (GTK_OBJECT (button), "clicked",
                               GTK_SIGNAL_FUNC (gtk_widget_destroy),
                               GTK_OBJECT (window));
    /* quitbox·Î ¹öÆ°À» ÆÐÅ·ÇÑ´Ù.  gtk_box_pack_startÀÇ ¸¶Áö¸· ¼¼ ÀÎÀÚ´Â
     * expand, fill, paddingÀÌ´Ù. */
    gtk_box_pack_start (GTK_BOX (quitbox), button, TRUE, FALSE, 0);
    /* vbox(box1) ¾ÈÀ¸·Î quitbox¸¦ ÆÐÅ·ÇÑ´Ù. */
    gtk_box_pack_start (GTK_BOX (box1), quitbox, FALSE, FALSE, 0);

    /* ¿ì¸®ÀÇ ¸ðµç widgetÀ» Æ÷ÇÔÇÏ°Ô µÈ ÀÌ vbox¸¦, mainÀ©µµ·Î ÆÐÅ·. */
    gtk_container_add (GTK_CONTAINER (window), box1);

    /* ±×¸®°í ³²¾ÆÀÖ´Â ¸ðµç °ÍÀ» º¸¿©ÁØ´Ù. */
    gtk_widget_show (button);
    gtk_widget_show (quitbox);

    gtk_widget_show (box1);
    /* ¸¶Áö¸·¿¡ À©µµ¸¦ º¸¿©Á༭ ¸ðµç °ÍÀÌ Çѹø¿¡ Æ¢¾î³ª¿À¸ç º¸ÀδÙ. */
    gtk_widget_show (window);

    /* ´ç¿¬È÷ ¿ì¸®ÀÇ gtk_mainÀÌ´Ù. */
    gtk_main ();

    /* gtk_main_quit()À» È£ÃâÇß´Ù¸é Á¦¾î´Â ÀÌ°÷À¸·Î ¿Â´Ù.  gtk_exit()¸¦
     * È£ÃâÇÏ¸é ±×·¸Áö ¾Ê´Ù. */

    return 0;
}

5.4 Å×À̺íÀ» ÀÌ¿ëÇÑ ÆÐÅ·

¶Ç´Ù¸¥ ÆÐÅ· - Å×À̺íÀ» ÀÌ¿ëÇÑ °ÍÀ» º¸ÀÚ. ÀÌ°ÍÀº ¾î¶² »óȲ¿¡¼­ ¾ÆÁÖ À¯¿ëÇÒ °ÍÀÌ´Ù.

Å×À̺íÀ» ÀÌ¿ëÇؼ­, ¿ì¸®´Â widgetÀ» ³Ö¾îµÑ °ÝÀÚÆÇÀ» ¸¸µé°Ô µÈ´Ù. ±× widget µéÀº ¿ì¸®°¡ ¼³Á¤Çϴ´ë·Î ¾ó¸¶µçÁö °ø°£À» °¡Áö°Ô µÉ °ÍÀÌ´Ù.

¹°·Ð ¸ÕÀú ºÁ¾ß ÇÒ °ÍÀº gtk_table_new ÇÔ¼ö´Ù.

GtkWidget* gtk_table_new (gint rows,
                          gint columns,
                          gint homogeneous);

ù¹ø° ÀÎÀÚ´Â Å×ÀÌºí¿¡ ¸¸µé ÇàÀÇ °¹¼ö°í, µÎ¹ø°´Â ´ç¿¬È÷ ¿­ÀÇ °¹¼ö´Ù.

ÀÎÀÚ homogeneous´Â Å×À̺íÀÇ ¹Ú½ºµéÀÇ Å©±â°¡ ¾î¶»°Ô µÇ¾î¾ß ÇÏ´ÂÁö¸¦ °áÁ¤ ÇÑ´Ù. ÀÌ°ÍÀÌ TRUE¶ó¸é Å×À̺íÀÇ ¹Ú½ºµéÀº ±× Å×ÀÌºí¿¡¼­ °¡Àå Å« widgetÀÇ Å©±â¿¡ µû¸£°Ô µÈ´Ù. ¶Ç FALSE¶ó¸é °¢ ¹Ú½ºµéÀº °°Àº Çà¿¡¼­ °¡Àå ³ôÀº widgetÀÇ ³ôÀ̸¦, ±×¸®°í °°Àº ¿­¿¡¼­´Â °¡Àå ³ÐÀº widgetÀÇ ³Êºñ¸¦ µû¸£°Ô µÈ´Ù.

°¢ Çà°ú ¿­Àº 0¿¡¼­ n±îÁö Â÷ÁöÇÏ°Ô µÈ´Ù. ¿©±â¼­ nÀº gtk_table_new¸¦ È£ÃâÇÒ ¶§ °áÁ¤µÈ ¼ýÀÚ´Ù. ±×·¡¼­, ¸¸¾à ¿ì¸®°¡ Çà=2 ±×¸®°í ¿­=2, ÀÌ·¸°Ô ¼³Á¤ÇÏ°Ô µÇ¸é ±¸Á¶´Â ÀÌ·¸°Ô µÈ´Ù.

 0          1          2
0+----------+----------+
 |          |          |
1+----------+----------+
 |          |          |
2+----------+----------+

ÁÂÇ¥°è´Â ¿ÞÂÊ À§¿¡¼­ Ãâ¹ßÇÏ´Â °ÍÀ» ÁÖÀÇÇÏÀÚ. ¹Ú½º¾È¿¡ widgetÀ» ³õÀ¸·Á¸é ´ÙÀ½ ÇÔ¼ö¸¦ ÀÌ¿ëÇÑ´Ù.

void gtk_table_attach (GtkTable      *table,
                       GtkWidget     *child,
                       gint           left_attach,
                       gint           right_attach,
                       gint           top_attach,
                       gint           bottom_attach,
                       gint           xoptions,
                       gint           yoptions,
                       gint           xpadding,
                       gint           ypadding);

ù¹ø° ÀÎÀÚ tableÀº ¿ì¸®°¡ ¸¸µç Å×À̺íÀÌ°í µÎ¹ø° child´Â ÀÌ Å×ÀÌºí¿¡ ³õÀ¸·Á°í ÇÏ´Â widgetÀÌ´Ù.

¿ÞÂÊ°ú ¿À¸¥ÂÊÀÇ attach¶ó´Â ÀÎÀÚµéÀº widgetÀ» ³õÀ» À§Ä¡¿Í ÀÌ¿ëÇÒ ¹Ú½ºÀÇ °¹¼ö¸¦ °áÁ¤ÇÑ´Ù. ¸¸¾à ¿ì¸®ÀÇ 2x2 Å×À̺íÀÇ ¿À¸¥ÂÊ ¾Æ·¡ Ä­¿¡ À§Ä¡ÇÑ ¹öÆ°À» ¿øÇÑ´Ù¸é, ±×¸®°í ±× ¿ä¼Ò¸¸ °¡µæä¿ì±â¸¦ ¿øÇÑ´Ù¸é, left_attach=1, right_ attach=2, top_attach=1, bottom_attach=2, ÀÌ·¸°Ô µÇ¾î¾ß ÇÑ´Ù.

ÀÌÁ¦, ¿ì¸®ÀÇ 2x2 Å×À̺íÀÇ Ã¹¹ø° Çà Àüü¸¦ ¼±ÅÃÇß´Ù¸é, left_attach=0, right_attach=2, top_attach=0, bottom_attach=1 À̶ó°í ÇÏ¸é µÈ´Ù.

ÀÎÀÚ xoption°ú yoptionÀº ÆÐÅ· ¿É¼ÇÀ» Á¤Çϱâ À§ÇÑ °ÍÀ¸·Î, ¿©·¯°¡ÁöÀÇ ¿É¼ÇÀ» ÁÖ±â À§Çؼ­ OR ¿¬»êÀÚ¸¦ ¾µ ¼ö ÀÖ´Ù.

ÀÌ ¿É¼ÇµéÀº ´ÙÀ½°ú °°´Ù.

ÆеùÀº ¹Ú½º ¾È¿¡¼­Ã³·³, Çȼ¿ ´ÜÀ§·Î ¶Ñ·ÇÇÑ ¿µ¿ªÀ» widget ÁÖÀ§¿¡ ¸¸µé¾î ÁØ´Ù.

gtk_table_attach()´Â ¼ö¸¹Àº ¿É¼ÇÀ» °¡Áö°í ÀÖ´Ù. ±×·¡¼­ ÀÌ·± shortcutÀÌ ÀÖ´Ù.

void gtk_table_attach_defaults (GtkTable   *table,
                                GtkWidget  *widget,
                                gint        left_attach,
                                gint        right_attach,
                                gint        top_attach,
                                gint        bottom_attach);

X¿Í Y ¿É¼ÇÀº µðÆúÆ®·Î GTK_FILL|GTK_EXPAND, ±×¸®°í X¿Í YÀÇ ÆеùÀº 0ÀÌ´Ù. ³ª¸ÓÁö ÀÎÀÚµéÀº ÀÌÀüÀÇ ÇÔ¼ö¿Í °°´Ù.

¶ÇÇÑ gtk_table_set_row_spacing()°ú gtk_table_set_col_spacing()À̶õ ÇÔ¼öµµ ÀÖ´Ù. ÀÌ°ÍÀº ÁÖ¾îÁø Çà ¶Ç´Â ¿­¿¡ ´ëÇØ spacingÀ» ¼³Á¤ÇÑ´Ù.

void gtk_table_set_row_spacing (GtkTable      *table,
                                gint           row,
                                gint           spacing);
±×¸®°í
void       gtk_table_set_col_spacing  (GtkTable      *table,
                                       gint           column,
                                       gint           spacing);
¾î¶² ¿­¿¡ ´ëÇؼ­ space´Â ¿­ÀÇ ¿À¸¥ÂÊÀ¸·Î, ±×·¡°í Çà¿¡ ´ëÇؼ­´Â ÇàÀÇ ¾Æ·¡ÂÊ À¸·Î ÁÖ¾îÁø´Ù´Â °ÍÀ» ¿°µÎ¿¡ µÎÀÚ.

¸ðµç Çà°ú ¿­¿¡ ´ëÇÑ ÀÏ°üµÈ spacingÀº ´ÙÀ½ µÎ ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù.

void gtk_table_set_row_spacings (GtkTable *table,
                                 gint      spacing);

void gtk_table_set_col_spacings (GtkTable  *table,
                                 gint       spacing);

ÀÌ µÎ ÇÔ¼ö´Â ¸¶Áö¸· Çà°ú ¸¶Áö¸· ¿­¿¡ ´ëÇؼ­´Â spacingÀ» ÇÏÁö ¾Ê´Â´Ù´Â °ÍÀ» ±â¾ïÇ϶ó.

5.5 Å×À̺í ÆÐÅ· ¿¹Á¦

¿©±â¼­ ¿ì¸®´Â 2x2 Å×ÀÌºí ¾È¿¡ ¼¼°³ÀÇ ¹öÆ°ÀÌ ÀÖ´Â À©µµ¸¦ Çϳª ¸¸µç´Ù. óÀ½ µÎ ¹öÆ°Àº À­Çà¿¡ ³õÀÌ°í ¼¼¹ø° quit ¹öÆ°Àº µÎ¿­À» Â÷ÁöÇϸ鼭 ¾Æ·§Çà¿¡ ³õÀδÙ. ±×·¯¹Ç·Î ´ÙÀ½ ±×¸²Ã³·³ º¸ÀÌ°Ô µÈ´Ù.

Table Packing Example Image

¼Ò½º ÄÚµå´Â ÀÌ·¸´Ù.

/* table.c */
#include <gtk/gtk.h>

/* ¿ì¸®ÀÇ callback.
 * ÀÌ ÇÔ¼ö·Î ³Ñ°ÜÁö´Â µ¥ÀÌŸ´Â stdoutÀ¸·Î Ãâ·ÂµÈ´Ù. */
void callback (GtkWidget *widget, gpointer data)
{
    g_print ("Hello again - %s was pressed\n", (char *) data);
}

/* ÀÌ callback ÇÁ·Î±×·¥À» Á¾·áÇÑ´Ù */
void delete_event (GtkWidget *widget, gpointer data)
{
    gtk_main_quit ();
}

int main (int argc, char *argv[])
{
    GtkWidget *window;
    GtkWidget *button;
    GtkWidget *table;

    gtk_init (&argc, &argv);

    /* »õ·Î¿î À©µµ¸¦ ¸¸µç´Ù. */
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);

    /* À©µµÀÇ Á¦¸ñÀ» Á¤ÇÑ´Ù. */
    gtk_window_set_title (GTK_WINDOW (window), "Table");

    /* 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), 20);

    /* 2x2ÀÇ Å×À̺íÀ» ¸¸µç´Ù. */
    table = gtk_table_new (2, 2, TRUE);

    /* Å×À̺íÀ» À©µµ¿¡ ³õ´Â´Ù. */
    gtk_container_add (GTK_CONTAINER (window), table);

    /* ù ¹öÆ°À» ¸¸µç´Ù. */
    button = gtk_button_new_with_label ("button 1");

    /* ¹öÆ°ÀÌ ´­¸®¸é "button 1"À» Àμö·Î Çؼ­ "callback" ÇÔ¼ö¸¦
     * ºÎ¸¥´Ù. */
    gtk_signal_connect (GTK_OBJECT (button), "clicked",
              GTK_SIGNAL_FUNC (callback), (gpointer) "button 1");


    /* ù ¹öÆ°À» Å×ÀÌºí ¿ÞÂÊ Á¦ÀÏ À§¿¡ ³õ´Â´Ù. */
    gtk_table_attach_defaults (GTK_TABLE(table), button, 0, 1, 0, 1);

    gtk_widget_show (button);

    /* µÎ¹ø° ¹öÆ°À» ¸¸µç´Ù. */

    button = gtk_button_new_with_label ("button 2");

    /* ¹öÆ°ÀÌ ´­¸®¸é "button 2"À» Àμö·Î Çؼ­ "callback" ÇÔ¼ö¸¦ 
     * ºÎ¸¥´Ù. */
    gtk_signal_connect (GTK_OBJECT (button), "clicked",
              GTK_SIGNAL_FUNC (callback), (gpointer) "button 2");
    /* µÎ¹ø° ¹öÆ°À» Å×ÀÌºí ¿À¸¥ÂÊ Á¦ÀÏ À§¿¡ ³õ´Â´Ù. */
    gtk_table_attach_defaults (GTK_TABLE(table), button, 1, 2, 0, 1);

    gtk_widget_show (button);

    /* "Quit" ¹öÆ°À» ¸¸µç´Ù. */
    button = gtk_button_new_with_label ("Quit");

    /* ¹öÆ°ÀÌ ´­¸®¸é "delete_event" ÇÔ¼ö¸¦ È£ÃâÇؼ­
     * ÇÁ·Î±×·¥À» ³¡³½´Ù. */
    gtk_signal_connect (GTK_OBJECT (button), "clicked",
                        GTK_SIGNAL_FUNC (delete_event), NULL);

    /* "Quit" ¹öÆ°À» Å×À̺íÀÇ ¾Æ·§ÇàÀÇ  µÎ¿­¿¡ ³õ´Â´Ù. */ 
    gtk_table_attach_defaults (GTK_TABLE(table), button, 0, 2, 1, 2);

    gtk_widget_show (button);

    gtk_widget_show (table);
    gtk_widget_show (window);

    gtk_main ();

    return 0;
}


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