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

HomePage Backward Forward Post Reply List
Delete Modify
  Á¦¸ñ   gtk °­Á #4 1998/07/10 (17:31)
À̸§ ±èÈ¿¿ø
¹øÈ£ 88
Á¶È¸ 862
º»¹®
¡º¸®´ª½º Çдç-¹ø¿ª¹° (go LINUX)¡» 201¹ø
Á¦  ¸ñ:[¹ø¿ª] gtk Tutorial, Chap7ÀÔ´Ï´Ù.                           
¿Ã¸°ÀÌ:Áß¾ÓÀÚ´ë(ÀÌÈÆ    )    98/03/11 15:26    ÀÐÀ½:163 °ü·ÃÀÚ·á ¾øÀ½
-----------------------------------------------------------------------------

**********************
*** 7. ´Ù¾çÇÑ widgetµé
**********************

***
*** 7-1. ¶óº§(label)
***
 ¶óº§Àº GTK¿¡¼­ ÀÚÁÖ ¾²ÀÌ°í ºñ±³Àû °£´ÜÇÑ °ÍÀÌ´Ù.  À̵éÀº °ü·ÃµÈ XÀ©µµ°¡
¾øÀ¸¹Ç·Î ½Ã±×³ÎÀ» ¹ß»ýÇÏÁö ¾Ê´Â´Ù.  ¸¸¾à ½Ã±×³ÎÀ» Àâ¾Æ³»°Å³ª Ŭ¸®ÇÎÀ» ÇÒ
¸ñÀûÀ̶ó¸é EventBox widgetÀ» ÀÌ¿ëÇ϶ó.

 »õ·Î¿î ¶óº§À» ¸¸µé±â À§ÇØ ÀÌ°ÍÀ» ÀÌ¿ëÇÑ´Ù.

      GtkWidget* gtk_label_new (char *str);

 ÇϳªÀÇ ÀÎÀÚ´Â ¿ì¸®°¡ ³ªÅ¸³»°íÀÚ ÇÏ´Â ¶óº§ÀÇ ¹®ÀÚ¿­ÀÌ´Ù.

 ¶óº§À» ¸¸µç ÀÌÈÄ¿¡ ÀÌ ¶óº§ÀÇ ÅؽºÆ®¸¦ ¹Ù²Ù·Á¸é ÀÌ°ÍÀ» ÀÌ¿ëÇÑ´Ù.

      void gtk_label_set (GtkLabel  *label,
                          char      *str);

 Ã¹¹ø° ÀÎÀÚ´Â ÀÌÀü¿¡ ¸¸µé¾îÁ® ÀÖ´Â ¶óº§(GTK_LABEL()¸ÅÅ©·Î·Î½á ij½ºÆ®µÊ)
ÀÌ°í, µÎ¹ø°´Â »õ·Î¿î ¹®ÀÚ¿­ÀÌ´Ù.

 »õ·Î¿î ¶óº§À» À§ÇÑ °ø°£Àº ÇÊ¿äÇÒ °æ¿ì¿¡ ÀÚµ¿ÀûÀ¸·Î Á¶ÀýµÈ´Ù.

 ÇöÀçÀÇ ¹®ÀÚ¿­À» µÇã°í ½Í´Ù¸é ÀÌ°ÍÀ» ÀÌ¿ëÇÑ´Ù.

      void gtk_label_get (GtkLabel  *label,
                          char     **str);

 Ã¹¹ø° ÀÎÀÚ´Â ¸¸µé¾îÁ³´ø ¶óº§ÀÌ°í, µÎ¹ø°´Â µÇ»ì¸®°íÀÚ ÇÏ´Â ¹®ÀÚ¿­ÀÌ´Ù.

***
*** 7-2. dz¼± µµ¿ò¸»(tooltip widget)
***
 ¸¶¿ì½ºÆ÷ÀÎÅ͸¦ ¾î¶² ¹öÆ°À̳ª ´Ù¸¥ widget À§¿¡ ¸î ÃÊ ¸Ó¹«¸£°Ô Çϸé ÀÛÀº
ÅؽºÆ® ¹®ÀÚ¿­ÀÌ Æ¢¾î³ª¿À´Â °æ¿ì°¡ ÀÖ´Ù.  ÀÌ°ÍÀº °£´ÜÇÑ °ÍÀ̸ç, ±×·¡¼­
¿©±â¼­ ¿¹Á¦¾øÀÌ ¼³¸íÇÏ°Ú´Ù.  ½ÇÁ¦·Î Äڵ带 º¸°í½Í´Ù¸é GDK¿Í ÇÔ²² ¹èÆ÷µÇ´Â
testgtk.c ÇÁ·Î±×·¥À» ÂüÁ¶Ç϶ó.

 ¶óº§ µî ¾î¶² widget¿¡´Â ÀÌ tooltipÀÌ ¾²ÀÌÁö ¾Ê´Â´Ù.

 ¿ì¸®°¡ óÀ½ ÀÌ¿ëÇÒ ÇÔ¼ö´Â »õ·Î¿î tooltipÀ» ¸¸µå´Â °ÍÀÌ´Ù.  ÀÌ°ÍÀº ÁÖ¾îÁø
ÇÔ¼ö¿¡¼­ Çѹø¸¸ ÇØÁÖ¸é µÈ´Ù.  ÀÌ ÇÔ¼ö°¡ ¸®ÅÏÇÏ´Â GtkTooltipÀº ´ÙÁßÀÇ tooltip
À» ¸¸µå´Âµ¥µµ ÀÌ¿ëµÉ ¼ö ÀÖ´Ù.

 GtkTooltips *gtk_tooltips_new (void);

 ÀÏ´Ü »õ·Î¿î tooltip°ú ±×°ÍÀ» »ç¿ëÇÒ widgetÀ» ¸¸µé¾úÀ¸¸é, ±×°ÍÀ» ¼¼ÆÃÇϱâ
À§ÇØ ÀÌ ÇÔ¼ö¸¦ ÀÌ¿ëÇ϶ó.

      void gtk_tooltips_set_tips   (GtkTooltips *tooltips,
                                    GtkWidget   *widget,
                                    gchar       *tips_text);

 Ã¹¹ø° ÀÎÀÚ´Â ¿ì¸®°¡ ¸¸µç tooltipÀÌ°í, ´ÙÀ½Àº ÀÌ tooltipÀ» Æ÷ÇÔÇÏ°Ô µÉ
