¸®´ª½º ±âŸ ÀÚ·á

HomePage Backward Forward Post Reply List
Delete Modify
  Á¦¸ñ   gtk FAQ #2 1998/07/10 (17:37)
À̸§ ±èÈ¿¿ø
¹øÈ£ 100
Á¶È¸ 358
º»¹®
****************************
*** 4. Development with GTK+
****************************

***
*** 4.1. How do I get started?
***
 GTK+À» ÀνºÅçÇß´Ù¸é, ±×°ÍÀ¸·Î½á ¾îÇÃÀ» ½±°Ô °³¹ßÇÒ ¼ö ÀÖµµ·Ï ÇØÁÖ´Â °ÍÀÌ
µÎ°¡Áö ÀÖ´Ù.  ¸ÕÀú Áö±Ýµµ Á¦ÀÛ ÁßÀÎ GTK+ TutorialÀÌ <http://www.gtk.org/
tutorial/>¿¡ ÀÖ´Ù.  ÀÌ°ÍÀº C¾ð¾î·Î ¾îÇÃÀ» °³¹ßÇÏ´Â °ÍÀ» ¼Ò°³ÇØ ÁÙ °ÍÀÌ´Ù.
 ÀÌ TutorialÀº (¾ÆÁ÷) GTK+ÀÌ Á¦°øÇÏ´Â ¸ðµç widgetµé¿¡ ´ëÇÑ Á¤º¸¸¦ ´Ù·ç°í
ÀÖÁö ¾Ê´Ù.  ¸ðµç GTK+ widgetÀ» ÀÌ¿ëÇÏ´Â ±âÃÊÀûÀÎ ¿¹Á¦ ÄÚµå´Â ¹èÆ÷ÆÇ¿¡
µé¾îÀÖ´Â gtk/testgtk.c(±×¸®°í °ü·ÃµÈ ¼Ò½º ÆÄÀϵé)´Ù.  ÀÌ ¿¹Á¦µéÀ» »ìÆ캸´Â
°ÍÀº ¾î¶² widgetÀÌ ¾î¶² ÀÏÀ» ÇÒ ¼ö ÀÖ´ÂÁö¿¡ ´ëÇÑ ÁÁÀº Åä´ë°¡ µÉ °ÍÀÌ´Ù.

***
*** 4-2. What widgets are in GTK?
***
 GTK+ Tutorial¿¡ ÀÌ·¸°Ô widgetµéÀÇ ¸®½ºÆ®°¡ ¼Ò°³µÇ¾ú´Ù.

 GtkObject
  +GtkData
  | +GtkAdjustment
  | `GtkTooltips
  `GtkWidget
    +GtkContainer
    | +GtkBin
    | | +GtkAlignment
    | | +GtkEventBox
    | | +GtkFrame
    | | | `GtkAspectFrame
    | | +GtkHandleBox
    | | +GtkItem
    | | | +GtkListItem
    | | | +GtkMenuItem
    | | | | `GtkCheckMenuItem
    | | | |   `GtkRadioMenuItem
    | | | `GtkTreeItem
    | | +GtkViewport
    | | `GtkWindow
    | |   +GtkColorSelectionDialog
    | |   +GtkDialog
    | |   | `GtkInputDialog
    | |   `GtkFileSelection
    | +GtkBox
    | | +GtkButtonBox
    | | | +GtkHButtonBox
    | | | `GtkVButtonBox
    | | +GtkHBox
    | | | +GtkCombo
    | | | `GtkStatusbar
    | | `GtkVBox
    | |   +GtkColorSelection
    | |   `GtkGammaCurve
    | +GtkButton
    | | +GtkOptionMenu
    | | `GtkToggleButton
    | |   `GtkCheckButton
    | |     `GtkRadioButton
    | +GtkCList
    | +GtkFixed
    | +GtkList
    | +GtkMenuShell
    | | +GtkMenuBar
    | | `GtkMenu
    | +GtkNotebook
    | +GtkPaned
    | | +GtkHPaned
    | | `GtkVPaned
    | +GtkScrolledWindow
    | +GtkTable
    | +GtkToolbar
    | `GtkTree
    +GtkDrawingArea
    | `GtkCurve
    +GtkEditable
    | +GtkEntry
    | | `GtkSpinButton
    | `GtkText
    +GtkMisc
    | +GtkArrow
    | +GtkImage
    | +GtkLabel
    | | `GtkTipsQuery
    | `GtkPixmap
    +GtkPreview
    +GtkProgressBar
    +GtkRange
    | +GtkScale
    | | +GtkHScale
    | | `GtkVScale
    | `GtkScrollbar
    |   +GtkHScrollbar
    |   `GtkVScrollbar
    +GtkRuler
    | +GtkHRuler
    | `GtkVRuler
    `GtkSeparator
      +GtkHSeparator
      `GtkVSeparator

