¸®´ª½º ±âŸ ÀÚ·á |
---|
Á¦¸ñ | 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. ÀÌ ¹®¼°¡ ¾ðÁ¦±îÁö³ª ÀǵµÇß´ø´ë·Î ³²¾ÆÀÖÀ¸¸®¶ó°í´Â º¸ÀåÇÒ ¼ö ¾ø´Ù. ÀÌ°ÍÀº ´ÜÁö ÀÚÀ¯·Î¿î ¸®¼Ò½ºÀÏ »ÓÀÌ´Ù. Æ÷ÇÔµÈ Á¤º¸ÀÇ ÀúÀÚ¿Í °ü¸®ÀÚ´Â ½ÉÁö¾î Á¤È®¼º¿¡ À־µ ¾î¶² º¸ÀåÀ» ÇÏÁö ¾Ê´Â´Ù. |