widgetÀÌ´Ù.  ±×¸®°í ¸¶Áö¸· ÀÎÀÚÀÎ ÅؽºÆ®´Â ¿ì¸®°¡ tooltip¿¡¼­ ¸»ÇÏ°íÀÚ ÇÏ´Â
°ÍÀÌ´Ù.

 ÀÌ°ÍÀº ªÀº ¿¹´Ù.

      GtkTooltips *tooltips;
      GtkWidget *button;
      tooltips = gtk_tooltips_new ();
      button = gtk_button_new_with_label ("button 1");
      gtk_tooltips_set_tips (tooltips, button, "This is button 1");

 Tooltip¿¡ ¾²ÀÌ´Â ´Ù¸¥ ÇÔ¼öµéµµ ÀÖ´Ù.  ¿©±â¼­ ±×µéÀ» °£´ÜÈ÷ ¼Ò°³ÇÏ°Ú´Ù.

      void gtk_tooltips_destroy    (GtkTooltips *tooltips);

 ¸¸µé¾îÁø tooltipÀ» Á¦°ÅÇÑ´Ù.

      void gtk_tooltips_enable     (GtkTooltips *tooltips);

 Disable·Î ¼³Á¤µÈ tooltipÀ» enableÇÑ´Ù.

      void gtk_tooltips_disable    (GtkTooltips *tooltips);

 Enable·Î ¼³Á¤µÈ tooltipÀ» disableÇÑ´Ù.

      void gtk_tooltips_set_delay  (GtkTooltips *tooltips,
                                    gint         delay);

 TooltipÀÌ Æ¢¾î¿À¸£±â À§ÇØ ¾ó¸¶³ª ¸¶¿ì½ºÆ÷ÀÎÅ͸¦ widgetÀ§¿¡ ¸Ó¹«¸£°Ô
ÇؾßÇÏ´Â Áö¸¦, millisecond´ÜÀ§·Î ¼¼ÆÃÇÑ´Ù.  µðÆúÆ®·Î 1000millisecond, Áï
1ÃÊ´Ù.

      void      gtk_tooltips_set_tips (GtkTooltips *tooltips,
                                       GtkWidget   *widget,
                                       gchar    *tips_text);

 ÀÌ¹Ì ¸¸µé¾îÁø tooltipÀÇ ÅؽºÆ® ³»¿ëÀ» ¹Ù²Û´Ù.

      void gtk_tooltips_set_colors (GtkTooltips *tooltips,
                                    GdkColor    *background,
                                    GdkColor    *foreground);

 TooltipÀÇ Ç¥Çö»ö°ú ¹è°æ»öÀ» ¹Ù²Û´Ù.  ¾î¶»°Ô »ö±òÀ» ¼³Á¤ÇÏ´ÂÁö¿¡ ´ëÇؼ­´Â
¸ð¸£°Ú´Ù.

 Tooltip¿¡ °ü·ÃµÈ ÇÔ¼ö´Â ÀÌ°ÍÀÌ ÀüºÎ´Ù.  ´õÀÌ»ó ¾Ë °Íµµ ¾ø´Ù.  :)

***
*** 7-3. ÁøÇื´ë(progress bar)
***
 ÁøÇื´ë´Â ÀÛ¾÷ÀÇ »óȲÀ» ³ªÅ¸³»±â À§ÇØ ¾²ÀδÙ.  ÀÌÁ¦ Äڵ带 º¸¸é ¾Ë°ÚÁö¸¸,
ÀÌ°ÍÀº ²Ï °£´ÜÇÏ´Ù.  ±×·¯³ª ¸ÕÀú »õ·Î¿î ÁøÇื´ë¸¦ ¸¸µé¾îÁÖ´Â ÇÔ¼ö¸¦ »ìÆì
º¸´Â °ÍÀ¸·Î ½ÃÀÛÇÏÀÚ.

      GtkWidget *gtk_progress_bar_new (void);

 ÀÌÁ¦ ÁøÇื´ë°¡ ¸¸µé¾îÁ³°í ¿ì¸®´Â ±×°ÍÀ» ÀÌ¿ëÇÒ ¼ö ÀÖ´Ù.

      void gtk_progress_bar_update (GtkProgressBar *pbar, gfloat percentage);

 Ã¹¹ø° ÀÎÀÚ´Â µ¿ÀÛ½Ãų ÁøÇื´ë°¡ µÇ°í, µÎ¹ø° ÀÎÀÚ´Â '¿Ï·áµÈ' ºÐ·®À»
³ªÅ¸³½´Ù.  ÀÌ°ÍÀº ½ÇÁ¦ ¼ýÀÚ·Î 0ºÎÅÍ 1±îÁö°í, 0ºÎÅÍ 100ÆÛ¼¾Æ®¸¦ ÀǹÌÇÏ´Â
°ÍÀÌ´Ù.

 ÁøÇื´ë´Â º¸Åë ŸÀӾƿôÀ̳ª ¶Ç´Â ¸ÖƼŽºÅ·ÇÏ´Â Âø°¢À» ÀÏÀ¸Å°°Ô ÇÏ´Â
ÇÔ¼öµé°ú ÇÔ²² ¾²ÀδÙ.  ('ŸÀӾƿô, I/O¿Í idleÇÔ¼öµé'¿¡ ´ëÇÑ ºÎºÐÀ» ÂüÁ¶Ç϶ó.)
¸ðµç °æ¿ì¿¡ gtk_progress_bar_updateÇÔ¼ö°¡ µ¿ÀÏÇÑ ¹æ½ÄÀ¸·Î ¾²ÀÌ°Ô µÈ´Ù.

 ÀÌ°ÍÀº ŸÀӾƿôÀ» ÀÌ¿ëÇØ ¾÷µ¥ÀÌÆ®µÇ´Â ÁøÇื´ë¸¦ º¸ÀÎ ¿¹Á¦´Ù.  ÀÌ°ÍÀº ¶ÇÇÑ