***
*** 4-3. How can I prevent redrawing and resizing while I change multiple
***     widgets?
 ¸¹Àº widgetÀ» ´Ù·ç´Â Äڵ忡 gtk_container_disable_resize¿Í gtk_container
_enable_resize¸¦ ÀÌ¿ëÇ϶ó.  ÀÌ°ÍÀº widget °èÃþ±¸Á¶ ÀüüÀûÀ¸·Î resizeµÇ´Â
°ÍÀ» ¸·¾Æ ÁֹǷΠÈξÀ ºü¸¥ °á°ú¸¦ º¸¿©ÁÙ °ÍÀÌ´Ù.

***
*** 4-4. How do I catch a double click event in a list widget?
***
 Tim JanikÀÌ gtk-list¿¡ ¾´ °ÍÀ» Á¶±Ý ¼öÁ¤Çß´Ù.

 ¸ÕÀú ½Ã±×³Î Çڵ鷯¸¦ Á¤ÀÇÇÑ´Ù.

gint
signal_handler_event(GtkWiget *widget, GdkEvenButton *event,
                     gpointer func_data){
      if (GTK_IS_LIST_ITEM(widget) &&
           (event->type==GDK_2BUTTON_PRESS ||
            event->type==GDK_3BUTTON_PRESS) ) {
        printf("I feel %s clicked on button %d\",
               event->type==GDK_2BUTTON_PRESS ? "double" : "triple",
               event->button);
      }

      return FALSE;
}

 ±×¸®°í ¿©·¯ºÐÀÇ object¿¡ ±× Çڵ鷯¸¦ ¿¬°á½ÃŲ´Ù.

    {
      /* list, list item init stuff */

      gtk_signal_connect(GTK_OBJECT(list_item),
                         "button_press_event",
                         GTK_SIGNAL_FUNC(signal_handler_event),
                         NULL);

      /* and/or */

      gtk_signal_connect(GTK_OBJECT(list_item),
                         "button_release_event",
                         GTK_SIGNAL_FUNC(signal_handler_event),
                         NULL);

      /* something else */
    }

***
*** 4-5. How do I find out about the selection of a GtkList?
***
 ÀÌ·± ½ÄÀ¸·Î ÇÑ´Ù.

       GList *sel;
       sel=GTK_LIST(list)->selection;

 ±×¸®°í ÀÌ°ÍÀº GList°¡ Á¤ÀÇµÈ glist.h¿¡¼­ ÂüÁ¶Çß´Ù.

       typedef struct _GList GList;
       struct _GList
       {
               gpointer data;
               GList *next;
               GList *prev;
       };

 GList ±¸Á¶Ã¼´Â °£´ÜÈ÷ ÀÌÁß ¿¬°á¸®½ºÆ®´Ù.  glib.h¿¡´Â ÀÌ ¿¬°á¸®½ºÆ®¸¦
º¯Çü½Ãų ¸î °³ÀÇ g_list_*() ÇÔ¼öµéÀÌ ÀÖ´Ù.  ±×·¯³ª GTK_LIST(MyGtkList)->
selectionÀº ±×·± g_list_*() ÇÔ¼öµé¿¡ ÀÇÇØ À¯ÁöµÇ¸ç, º¯ÇüµÇ¾î¼± ¾ÈµÉ °ÍÀÌ´Ù.

 GtkList¿¡¼­ÀÇ selection_mode´Â GtkListÀÇ selectionÀ» Æí¸®ÇÏ°Ô °áÁ¤ÇÒ ¼ö
ÀÖÀ¸¸ç, µû¶ó¼­ GTK_LIST(AnyGtkList)->selectionÀÇ Ç׸ñµéÀ» ¿©±â º¸ÀδÙ.

--------------------------------------------------------------------------
 selection_mode          GTK_LIST()->selection contents
--------------------------------------------------------------------------
GTK_SELECTION_SINGLE)   SelectionÀº NULL À̰ųª ¶Ç´Â ÇϳªÀÇ ¼±ÅÃµÈ Ç׸ñ¿¡
                       ´ëÇÑ GList* Çü Æ÷ÀÎÅ͸¦ Æ÷ÇÔÇÏ°Ô µÈ´Ù.