ÁøÇื´ë¸¦ ¸®¼Â, Áï ÃʱâÈ­ÇÏ´Â ¹æ¹ýµµ º¸¿©ÁÙ °ÍÀÌ´Ù.

 #include <gtk/gtk.h>

 static int ptimer = 0;
 int pstat = TRUE;

 /* ÀÌ ÇÔ¼ö´Â ÁøÇื´ë¸¦ Áõ°¡½ÃÅ°°í ¾÷µ¥ÀÌÆ®ÇÑ´Ù.  ¶Ç pstat°¡ FALSE·Î µÇ¸é
  * ÁøÇื´ë¸¦ ¸®¼Â, Áï ÃʱâÈ­ÇÑ´Ù. */
 gint progress (gpointer data)
 {
     gfloat pvalue;

     /* ÁøÇื´ëÀÇ ÇöÀç°ªÀ» ¾Ë¾Æ³½´Ù. */
     pvalue = GTK_PROGRESS_BAR (data)->percentage;

     if ((pvalue >= 1.0) || (pstat == FALSE)) {
         pvalue = 0.0;
         pstat = TRUE;
     }
     pvalue += 0.01;

     gtk_progress_bar_update (GTK_PROGRESS_BAR (data), pvalue);

     return TRUE;
 }

 /* ÀÌ ÇÔ¼ö´Â ÁøÇื´ëÀÇ ¸®¼ÂÀ» À§ÇÑ ½Ã±×³ÎÀ» ³½´Ù. */
 void progress_r (void)
 {
     pstat = FALSE;
 }

 void destroy (GtkWidget *widget, gpointer *data)
 {
     gtk_main_quit ();
 }

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

     gtk_init (&argc, &argv);

     window = gtk_window_new (GTK_WINDOW_TOPLEVEL);

     gtk_signal_connect (GTK_OBJECT (window), "delete_event",
                         GTK_SIGNAL_FUNC (destroy), NULL);

     gtk_container_border_width (GTK_CONTAINER (window), 10);

     table = gtk_table_new(3,2,TRUE);
     gtk_container_add (GTK_CONTAINER (window), table);

     label = gtk_label_new ("Progress Bar Example");
     gtk_table_attach_defaults(GTK_TABLE(table), label, 0,2,0,1);
     gtk_widget_show(label);

     /* »õ·Î¿î ÁøÇื´ë¸¦ ¸¸µé°í, ±×°ÍÀ» Å×ÀÌºí¿¡ ÆÐÅ·ÇÏ¿© º¸¿©ÁØ´Ù. */
     pbar = gtk_progress_bar_new ();
     gtk_table_attach_defaults(GTK_TABLE(table), pbar, 0,2,1,2);
     gtk_widget_show (pbar);

     /* ÁøÇื´ëÀÇ ÀÚµ¿ ¾÷µ¥ÀÌÆ®¸¦ À§ÇÑ timeoutÀ» ¼³Á¤ÇÑ´Ù. */
     ptimer = gtk_timeout_add (100, progress, pbar);

     /* ÀÌ ¹öÆ°ÀÌ ÁøÇื´ë¸¦ ¸®¼ÂÇÏ´Â ½Ã±×³ÎÀ» À§ÇÑ °ÍÀÌ´Ù. */
     button = gtk_button_new_with_label ("Reset");
     gtk_signal_connect (GTK_OBJECT (button), "clicked",
                         GTK_SIGNAL_FUNC (progress_r), NULL);
     gtk_table_attach_defaults(GTK_TABLE(table), button, 0,1,2,3);
     gtk_widget_show(button);

     button = gtk_button_new_with_label ("Cancel");
     gtk_signal_connect (GTK_OBJECT (button), "clicked",
                         GTK_SIGNAL_FUNC (destroy), NULL);

     gtk_table_attach_defaults(GTK_TABLE(table), button, 1,2,2,3);
     gtk_widget_show (button);

     gtk_widget_show(table);
     gtk_widget_show(window);

     gtk_main ();

     return 0;
 }

 ÀÌ ÀÛÀº ÇÁ·Î±×·¥¿¡´Â ÁøÇื´ëÀÇ ÀϹÝÀûÀÎ µ¿ÀÛ°ú °ü·ÃµÈ ³× °³ÀÇ ¿µ¿ªÀÌ
ÀÖ´Ù.  ±×µéÀÌ ¾²¿©Áø ¼ø¼­¿¡ µû¶ó ¾Ë¾Æº¸µµ·Ï ÇÏÀÚ.

      pbar = gtk_progress_bar_new ();

 ÀÌ ÄÚµå´Â pbar¶ó´Â À̸§ÀÇ »õ·Î¿î ÁøÇื´ë¸¦ ¸¸µé°í ÀÖ´Ù.

      ptimer = gtk_timeout_add (100, progress, pbar);

 ÀÌ Äڵ忡¼­ ÀÏÁ¤ÇÑ ½Ã°£°£°ÝÀÇ Å¸ÀӾƿôÀ» ÀÌ¿ëÇϴµ¥, ÁøÇื´ëÀÇ ÀÌ¿ë¿¡ ²À
ŸÀӾƿôÀ» ½á¾ß µÇ´Â °ÍÀº ¾Æ´Ï´Ù.

      pvalue = GTK_PROGRESS_BAR (data)->percentage;

 ¿©±â¼­ pvalue¸¦ ÇâÇÑ percentage barÀÇ ÇöÀç °ªÀ» ÁöÁ¤ÇØ ÁÖ°í ÀÖ´Ù.

      gtk_progress_bar_update (GTK_PROGRESS_BAR (data), pvalue);

 ³¡À¸·Î, pvalueÀÇ °ª¿¡ ÀÇÇØ ÁøÇื´ë¸¦ ¾÷µ¥ÀÌÆ®ÇÑ´Ù.

 ±×¸®°í ÁøÇื´ë¿¡ ´ëÇØ ¾Ë °ÍÀº ÀÌ°ÍÀÌ ÀüºÎ´Ù, Áñ°Üº¸±â¸¦~!

***
*** 7-4. ´ëÈ­»óÀÚ
***
 ´ëÈ­»óÀÚ widgetÀº ¸Å¿ì °£´ÜÇÑ °ÍÀε¥, ½ÇÁ¦·Î ÀÌ°ÍÀº ¸î°¡Áö°¡ ¹Ì¸® ÆÐÅ·µÇ¾î