GTK_SELECTION_BROWSE)   list°¡ ¾Æ¹«·± widgetµµ Æ÷ÇÔÇÏÁö ¾Ê´Â´Ù¸é selectionÀº
                       NULL, ±×·¸Áö ¾ÊÀ¸¸é ÇϳªÀÇ GListÇü ±¸Á¶Ã¼¿¡ ´ëÇÑ
                       Æ÷ÀÎÅÍ Áï GList* Çü Æ÷ÀÎÅ͸¦ Æ÷ÇÔÇÏ°Ô µÈ´Ù.

GTK_SELECTION_MULTIPLE) ¾Æ¹« Ç׸ñµµ ¼±ÅõÇÁö ¾Ê¾Ò´Ù¸é selectionÀº NULLÀÌ°í,
                       Ã¹¹ø° ¼±ÅÃµÈ Ç׸ñ¿¡ ´ëÇؼ­´Â GList* Çü Æ÷ÀÎÅÍ°¡
                       µÈ´Ù. ±×°ÍÀº µÎ¹ø°¿Í ±× ÀÌÈÄÀÇ ¼±ÅÃµÈ Ç׸ñÀ» À§ÇÑ
                       GList ±¸Á¶Ã¼µé¿¡ ´ëÇØ ÀüȯÁ¡ÀÌ µÈ´Ù.

GTK_SELECTION_EXTENDED) SelectionÀº NULLÀÌ´Ù.
--------------------------------------------------------------------------

 GListÇü ±¸Á¶Ã¼ÀÇ µ¥ÀÌÅÍ¿µ¿ªÀÎ GTK_LIST(MyGtkList)->selectionÀº ù¹ø°·Î
¼±ÅÃµÈ GtkListItemÀ» °¡¸®Å°°í ÀÖ´Ù.  ±×·¡¼­ ¸¸¾à ¾î¶² Ç׸ñµéÀ» ¼±ÅÃÇÒÁö
°áÁ¤ÇÏ·Á¸é ÀÌ·± ½ÄÀ¸·Î ÇÏ¸é µÉ °ÍÀÌ´Ù.

Upon Initialization:
{
       gchar *list_items[]={
       "Item0",
       "Item1",
       "foo",
       "last Item",
       };
       guint nlist_items=sizeof(list_items)/sizeof(list_items[0]);
       GtkWidget *list_item;
       guint i;
       list=gtk_list_new();
       gtk_list_set_selection_mode(GTK_LIST(list), GTK_SELECTION_MULTIPLE);
       gtk_container_add(GTK_CONTAINER(AnyGtkContainer), list);
       gtk_widget_show (list);
       for (i = 0; i < nlist_items; i++)
       {
       list_item=gtk_list_item_new_with_label(list_items[i]);
       gtk_object_set_user_data(GTK_OBJECT(list_item), (gpointer)i);
       gtk_container_add(GTK_CONTAINER(list), list_item);
       gtk_widget_show(list_item);
       }
}

 ¼±ÅÃµÈ Ç׸ñµé¿¡ ´ëÇØ ¾Ë·Á¸é ÀÌ·¸°Ô ÇÑ´Ù.

{
   GList *items;
   items=GTK_LIST(list)->selection;
   printf("Selected Items: ");
   while (items) {
       if (GTK_IS_LIST_ITEM(items->data))
               printf("%d ", (guint)gtk_object_get_user_data(items->data));
       items=items->next;
   }
   printf("\n");
}

***
*** 4-6. Is it possible to get some text displayed which is truncated to fit
***     inside its allocation?
 (Ŭ¸®ÇÎ ¾ÈµÈ) GTKÀÇ µ¿ÀÛÀº X ¸®¼Ò½º¸¦ º¸Á¸ÇÏ·Á´Â ³ë·ÂÀÇ °á°ú´Ù.  ¿¹·Î