ÀÖ´Â ÇϳªÀÇ À©µµÀÏ »ÓÀÌ´Ù.  Dialog¸¦ À§ÇÑ ±¸Á¶Ã¼´Â ÀÌ°ÍÀÌ´Ù.

      struct GtkDialog
      {
            GtkWindow window;

            GtkWidget *vbox;
            GtkWidget *action_area;
      };

 º¸´Ù½ÃÇÇ ÀÌ°ÍÀº ´Ü¼øÈ÷ À©µµ¸¦ ¸¸µé°í, ±×¸®°í´Â vbox¸¦ ¸Ç À§·Î ÆÐÅ·ÇÏ°í,
´ÙÀ½À¸·Î separator¸¦, ±×¸®°í ³ª¼­ "action_area"¸¦ À§ÇÑ hbox¸¦ ÆÐÅ·ÇÑ´Ù.

 ´ëÈ­»óÀÚwidgetÀº »ç¿ëÀÚ¿¡°Ô Æ˾÷ ¸Þ½ÃÁö¸¦ º¸À̰ųª ÇÏ´Â µîÀÇ ¸ñÀûÀ¸·Î ¾²ÀÏ
¼ö ÀÖ´Ù.  ÀÌ°ÍÀº Á¤¸» ±âº»ÀûÀÎ °ÍÀ¸·Î, ´ëÈ­¹Ú½º¸¦ À§ÇÑ ÇÔ¼ö´Â ÀÌ°Í Çϳª
»ÓÀÌ´Ù.

      GtkWidget* gtk_dialog_new (void);

 ±×·¡¼­ »õ·Î¿î ´ëÈ­¹Ú½º¸¦ ¸¸µé·Á¸é ÀÌ·¸°Ô ÇÑ´Ù.

      GtkWidget window;
      window = gtk_dialog_new ();

 ÀÌ°ÍÀº ´ëÈ­»óÀÚ¸¦ ¸¸µé °ÍÀÌ°í, ¾î¶»°Ô ÀÌ¿ëÇÒÁö´Â °¢ÀÚ¿¡°Ô ´Þ·ÁÀÖ´Ù.
¿ì¸®´Â ÀÌ·± ½ÄÀ¸·Î Çؼ­ action_area ¾È¿¡ ¹öÆ°À» ÆÐÅ·ÇÒ ¼ö ÀÖ´Ù.

      button = ...
      gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area), button,
                          TRUE, TRUE, 0);
      gtk_widget_show (button);

 ±×¸®°í ¿ì¸®´Â ÆÐÅ·¿¡ ÀÇÇÏ¿© vbox ¿µ¿ª¿¡ ¶óº§ µîÀ» Ãß°¡ÇÒ ¼ö ÀÖ´Ù.  ¾Æ·¡¿Í
°°ÀÌ Çغ¸ÀÚ.

      label = gtk_label_new ("Dialogs are groovy");
      gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), label, TRUE,
                          TRUE, 0);
      gtk_widget_show (label);

 ´ëÈ­»óÀÚ¸¦ ÀÌ¿ëÇÑ ¿¹Á¦¿¡¼­Ã³·³, ¿ì¸®´Â action_area¿¡ Cancel°ú OkÀÇ µÎ
¹öÆ°À», ±×¸®°í vbox¿µ¿ª¿£ »ç¿ëÀÚ¿¡°Ô ¹°¾îº¸°Å³ª ¿¡·¯¸Þ½ÃÁö¸¦ ³»°Å³ª ÇÏ´Â
¸ñÀûÀÇ ¶óº§À» ¸¸µé ¼ö ÀÖÀ» °ÍÀÌ´Ù.  ±×¸®°í ³ª¼­ »ç¿ëÀÚÀÇ ¼±Åÿ¡ µû¶ó
ÀÛµ¿Çϵµ·Ï ¹öÆ° °¢°¢¿¡ ¼­·Î ´Ù¸¥ ½Ã±×³ÎÀ» ¼³Á¤ÇØ µÑ ¼ö ÀÖ´Ù.

***
*** 7-5. ÇȽº¸Ê
***
 ÇȽº¸ÊÀº ±×¸²À» Æ÷ÇÔÇÏ°í ÀÖ´Â ÀÚ·á ±¸Á¶ÀÌ´Ù.  ÀÌ·± ±×¸²Àº ¿©·¯°¡Áö·Î ¾²ÀÏ
¼ö Àִµ¥, °¡Àå ´«¿¡ ¶ç´Â ÀÌ¿ëÀº XÀ©µµ µ¥½ºÅ©ÅéÀÇ ¾ÆÀÌÄÜÀ̳ª Ä¿¼­ÀÏ °ÍÀÌ´Ù.
ºñÆ®¸ÊÀ̶õ 2»öÀÇ ÇȽº¸ÊÀÌ´Ù.

 GTK¿¡¼­ ÇȽº¸ÊÀ» ÀÌ¿ëÇϱâ À§ÇØ, ¿ì¸®´Â ¸ÕÀú GDK ¼öÁØÀÇ ÇÔ¼öµé·Î½á
GdkPixmap ±¸Á¶Ã¼¸¦ ¸¸µé¾î¾ß ÇÑ´Ù.  ÇȽº¸ÊÀº ¸Þ¸ð¸®ÀÇ ÀÚ·á ȤÀº ÆÄÀϷκÎÅÍ
ÀоîµéÀÎ ÀÚ·á·ÎºÎÅÍ ¸¸µé¾îÁú ¼ö ÀÖ´Ù.  ¿ì¸®´Â ÇȽº¸ÊÀ» ¸¸µé±â À§ÇÑ °¢°¢ÀÇ
ÇÔ¼ö¸¦ Áö±ÝºÎÅÍ »ìÆ캼 °ÍÀÌ´Ù.

      GdkPixmap *gdk_bitmap_create_from_data( GdkWindow *window,
                                              gchar     *data,
                                              gint      width,
                                              gint      height );

 ÀÌ ÇÔ¼ö´Â ¸Þ¸ð¸®ÀÇ µ¥ÀÌÅÍ·Î 2»öÀÇ single-plane ÇȽº¸ÊÀ» ¸¸µé±â À§ÇÑ °ÍÀ¸·Î,