¶óº§(label)À» À§ÇÑ widgetµéÀº ±×µé¸¸ÀÇ X À©µµ¸¦ Â÷ÁöÇÏÁö ¾Ê´Â´Ù - ±×µéÀº
´ÜÁö ±×µéÀÇ ºÎ¸ð À©µµ À§¿¡¼­ ÀÚ½ÅÀÇ ³»¿ëÀ» ±×¸± »ÓÀÌ´Ù.  ¹Ý¸é ÅؽºÆ®¸¦ ±×¸®±â
Àü¿¡ Ŭ¸³ ¸¶½ºÅ©¸¦ ¼³Á¤, ±×°ÍÀÌ Å¬¸®Çεǵµ·Ï ÇÒ ¼öµµ Àִµ¥ ±×·² °æ¿ì ¾Æ¸¶
»ó´çÇÑ ÆÛÆ÷¸Õ½ºÀÇ ¼Õ½ÇÀ» ºÎ¸¦ °ÍÀÌ´Ù.

 ´Ù½Ã ¸»ÇØ ÀÌ·± ¹®Á¦¿¡ ´ëÇÑ ÃÖ¼±ÀÇ ÇعýÀº ±× ÅؽºÆ® labelÀ» Á¦°øÇϵµ·Ï
gtk¸¦ ¼öÁ¤ÇÏ´Â °ÍÀÌ´Ù.  ´ëÃæ ±¸»óÇØ º»´Ù¸é °íÀ¯ÀÇ À©µµ¸¦ °¡Áö°í ÀÖ´Â ´Ù¸¥
widgetÀÇ ³»ºÎ¿¡ ÀÌ label widgetÀ» Æ÷ÇÔ½ÃÅ°´Â °ÍÀÌ´Ù - ÇÑ °¡Áö ¿¹·Î viewport
widgetÀÌ °¡´ÉÇÒ °ÍÀÌ´Ù.

       viewport = gtk_viewport (NULL, NULL);
       gtk_widget_set_usize (viewport, 50, 25);
       gtk_viewport_set_shadow_type (GTK_VIEWPORT(viewport),
                                     GTK_SHADOW_NONE);
       gtk_widget_show(viewport);
       label = gtk_label ("a really long label that won't fit");
       gtk_container_add (GTK_CONTAINER(viewport), label);
       gtk_widget_show (label);

 ¸¸¾à ÀÌ ÀÛ¾÷À» widgetÀÇ ÇÑ ¹«¸®¿¡ ´ëÇØ ÇØ¿À°í ÀÖ¾ú´Ù¸é, ¿ì¸° gtkviewport.c
¸¦ º¹»çÇؼ­ Á¶Àý¹æ½ÄÀ» ¹àÇô³»°í ÀÛ¿ëÀ» °¨Ãâ ¼ö ÀÖÀ» °ÍÀÌ´Ù. (¾Æ¸¶ ÀÌ°ÍÀ»
GtkClipper¶ó°í ºÎ¸£¸é µÉ °ÍÀÌ´Ù.)

***
*** 4-7. Why don't the contents of a button move when the button is pressed?
***
 ¹öÆ°À» ±×·± ½ÄÀ¸·Î µ¿ÀÛ½ÃÅ°´Â ¹®Á¦¿¡ ´ëÇÑ ÀӽùæħÀÌ ÀÖ´Ù.

 Peter Mattis·ÎºÎÅÍ:

 ¹öÆ°ÀÌ ´­·¯Á³À» ¶§ ±×µéÀÇ childµéÀÌ ¿À¸¥ÂÊ ¾Æ·¡·Î Á¶±Ý ¹Ð·Á³ªÁö ¾Ê´Â
 ÀÌÀ¯´Â, ±×°ÍÀÌ º¸ÀÌ´Â ±×´ë·Î°¡ ¾Æ´Ï¶ó°í »ý°¢Çϱ⠶§¹®ÀÌ´Ù.  ¹öÆ°¿¡ ´ëÇÑ
 ³» °üÁ¡Àº, ¿©·¯ºÐÀÌ ±×µéÀ» Á÷¼±À¸·Î ¹Ù¶óº»´Ù´Â Á¡ÀÌ´Ù.  Áï, »ç¿ëÀÚÀÇ
 ÀÎÅÍÆäÀ̽º´Â ¾î¶² Æò¸éÀÌ¸ç ¿ì¸®´Â ±×°Í¿¡ ¼öÁ÷ÇÑ ¹æÇâÀ¸·Î ¶È¹Ù·Î ÃÄ´Ùº¸´Â
 °ÍÀÌ´Ù.  ¹öÆ°ÀÌ ´­·¯Áö¸é ±×°ÍÀº ¿ì¸®¿¡°Ô¼­ ¶È¹Ù·Î ¸Ö¾îÁ® °£´Ù.  Á¤¸»
 Á¤È®È÷ Çϱâ À§Çؼ­¶ó¸é childµéÀº ½ÇÁ¦·Î Á¶±Ý ¹Ð·Áµé¾î°¡¾ß ÇÒ °ÍÀÌ´Ù.
 ±×·±µ¥ child°¡ ¿Ö ¿ÞÂÊ/¿À¸¥ÂÊ ¾Æ·¡·Î ¹Ð·Á°¡¾ß µÈ´Ù°í ÇÏ´ÂÁö ¸ð¸£°Ú´Ù.
 Child´Â ¹öÆ°ÀÇ Ç¥¸é¿¡ ºÎÂøµÇ¾î ÀÖ´Â °ÍÀÓÀ» ±â¾ïÇ϶ó.  ÀÌ child°¡ ¸¶Ä¡
 ¹öÆ°ÀÇ Ç¥¸é¿¡¼­ ¹Ì²ô·¯Á® ´Ù´Ï´Â °Íó·³ º¸ÀÌ´Â °ÍÀº ÁÁÁö ¾Ê´Ù.

 ´õ ½ÇÁ¦ÀûÀÎ Âü°í·Î, ³ªµµ ÇѶ§ ¹öÆ°ÀÌ ±×·¸°Ô µ¿ÀÛÇϵµ·Ï Ãß°¡¸¦ ÇغÃÁö¸¸
 ±×´ÙÁö ÁÁÁö ¾Ê¾Æ º¸¿´±â¿¡ Á¦°ÅÇØ ¹ö·È´Ù.

***
*** 4-8. How can I define a separation line in a menu?
***
 ¸Þ´º¸¦ ¾î¶»°Ô ¸¸µå´ÂÁö¿¡ ´ëÇؼ­´Â TutorialÀ» ÂüÁ¶Ç϶ó.  ¸Þ´º »çÀÌÀÇ
±¸ºÐ¼±À» ¸¸µé·Á¸é, ´Ü¼øÈ÷ ºó ¸Þ´º ¾ÆÀÌÅÛÀ» »ðÀÔÇÏ¸é µÈ´Ù.

    menuitem = gtk_menu_item_new();
    gtk_menu_append(GTK_MENU(menu), menuitem);
    gtk_widget_show(menuitem);

***
*** 4-9. How can I right justify a menu, such as Help, when using the
***     MenuFactory?
 ÀÌ·± ½ÄÀ¸·Î ÇÏ¸é µÈ´Ù.

    menu_path = gtk_menu_factory_find (factory,  "<MyApp>/Help");
    gtk_menu_item_right_justify(menu_path->widget);

***
*** 4-10. How do I make my window modal? / How do I make a single window
***      active?
 ¿©·¯ºÐÀÇ À©µµ¸¦ ¸¸µç ÈÄ¿¡, gtk_grab_add(my_window)¸¦ ¾´´Ù.  ±×¸®°í À©µµ¸¦
´Ý¾ÒÀ» ¶§´Â gtk_grab_remove(my_window)¶ó°í ÇÑ´Ù.

***
*** 4-11. Why doesn't my progressbar update?
***
 ¾Æ¸¶ gtk_mainÀ¸·Î ÄÁÆ®·ÑÀ» ¸®ÅÏÇÏÁö ¾Ê°í ÁøÇื´ëÀÇ ¸ðµç º¯È­¸¦ ¾î¶² ÇÔ¼ö
³»ºÎ¿¡¼­ ´Ù ó¸®ÇÏ·Á°í Ç߱⠶§¹®ÀÌ´Ù.  ±×¸®±âÀÇ ´ëºÎºÐ ¾÷µ¥ÀÌÆ®´Â ¿ÀÁ÷
gtk_main ³»ºÎ¿¡¼­ ÁøÇàµÇ´Â queue¿¡ ³õ¿©Áø´Ù.  ¿©·¯ºÐÀº ÀÌ·± ÄÚµå·Î½á ±×
±×¸®±â Å¥(queue)¸¦ °­Á¦·Î ÁøÇà½Ãų ¼ö ÀÖÀ» °ÍÀÌ´Ù.

    while (gtk_events_pending())
            gtk_main_iteration();

 ÀÌ Äڵ带 ¿©·¯ºÐÀÇ ÇÔ¼ö¿¡ Æ÷ÇÔ½ÃÄÑ ÁøÇื´ë¸¦ ¾÷µ¥ÀÌÆ®ÇÒ ¼ö ÀÖ´Ù.

 À§ÀÇ °£´ÜÇÑ Äڵ尡 ÇÏ´Â ÀÏÀº ¸ðµç ¹Ì°áÁ¤ÀÇ À̺¥Æ®¿Í ¿ì¼±±ÇÀÌ ³ôÀº idle