µ¥ÀÌÅÍÀÇ °¢°¢ÀÇ ºñÆ®´Â Çȼ¿ÀÇ on/off ¿©ºÎ¸¦ ³ªÅ¸³½´Ù.  width/height´Â Çȼ¿
´ÜÀ§´Ù.  ÇȽº¸Ê ¸®¼Ò½º´Â ±×°ÍÀÌ º¸¿©Áú ½ºÅ©¸°ÀÇ ¹è°æ¿¡¼­¸¸ Àǹ̰¡ ÀÖÀ¸¹Ç·Î,
GdkWindow Çü Æ÷ÀÎÅÍ´Â ÇöÀçÀÇ À©µµ¸¦ °¡¸®Å°°Ô µÈ´Ù.

      GdkPixmap* gdk_pixmap_create_from_data( GdkWindow  *window,
                                              gchar      *data,
                                              gint        width,
                                              gint        height,
                                              gint        depth,
                                              GdkColor   *fg,
                                              GdkColor   *bg );

 ÀÌ°ÍÀº ÁÖ¾îÁø ºñÆ®¸Ê µ¥ÀÌŸ·ÎºÎÅÍ ÀÓÀÇÀÇ depth(»öÀÇ °¹¼ö)¸¦ °¡Áø ÇȽº¸ÊÀ»
¸¸µé ¶§ ¾²ÀδÙ.  fg¿Í bg´Â ÀÌ¿ëÇÒ foreground ¹× background »ö±òÀÌ´Ù.

 GdkPixmap* gdk_pixmap_create_from_xpm( GdkWindow  *window,
                                        GdkBitmap **mask,
                                        GdkColor   *transparent_color,
                                        const gchar *filename );

 XPM Æ÷¸ËÀº XÀ©µµ½Ã½ºÅÛ¿¡¼­ ÀоîµéÀÏ ¼ö ÀÖ´Â ÇϳªÀÇ ÇȽº¸Ê ÇüÅ´Ù.  ÀÌ°ÍÀº
³Î¸® ¾²ÀÌ°í ÀÖÀ¸¸ç À̹ÌÁö ÆÄÀÏÀ» ÀÌ Æ÷¸ËÀ¸·Î ¸¸µé¾î ÁÖ´Â ¼ö¸¹Àº À¯Æ¿¸®Æ¼µéÀÌ
ÀÖ´Ù.  ÆÄÀÏÀ̸§À¸·Î ºÒ¸®¾îÁø ÀÌ ÆÄÀÏÀº ±× Æ÷¸ËÀÇ À̹ÌÁö¸¦ Æ÷ÇÔÇÏ°í ÀÖ¾î¾ß
ÇÏ°í, ±×°ÍÀº ÇȽº¸Ê ±¸Á¶Ã¼ ¾ÈÀ¸·Î ·ÎµåµÈ´Ù.  ±× ÇȽº¸ÊÀÇ ¾î¶² ºñÆ®°¡ ºÒÅõ¸í
ÇØ¾ß ÇÏ´ÂÁö´Â mask°¡ °áÁ¤ÇÑ´Ù.  ³ª¸ÓÁö ¸ðµç ºñÆ®µéÀº transparent_color¿¡
ÀÇÇØ Á¤ÇØÁø »ö±òÀ» °¡Áö°Ô µÈ´Ù.  ÀÌ°ÍÀ» ÀÌ¿ëÇÏ´Â ¿¹Á¦°¡ ¾Æ·¡¿¡ µÚµû¸¦
°ÍÀÌ´Ù.

      GdkPixmap* gdk_pixmap_create_from_xpm_d (GdkWindow  *window,
                                               GdkBitmap **mask,
                                               GdkColor   *transparent_color,
                                               gchar     **data);

 ÀÛÀº À̹ÌÁö´Â XPM Æ÷¸ËÀÇ µ¥ÀÌÅͷμ­ ÇÁ·Î±×·¥ ³»ºÎ¿¡ Æ÷ÇԵǾî ÀÖÀ» ¼ö°¡
ÀÖ´Ù.  ¾î¶² ÇȽº¸ÊÀº ÆÄÀϷκÎÅÍ µ¥ÀÌÅ͸¦ ÀоîµéÀÌ´Â ´ë½Å ÀÌ·± µ¥ÀÌÅ͸¦
ÀÌ¿ëÇØ ¸¸µé¾îÁø´Ù.  ÀÌ µ¥ÀÌÅÍÀÇ ¿¹´Â ÀÌ·± °ÍÀÌ´Ù.

      /* XPM */
      static const char * xpm_data[] = {
      "16 16 3 1",
      "       c None",
      ".      c #000000000000",
      "X      c #FFFFFFFFFFFF",
      "                ",
      "   ......       ",
      "   .XXX.X.      ",
      "   .XXX.XX.     ",
      "   .XXX.XXX.    ",
      "   .XXX.....    ",
      "   .XXXXXXX.    ",
      "   .XXXXXXX.    ",
      "   .XXXXXXX.    ",
      "   .XXXXXXX.    ",
      "   .XXXXXXX.    ",
      "   .XXXXXXX.    ",
      "   .XXXXXXX.    ",
      "   .........    ",
      "                ",
      "                "};

      void gdk_pixmap_destroy( GdkPixmap  *pixmap );

 ¿ì¸®°¡ ¾î¶² ÇȽº¸ÊÀ» ÀÌ¿ëÇß°í ¶Ç ´çºÐ°£ ´Ù½Ã ÀÌ¿ëÇÒ ÇÊ¿ä°¡ ¾øÀ» °æ¿ì, ÀÌ
¸®¼Ò½º¸¦ gdk_pixmap_destory·Î ¸Þ¸ð¸®¿¡ ¹Ý³³ÇØÁÖ´Â °Íµµ ÁÁÀº »ý°¢ÀÌ´Ù.
ÇȽº¸ÊÀº Áß¿äÇÑ ¸®¼Ò½º·Î °£ÁֵǾî¾ß ÇÑ´Ù.

 ¿ì¸®°¡ ÀÏ´Ü ÇȽº¸ÊÀ» ¸¸µé¸é, ±×°ÍÀ» GTK widgetó·³ º¸¿©ÁÙ ¼ö ÀÖ´Ù.  ¿ì¸®´Â