ÇÔ¼öµéÀ» µ¿ÀÛ½ÃÄѼ­ Áï½Ã ¸®ÅÏÇÏ´Â °ÍÀÌ´Ù. (±×¸®±â´Â ¿ì¼±±ÇÀÌ ³ôÀº idleÇÔ¼ö
¿¡¼­ ÀÌ·ç¾îÁø´Ù.)


****************
*** 5. About gdk
****************

***
*** 5-1. What is gdk?
***
 GDK¶õ ±âº»ÀûÀ¸·Î Ç¥ÁØ Xlib ÇÔ¼öµé¿¡ ´ëÇÑ wrapper´Ù.  ¸¸¾à ¿©·¯ºÐÀÌ Xlib¸¦
ÀÍÈ÷ ¾Ë°í ÀÖ´Ù¸é, gdkÀÇ »ó´ç¼ö ÇÔ¼öµéÀº Á¶±Ý ȤÀº ÀüÇô ¾µ ÀÏÀÌ ¾øÀ» °ÍÀÌ´Ù.
¸ðµç ÇÔ¼öµéÀº Xlib ÇÔ¼öµé¿¡ ´õ ½±°í ´õ Á÷°üÀûÀÎ ¹æ¹ýÀ¸·Î Á¢±ÙÇÒ ¼ö ÀÖµµ·Ï
¸¸µé¾îÁø °ÍµéÀÌ´Ù.  ¶Ç, gdk´Â glib(°ð ¼Ò°³µÊ)¸¦ ÀÌ¿ëÇϱ⠶§¹®¿¡, ¿©·¯°¡Áö
Ç÷§Æû¿¡¼­ ´õ ¾ÈÀüÇÏ°í À̽ļºÀÌ ³ô°Ô ÀÌ¿ëµÉ ¼ö ÀÖ´Ù.

***
*** 5-2. How do I use color allocation?
***
 GDK¿¡ ´ëÇØ ¸ÚÁø Á¡µé Áß Çϳª´Â ÀÌ°ÍÀÌ XlibÀÇ »óÃþºÎ¿¡ ±â¹ÝÀ» µÎ°í ÀÖ´Ù´Â
»ç½ÇÀÌ´Ù.  ÀÌ°ÍÀº ƯÈ÷ »ö±ò °ü¸® Ãø¸é¿¡¼­ ÇϳªÀÇ ¹®Á¦Á¡ÀÌ µÉ ¼öµµ ÀÖ´Ù.
¿ì¸®°¡ ÇÁ·Î±×·¥¿¡¼­ »ö±òÀ» ÀÌ¿ëÇÏ·Á°í ÇÑ´Ù¸é, »ç°¢ÇüÀ» ±×¸®±â À§ÇØ ÀÌ·±
½ÄÀÇ Äڵ带 ÀÛ¼ºÇÑ´Ù.

    {
      GdkColor *color;
      int width, height;
      GtkWidget *widget;
      GdkGC *gc;

      ...

      /* ¸ÕÀú, ±×·Á³ÖÀ» GC¸¦ ¸¸µç´Ù. */
      gc = gdk_gc_new(widget->window);

      /* »ç°¢ÇüÀ» À§ÇØ Àû´çÇÑ dimensionÀ» Àâ´Â´Ù. */
      gdk_window_get_size(widget->window, &width, &height);

      /* ¿ì¸®°¡ ÀÌ¿ëÇÏ·Á´Â »ö±òÀÌ´Ù. */
      color = (GdkColor *)malloc(sizeof(GdkColor));

      /* ³Ñ°ÜÁØ °ªµéÀº red, green, blue·Î¼­, ¿ì¸®°¡ ±×¸®°íÀÚ ÇÏ´Â »ö±òÀÇ
       * RGB tripleÀ» ³ªÅ¸³½´Ù.  GdkColor¿¡ ÀÖ´Â RGB ¼ººÐµéÀÇ °ªÀº 0ºÎÅÍ
       * 255±îÁö°¡ ¾Æ´Ï¶ó 0ºÎÅÍ 65535·Î ÀâÇô ÀÖÀ½À» ±â¾ïÇÏÀÚ. */
      color->red = red * (65535/255);
      color->green = green * (65535/255);
      color->blue = blue * (65535/255);

      /* pixel °ªÀº »ö±òÀÇ Ä®¶ó¸Ê(colormap)ÀÇ À妽º¸¦ ³ªÅ¸³½´Ù.
       * ÀÌ´Â ´Ü¼øÈ÷ ¿ì¸®°¡ ÀÌ¹Ì ¼¼ÆÃÇÑ RGB °ªÀÇ Á¶ÇÕÀÌ´Ù. */
      color->pixel = (gulong)(red*65536 + green*256 + blue);

      /* ±×·±µ¥, ÀÌ pixel °ªÀº ¿ÀÁ÷ 24-bit(TrueColor) µð½ºÇ÷¹ÀÌ¿¡¼­¸¸
       * ½ÇÁ¦·Î Á¸ÀçÇÑ´Ù.  µû¶ó¼­ Çö½ÇÀûÀ¸·Î GDK¿Í X°¡ ¿ì¸®¿¡°Ô ÁÙ ¼ö
       * ÀÖ´Â »öÀº ÀÌ Ä®¶ó¸Ê¿¡¼­ Á¤ÇØÁø »ö±ò¿¡ °¡Àå °¡±î¿î °ªÀÌ µÈ´Ù. */
      gdk_color_alloc(gtk_widget_get_colormap(widget), color);

      /* ¿ì¸® »ö±òÀÇ foreground¸¦ ¼¼ÆÃÇÑ´Ù. */
      gdk_gc_set_foreground(gc, color);

      /* »ç°¢ÇüÀ» ±×¸°´Ù. */
      gdk_draw_rectangle(widget->window, gc, 1, 0, 0, width, height);

      ...
    }


*****************
*** 6. About glib
*****************

***
*** 6-1. What is glib?
***
 GLIB´Â GDK/GTK ¾îÇÃÀ» Á¦ÀÛÇÏ´Â µ¥ ÀÖ¾î À¯¿ëÇÑ ÇÔ¼ö¿Í Á¤ÀǵéÀ» °¡Áö°í ÀÖ´Â
¶óÀ̺귯¸®´Ù.  ÀÌ°ÍÀº ÀϺΠ½Ã½ºÅÛ¿¡¼­ ¹ö±× Åõ¼ºÀÌÀÎ malloc°°Àº, Ç¥ÁØ libc
ÇÔ¼öµéÀ» ´ëÄ¡ÇØ ÁØ´Ù.
 ¶ÇÇÑ ÀÌ°ÍÀº ´ÙÀ½À» Çڵ鸵Çϱâ À§ÇÑ ·çƾ(routine)µéµµ Á¦°øÇÑ´Ù.

  * ÀÌÁß ¿¬°á ¸®½ºÆ®
  * (´ÜÀÏ) ¿¬°á ¸®½ºÆ®
  * ŸÀ̸Ó
  * ¹®ÀÚ¿­
  * »çÀüÀû(lexical) Á¶»çµµ±¸
  * ¿¡·¯ ÇÔ¼ö