GDK ÇȽº¸ÊÀ» Æ÷ÇÔ½ÃÅ°±â À§Çؼ­ ÇȽº¸ÊwidgetÀ» ¸¸µé¾î¾ß¸¸ ÇÑ´Ù.  ÀÌ°ÍÀ» ÀÌ¿ë
Çؼ­ ±×·¸°Ô ÇÒ ¼ö ÀÖ´Ù.

      GtkWidget* gtk_pixmap_new( GdkPixmap  *pixmap,
                                 GdkBitmap  *mask );

 ¶Ç´Ù¸¥ ÇȽº¸Êwidget ÇÔ¼öµéÀº ´ÙÀ½°ú °°´Ù.

      guint gtk_pixmap_get_type( void );
      void  gtk_pixmap_set( GtkPixmap  *pixmap,
                            GdkPixmap  *val,
                            GdkBitmap  *mask);
      void  gtk_pixmap_get( GtkPixmap  *pixmap,
                            GdkPixmap **val,
                            GdkBitmap **mask);

 gtk_pixmap_setÀº widgetÀÌ ÇöÀç ´Ù·ç°í ÀÖ´Â ÇȽº¸ÊÀ» º¯È­½ÃÅ°±â À§ÇØ
ÀÌ¿ëÇÑ´Ù.  ÀÎÀÚ valÀº GDK¸¦ ÀÌ¿ëÇØ ¸¸µé¾îÁø ÇȽº¸ÊÀÌ´Ù.

 ÀÌ ¿¹Á¦´Â ¹öÆ° ¾È¿¡ ÇȽº¸ÊÀ» ³Ö´Â ¿¹Á¦ÀÌ´Ù.

 #include <gtk/gtk.h>

 /* Open-File ¾ÆÀÌÄÜÀ» À§ÇÑ XPM µ¥ÀÌÅÍ */
 static const char * xpm_data[] = {
 "16 16 3 1",
 "       c None",
 ".      c #000000000000",
 "X      c #FFFFFFFFFFFF",
 "                ",
 "   ......       ",
 "   .XXX.X.      ",
 "   .XXX.XX.     ",
 "   .XXX.XXX.    ",
 "   .XXX.....    ",
 "   .XXXXXXX.    ",
 "   .XXXXXXX.    ",
 "   .XXXXXXX.    ",
 "   .XXXXXXX.    ",
 "   .XXXXXXX.    ",
 "   .XXXXXXX.    ",
 "   .XXXXXXX.    ",
 "   .........    ",
 "                ",
 "                "};

 /* ÀÌ°ÍÀÌ È£ÃâµÇ¸é(delete_event ½Ã±×³ÎÀ» ÅëÇØ) ¾îÇÃÀÌ Á¾·áµÈ´Ù. */
 void close_application( GtkWidget *widget, GdkEvent *event, gpointer *data )
 {
     gtk_main_quit();
 }

 /* ¹öÆ°ÀÌ Å¬¸¯µÇ¸é È£ÃâµÇ¾î ¸Þ½ÃÁö¸¦ ÇÁ¸°Æ®ÇÑ´Ù. */
 void button_clicked( GtkWidget *widget, gpointer *data )
 {
     printf( "button clicked\n" );
 }

 int main( int argc, char *argv[] )
 {
     /* GtkWidgetÀº widgetÀ» À§ÇÑ ±â¾ïÀå¼Ò ŸÀÔÀÌ´Ù. */
     GtkWidget *window, *pixmapwid, *button;
     GdkPixmap *pixmap;
     GdkBitmap *mask;
     GtkStyle *style;

     /* main À©µµ¸¦ ¸¸µé°í, ¾îÇÃÀ» ³¡³»±â À§ÇÑ delete_event ½Ã±×³ÎÀ»
      * ¿¬°á½ÃÄÑ µÐ´Ù. */
     gtk_init( &argc, &argv );
     window = gtk_window_new( GTK_WINDOW_TOPLEVEL );
     gtk_signal_connect( GTK_OBJECT (window), "delete_event",
                         GTK_SIGNAL_FUNC (close_application), NULL );
     gtk_container_border_width( GTK_CONTAINER (window), 10 );
     gtk_widget_show( window );

     /* gdkÇÔ¼ö·Î ÇȽº¸ÊÀ» ¸¸µé±â À§ÇÑ °ÍÀÌ´Ù. */
     style = gtk_widget_get_style( window );
     pixmap = gdk_pixmap_create_from_xpm_d( window->window,  &mask,
                                            &style->bg[GTK_STATE_NORMAL],
                                            (gchar **)xpm_data );

     /* ÇȽº¸ÊÀ» ´Ù·ê pixmap widgetÀÌ´Ù. */
     pixmapwid = gtk_pixmap_new( pixmap, mask );
     gtk_widget_show( pixmapwid );

     /* pixmap widgetÀ» °¡Áö°Ô µÇ´Â ¹öÆ°ÀÌ´Ù. */
     button = gtk_button_new();
     gtk_container_add( GTK_CONTAINER(button), pixmapwid );
     gtk_container_add( GTK_CONTAINER(window), button );
     gtk_widget_show( button );

     gtk_signal_connect( GTK_OBJECT(button), "clicked",
                         GTK_SIGNAL_FUNC(button_clicked), NULL );

     /* À©µµ¸¦ º¸ÀδÙ. */
     gtk_main ();

     return 0;
 }

 ÇöÀç µð·ºÅ丮ÀÇ icon0.xpm À̶ó´Â XPM µ¥ÀÌÅÍÆÄÀÏÀ» ºÒ·¯¿À±â À§Çؼ­, ¿ì¸®´Â