***
*** 6-2. Why use g_print, g_malloc, g_strdup and fellow glib functions?
***
 Tim JanikÀÌ gtk-list¿¡ º¸³½ °ÍÀ» Á¶±Ý ¼öÁ¤Çß´Ù.

 "g_malloc(), g_free() ±×¸®°í ´Ù¸¥ glib ÇÔ¼öµéÀ» »ìÆ캸¸é, À̵éÀÌ
  °¢°¢ ´ëÀÀµÇ´Â libcÀÇ ÇÔ¼öµéº¸´Ù ÈξÀ ¾ÈÀüÇÏ´Ù´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù.
  ¿¹¸¦µé¾î, g_free()´Â NULL·Î½á È£ÃâµÇ¾úÀ» ¶§ ±×³É ¸®ÅϵȴÙ.  ¶ÇÇÑ,
  USE_DMALLOCÀÌ Á¤ÀÇµÈ »óŶó¸é ÀÌ ÇÔ¼öµéÀÇ Á¤ÀÇ´Â MALLOC(), FREE() µîÀ»
  ÀÌ¿ëÇÏ´Â °ÍÀ¸·Î µÇ¸ç, MEM_PROFILE ¶Ç´Â MEM_CHECK°¡ Á¤ÀÇµÈ »óŶó¸é
  ¾²¿©Áø ¸Þ¸ð¸®ºí·°ÀÇ Å©±â¸¦ Àé ÀÛÀº Åë°è±îÁö ³»°ÔµÈ´Ù(g_mem_profile(),
  g_mem_check()¿¡ ÀÇÇØ º¸¿©Áö´Â).

  ¾ðÁ¦³ª Å©±â°¡ °°°í ÇÊ¿äÇÏ´Ù¸é ALLOC_ONLY·Î ¼³Á¤µÈ ¸¹Àº ¸Þ¸ð¸® ºí·°À»
  ´Ù·ê ¶§, glib´Â °ø°£À» Àý¾àÇϱâ À§ÇØ ¸Þ¸ð¸® Á¶°¢µé¿¡ ´ëÇÑ ÀÎÅÍÆäÀ̽º¸¦
  Á¦°øÇÑ´Ù´Â »ç½ÇÀ» °í·ÁÇØ º¸ÀÚ.  ÀÌ°ÍÀº ¸¶Ä¡ gdk°¡ Xlib¸¦ µÑ·¯½Î°í ÀÖµíÀÌ,
  ÀϹÝÀûÀÎ malloc/free¸¦ µÑ·¯½Ñ (µð¹ö±× °¡´ÉÇÑ) ÀÛÀº º¸È£¸·À̶ó ÇÒ ¼ö ÀÖ´Ù.

  GIMP¿¡¼­Ã³·³ ¾îÇà ³»¿¡¼­ g_error()¿Í g_warning()À» ÀÌ¿ëÇÑ´Ù´Â °ÍÀº gtk¸¦
  ÀüÀûÀ¸·Î ¹Ï±â ¶§¹®ÀÌ´Ù.  Áï gtk´Â ¸î ÁÙÀÇ gtk_print()¸¦ ÅëÇØ ¿©·¯ºÐ
  ³ª¸§´ë·ÎÀÇ Çڵ鷯(g_set_error_handler()¸¦ ÀÌ¿ëÇÏ´Â)·Î ¸Þ½ÃÁö¸¦ º¸ÀÌ´Â
  À©µµ¸¦ gtkÀÇ À©µµ¿ì ¾È¿¡ Æ˾÷½Ãų ¼ö ÀÖ´Â ±âȸ±îÁö Á¦°øÇÑ´Ù.


********************************************************
*** 7. GTK+ FAQ Contributions, Maintainers and Copyright
********************************************************

 FAQ¿¡ µ¿ÂüÇÏ°í ½Í´Ù¸é, Æ÷ÇÔ½ÃÅ°°íÀÚ ÇÏ´Â ³»¿ë(Áú¹®°ú ´äº¯)À» ¿ì¸®¿¡°Ô
e-mail·Î º¸³½´Ù.  ´ç½ÅÀÇ Çù·ÂÀ¸·Î ÀÌ ¹®¼­´Â Çâ»óµÇ¾î ´õ¿í À¯¿ëÇØÁú ¼ö ÀÖ´Ù!

 ÀÌ ¹®¼­´Â Nathan Froyd <maestrox@geocities.com> ±×¸®°í Tony Gale <gale@
gimp.org> ¿¡ ÀÇÇØ °ü¸®µÇ°í ÀÖ´Ù.  ÀÌ FAQÀÇ ÀúÀÚ´Â Áö¿øÀ» °è¼ÓÇØ ÁÙ Shawn T.
Amundson <amundson@gimp.org> ÀÌ´Ù.

 ÀÌ GTK+ FAQ Àº,

Copyright (C) 1997,1998
by Shawn T. Amundson, Nathan Froyd and Tony Gale.

 ÀÌ ¹®¼­°¡ ¾ðÁ¦±îÁö³ª ÀǵµÇß´ø´ë·Î ³²¾ÆÀÖÀ¸¸®¶ó°í´Â º¸ÀåÇÒ ¼ö ¾ø´Ù.
ÀÌ°ÍÀº ´ÜÁö ÀÚÀ¯·Î¿î ¸®¼Ò½ºÀÏ »ÓÀÌ´Ù.  Æ÷ÇÔµÈ Á¤º¸ÀÇ ÀúÀÚ¿Í °ü¸®ÀÚ´Â ½ÉÁö¾î
Á¤È®¼º¿¡ À־µµ ¾î¶² º¸ÀåÀ» ÇÏÁö ¾Ê´Â´Ù.

HomePage Backward Forward Post Reply List
1998 by swindler