ÇȽº¸ÊÀ» ¸¸µé¾î¾ß ÇÑ´Ù.

          /* ÆÄÀϷκÎÅÍ ÇȽº¸ÊÀ» ºÒ·¯¿Â´Ù. */
          pixmap = gdk_pixmap_create_from_xpm( window->window, &mask,
                                               &style->bg[GTK_STATE_NORMAL],
                                               "./icon0.xpm" );
          pixmapwid = gtk_pixmap_new( pixmap, mask );
          gtk_widget_show( pixmapwid );
          gtk_container_add( GTK_CONTAINER(window), pixmapwid );

 ÇȽº¸ÊÀ» ÀÌ¿ëÇÒ ¶§ ´ÜÁ¡ Çϳª´Â À̹ÌÁö¿¡ °ü°è¾øÀÌ ¸ðµç ´ë»óÀÌ Á÷»ç°¢Çü
À̶ó´Â °ÍÀÌ´Ù.  ¿ì¸®´Â µ¥½ºÅ©Åé°ú ¾îÇÿ¡¼­ ¾ÆÀÌÄÜÀÌ Á»´õ ÀÚ¿¬½º·¯¿î ¸ð¾çÀ»
°¡Áöµµ·Ï ÇÏ°í½Í´Ù.  ¿¹¸¦µé¾î ¾î¶² °ÔÀÓ ÀÎÅÍÆäÀ̽º¿¡¼­, ¿ì¸®´Â ´©¸¦ ¹öÆ°ÀÌ
µÕ±Ù ¸ð¾çÀ» °¡Áöµµ·Ï ÇÏ°í ½Í¾îÇÑ´Ù.  ÀÌ·¸°Ô Çϱâ À§Çؼ­´Â ƯÁ¤ÇÑ ¸ð¾çÀ» °®Ãá
À©µµ¸¦ ÀÌ¿ëÇÑ´Ù.

 Æ¯Á¤ÇÑ ¸ð¾çÀ» °®Ãá À©µµ¶õ °£´ÜÈ÷ ¹è°æÀ» ÀÌ·ç´Â Çȼ¿µéÀÌ Åõ¸íÇÑ °ÍÀ» ¸»ÇÑ´Ù.
¹è°æ À̹ÌÁö°¡ ¿©·¯ »öÀ» ¶ì°í ÀÖ´Ù¸é, ÀÌ·¸°Ô ¿ì¸®´Â ¿ì¸®ÀÇ ¾ÆÀÌÄÜÀ» µÑ·¯½Ñ
µé¾î¸ÂÁö ¾Ê´Â °æ°èÀÎ Á÷»ç°¢ÇüÀ¸·Î °ãÃÄ ±×¸®Áö ¾Ê´Â´Ù.  À̹ø ¿¹Á¦´Â ÀÌ·±
½ÄÀ¸·Î Çؼ­ µ¥½ºÅ©Åé¿¡ ¼ö·¹¹ÙÄû À̹ÌÁö¸¦ º¸¿©ÁØ´Ù.

 #include <gtk/gtk.h>

 /* XPM */
 static char * WheelbarrowFull_xpm[] = {
 "48 48 64 1",
 "       c None",
 ".      c #DF7DCF3CC71B",
 "X      c #965875D669A6",
 "o      c #71C671C671C6",
 "O      c #A699A289A699",
 "+      c #965892489658",
 "@      c #8E38410330C2",
 "#      c #D75C7DF769A6",
 "$      c #F7DECF3CC71B",
 "%      c #96588A288E38",
 "&      c #A69992489E79",
 "*      c #8E3886178E38",
 "=      c #104008200820",
 "-      c #596510401040",
 ";      c #C71B30C230C2",
 ":      c #C71B9A699658",
 ">      c #618561856185",
 ",      c #20811C712081",
 "<      c #104000000000",
 "1      c #861720812081",
 "2      c #DF7D4D344103",
 "3      c #79E769A671C6",
 "4      c #861782078617",
 "5      c #41033CF34103",
 "6      c #000000000000",
 "7      c #49241C711040",
 "8      c #492445144924",
 "9      c #082008200820",
 "0      c #69A618611861",
 "q      c #B6DA71C65144",
 "w      c #410330C238E3",
 "e      c #CF3CBAEAB6DA",
 "r      c #71C6451430C2",
 "t      c #EFBEDB6CD75C",
 "y      c #28A208200820",
 "u      c #186110401040",
 "i      c #596528A21861",
 "p      c #71C661855965",
 "a      c #A69996589658",
 "s      c #30C228A230C2",
 "d      c #BEFBA289AEBA",
 "f      c #596545145144",
 "g      c #30C230C230C2",
 "h      c #8E3882078617",
 "j      c #208118612081",
 "k      c #38E30C300820",
 "l      c #30C2208128A2",
 "z      c #38E328A238E3",
 "x      c #514438E34924",
 "c      c #618555555965",
 "v      c #30C2208130C2",
 "b      c #38E328A230C2",
 "n      c #28A228A228A2",
 "m      c #41032CB228A2",
 "M      c #104010401040",
 "N      c #492438E34103",
 "B      c #28A2208128A2",
 "V      c #A699596538E3",
 "C      c #30C21C711040",
 "Z      c #30C218611040",
 "A      c #965865955965",
 "S      c #618534D32081",
 "D      c #38E31C711040",
 "F      c #082000000820",
 "                                                ",
 "          .XoO                                  ",
 "         +@#$%o&                                ",
 "         *=-;#::o+                              ",
 "           >,<12#:34                            ",
 "             45671#:X3                          ",
 "               +89<02qwo                        ",
 "e*                >,67;ro                       ",
 "ty>                 459@>+&&                    ",
 "$2u+                  ><ipas8*                  ",
 "%$;=*                *3:.Xa.dfg>                ",
 "Oh$;ya             *3d.a8j,Xe.d3g8+             ",
 " Oh$;ka          *3d$a8lz,,xxc:.e3g54           ",
 "  Oh$;kO       *pd$%svbzz,sxxxxfX..&wn>         ",
 "   Oh$@mO    *3dthwlsslszjzxxxxxxx3:td8M4       ",
 "    Oh$@g& *3d$XNlvvvlllm,mNwxxxxxxxfa.:,B*     ",
 "     Oh$@,Od.czlllllzlmmqV@V#V@fxxxxxxxf:%j5&   ",
 "      Oh$1hd5lllslllCCZrV#r#:#2AxxxxxxxxxcdwM*  ",
 "       OXq6c.%8vvvllZZiqqApA:mq:Xxcpcxxxxxfdc9* ",
 "        2r<6gde3bllZZrVi7S@SV77A::qApxxxxxxfdcM ",
 "        :,q-6MN.dfmZZrrSS:#riirDSAX@Af5xxxxxfevo",
 "         +A26jguXtAZZZC7iDiCCrVVii7Cmmmxxxxxx%3g",
 "          *#16jszN..3DZZZZrCVSA2rZrV7Dmmwxxxx&en",
 "           p2yFvzssXe:fCZZCiiD7iiZDiDSSZwwxx8e*>",
 "           OA1<jzxwwc:$d%NDZZZZCCCZCCZZCmxxfd.B ",
 "            3206Bwxxszx%et.eaAp77m77mmmf3&eeeg* ",
 "             @26MvzxNzvlbwfpdettttttttttt.c,n&  ",
 "             *;16=lsNwwNwgsvslbwwvccc3pcfu<o    ",
 "              p;<69BvwwsszslllbBlllllllu<5+     ",
 "              OS0y6FBlvvvzvzss,u=Blllj=54       ",
 "               c1-699Blvlllllu7k96MMMg4         ",
 "               *10y8n6FjvllllB<166668           ",
 "                S-kg+>666<M<996-y6n<8*          ",
 "                p71=4 m69996kD8Z-66698&&        ",
 "                &i0ycm6n4 ogk17,0<6666g         ",
 "                 N-k-<>     >=01-kuu666>        ",
 "                 ,6ky&      &46-10ul,66,        ",
 "                 Ou0<>       o66y<ulw<66&       ",
 "                  *kk5       >66By7=xu664       ",
 "                   <<M4      466lj<Mxu66o       ",
 "                   *>>       +66uv,zN666*       ",
 "                              566,xxj669        ",
 "                              4666FF666>        ",
 "                               >966666M         ",
 "                                oM6668+         ",
 "                                  *4            ",
 "                                                ",
 "                                                "};

 /* ÀÌ°ÍÀÌ È£ÃâµÇ¸é(delete_event ½Ã±×³ÎÀ» ÅëÇØ) ¾îÇÃÀÌ Á¾·áµÈ´Ù. */
 void close_application( GtkWidget *widget, GdkEvent *event, gpointer *data )
 {
     gtk_main_quit();
 }

 int main (int argc, char *argv[])
 {
     GtkWidget *window, *pixmap, *fixed;
     GdkPixmap *gdk_pixmap;
     GdkBitmap *mask;
     GtkStyle *style;
     GdkGC *gc;

     /* mainÀ©µµ¸¦ ¸¸µé°í, ¾îÇÃÀ» ³¡³»±â À§ÇÑ delete_event ½Ã±×³ÎÀ» °Å±â¿¡
      * ¿¬°á½ÃÄÑ µÐ´Ù.  main À©µµ´Â ¿ì¸®°¡ popup¸¸ µÇµµ·Ï ¸¸µé¾ú±â ¶§¹®¿¡
      * ŸÀÌƲ¹Ù¸¦ °¡ÁöÁö ¾ÊÀ» °ÍÀÌ´Ù. */
     gtk_init (&argc, &argv);
     window = gtk_window_new( GTK_WINDOW_POPUP );
     gtk_signal_connect (GTK_OBJECT (window), "delete_event",
                         GTK_SIGNAL_FUNC (close_application), NULL);
     gtk_widget_show (window);

     /* ÇȽº¸Ê°ú pixmap widgetÀ» À§ÇÑ °ÍÀÌ´Ù. */
     style = gtk_widget_get_default_style();
     gc = style->black_gc;
     gdk_pixmap = gdk_pixmap_create_from_xpm_d( window->window, &mask,
                                              &style->bg[GTK_STATE_NORMAL],
                                              WheelbarrowFull_xpm );
     pixmap = gtk_pixmap_new( gdk_pixmap, mask );
     gtk_widget_show( pixmap );

     /* ÇȽº¸ÊÀ» º¸À̱â À§ÇØ, ¿ì¸®´Â ÇȽº¸ÊÀ» ³õ¾ÆµÑ fixed widgetÀ»
      * ÀÌ¿ëÇÑ´Ù. */
     fixed = gtk_fixed_new();
     gtk_widget_set_usize( fixed, 200, 200 );
     gtk_fixed_put( GTK_FIXED(fixed), pixmap, 0, 0 );
     gtk_container_add( GTK_CONTAINER(window), fixed );
     gtk_widget_show( fixed );

     /* ÀÌ°ÍÀº À̹ÌÁö ÀÚ½ÅÀ» Á¦¿ÜÇÑ ´Ù¸¥ ¸ðµç °ÍÀ» ÀºÆóÇÑ´Ù. */
     gtk_widget_shape_combine_mask( window, mask, 0, 0 );

     /* À©µµ¸¦ º¸ÀδÙ. */
     gtk_widget_set_uposition( window, 20, 400 );
     gtk_widget_show( window );
     gtk_main ();

     return 0;
 }

 ¼ö·¹¹ÙÄû À̹ÌÁö¸¦ ´õ ¼¶¼¼ÇÏ°Ô ¸¸µé±â À§ÇØ, ¿ì¸®´Â ¹öÆ°ÀÌ ´­·ÁÁø À̺¥Æ®ÀÇ
½Ã±×³ÎÀÌ ¼ö·¹¹ÙÄû¿¡ ¾î¶² µ¿ÀÛÀ» Çϵµ·Ï ¿«¾îÁÙ ¼ö ÀÖ´Ù.  ¿©±â º¸ÀÌ´Â ¸î ÁÙÀÇ
ÄÚµå´Â ¸¶¿ì½º¹öÆ°ÀÌ ´­·ÁÁ³À» ¶§ ¾îÇÃÀÌ ³¡³ªµµ·Ï ÇØÁØ´Ù.

      gtk_widget_set_events( window,
                             gtk_widget_get_events( window ) |
                             GDK_BUTTON_PRESS_MASK );

      gtk_signal_connect( GTK_OBJECT(window), "button_press_event",
                          GTK_SIGNAL_FUNC(close_application), NULL );

HomePage Backward Forward Post Reply List
1998 by swindler