GTK 1.x Tutorial
GTK 1.x Tutorial
1998³â 5¿ù 24ÀÏ
1998³â 5¿ù 25ÀÏ
Áö³ 2¿ù ¸»ºÎÅÍ Á¶±Ý¾¿ ¹ø¿ªÇØ º» GTK TutorialÀÔ´Ï´Ù. Ãâó´Â GTK+ÀÇ °ø½Ä
ȨÆäÀÌÁöÀÎ
http://www.gtk.org/ÀÔ´Ï´Ù. ¹ø¿ªÀ» ´ëÃæ ³¡¸¶Ä£ Áö±Ý(3/??),
ÀÌ TutorialÀº 1998/1/24 ³¯Â¥·Î ¿Ã¶ó¿Â °ÍÀÌ °¡Àå »õ·Î¿î °ÍÀ̳׿ä. ¹°·Ð ÀÌ
¹ø¿ª¹°µµ ±×°ÍÀ» ±âÁØÀ¸·Î Çß½À´Ï´Ù. ¶Ç ÀçȰ¿ë¼º(?)À» À§ÇÏ¿© óÀ½ºÎÅÍ ³¡±îÁö
ÀϹÝÀûÀÎ ÅØ½ºÆ®(plain text)ÀÇ Æ÷¸ËÀ» À¯ÁöÇß½À´Ï´Ù.
GTK+ TutorialÀº ¸ðµÎ 24°³ÀÇ Àå(Chapter)À¸·Î ÀÌ·ç¾îÁ³°í ¸¶Áö¸· ÀåÀÎ 24ÀåÀ»
ºñ·ÔÇÑ ¸î¸îÀº ¿ÀÈ÷·Á ¿ø¹®À» ±×´ë·Î Âü°íÇÏ´Â °ÍÀÌ ÁÁÀ» °ÍÀ̶ó°í ÆÇ´Ü, °ÅÀÇ
¹ø¿ªÇÏÁö ¾Ê¾Ò½À´Ï´Ù. ±×¸®°í Á¦°¡ ¹ø¿ªÇß´Ù°í ÁÖÀå(?)ÇÏ´Â ³ª¸ÓÁö Àåµéµµ, ¿ø·¡
»ó½ÄÀÌÇÏÀÇ ¿µ¾î½Ç·Â°ú ¼öÁØÀÌÇÏÀÇ Xlib/Widget Programming °æÇèÀ¸·Î ÀÎÇØ ²Ï³ª
¾îÁö·´°Ô ¾µ ¼ö¹Û¿¡ ¾ø¾ú½À´Ï´Ù. ÇÏÁö¸¸ ³ª¸§´ë·Î ½Å°æÀº ½èÀ¸´Ï±ñ, ¾Ë¾Æ¼
¹Þ¾ÆµéÀÌ½Ã±æ ¹Ù¶ø´Ï´Ù. :) ¹ø¿ªÇÑ ³»¿ëÀÇ Á¤È®¼º¿¡ ´ëÇØ¼µµ Ã¥ÀÓ ¸ø Áý´Ï´Ù.
¶ÇÇÑ ´õ È¿°úÀûÀÎ ÀÌÇØ¸¦ À§Çؼ ¿¹Á¦¸¦ Á÷Á¢ ÄÄÆÄÀÏ/½ÇÇàÇØ º¸½Ç °ÍÀ» ±ÇÇÕ´Ï´Ù.
ÀÌ Tutorial ¹ø¿ª¹®À» º¸´Â µ¥ ÀÖ¾î¼, ¾îÁö·¯¿òÀ» Á¶±ÝÀ̳ª¸¶ ´ú¾î µå¸®±â
À§ÇØ ÀüüÀûÀÎ À±°ûÀ» ¼Ò°³ÇÕ´Ï´Ù.
- ¼Ò°³
GTK(GTK+)ÀÇ ¼³°è¿Í ¼Ò°³ÀÔ´Ï´Ù. ÀÌ¹Ì ³ª¿ì ¸®µ¿(go linux) ¹ø¿ª¹°
°Ô½ÃÆÇ¿¡ ¿Ã¸° GTK+ FAQÀÌ Âü°í°¡ µÉ °ÍÀÔ´Ï´Ù.
- ½ÃÀÛÇϸé¼
GTK ¾îÇÃÀÇ ÀüÇüÀûÀÎ ±¸Á¶¿Í, ±× À¯¸íÇÑ helloworld.c ÇÁ·Î±×·¥ÀÔ´Ï´Ù.
±×¸®°í ´Ùµé °ñÄ¡¾ÆÆÄ ÇÏ´Â ÄÄÆÄÀÏ ¿É¼Çµµ °£´ÜÈ÷ ¼³¸íµÇ¾î ÀÖÁÒ. Áß¿äÇÑ ÀÌ·Ð,
Áï ½Ã±×³Î(signal)°ú ÇÔ¼ö¿¡ ´ëÇÑ Æ÷ÀÎÅÍ(callback function)¸¦ GTK°¡ ÀÌ¿ëÇÏ´Â
¹æ½Ä¿¡ ´ëÇØ¼µµ ´Ù·ì´Ï´Ù.
- ¾ÕÀ¸·Î ³ª¾Æ°¡¸ç
helloworld.c¸¦ Á¶±Ý °³¼±ÇÏ¸é¼ ÀÚ·áÇüµé¿¡ ´ëÇÑ ÀܼҸ® ÂɱÝ, ±×¸®°í
½Ã±×³Î Çڵ鷯¿¡ ´ëÇÑ º¸Ãæ¼³¸íÀÌ ÀÖ½À´Ï´Ù. ½Ã±×³Î, Áß¿äÇÑ °ÅÁÒ.
- ÆÐÅ· Widget
ÆÐÅ·(packing)À̶ó´Â Áß¿äÇÑ °³³ä¿¡ ´ëÇØ(Àúµµ Áö±ßÁö±ßÇØÁ³½À´Ï´Ù` :)
¿¹Á¦¿Í ÇÔ²² ¼³¸íÇϰí ÀÖ½À´Ï´Ù. ÆÐÅ·Àº »ç°¢ÇüÀÇ ¾î¶² ¿µ¿ª¿¡ ¹º°¡¸¦ ³Ö¾î
µÐ´Ù´Â Àǹ̷Î, GTK+ó·³ À©µµ, °´Ã¼¸¦ ´Ù·ç´Â °³¹ß¹æ½Ä¿¡¼ ±²ÀåÈ÷ ±âº»ÀûÀ̰í
"ÀÚÁÖ ³ª¿À´Â" ³ðÀÔ´Ï´Ù. ¿©±â¼´Â Çϳª¾¿ ÆÐÅ·Çϱâ À§ÇÑ ¹Ú½º(box)°³³ä°ú,
¿©·¯°³¸¦ ÇѲ¨¹ø¿¡ ÆÐÅ·Çϱâ À§ÇÑ Å×À̺í(table)°³³äÀ» Â÷·Ê´ë·Î ¼Ò°³ÇÕ´Ï´Ù.
- WidgetÀÇ °³¿ä
FAQ¿¡¼µµ ¾ð±ÞÇß°í, ÀÌ ¹®¼ÀÇ º»¹®¿¡µµ ¿©·¯¹ø °Á¶µÆÁö¸¸, GTK+Àº
C¾ð¾îÀÇ typedef struct{...} WidgetObject; °°Àº ÀÌ¿ëÀ¸·Î "°´Ã¼ÁöÇâ±â¹ý"À»
Ãß±¸Çϰí ÀÖ½À´Ï´Ù. ¹°·Ð C++¿¡¼ÀÇ public member functionÀ» Èä³»³»±â À§ÇØ
return_type (*func_pointer)(parameters,...) À¸·Î ¼±¾ðµÇ´Â callback ÇÔ¼ö¸¦
¾¹´Ï´Ù. ¿©±â¼ func_pointerÀÇ Á¤Ã¼¸¦ ¾Ë°í, ±×¸®°í Àß ½á¸ÔÀ» ¼ö ÀÖÀ» Á¤µµÀÇ
"C¾ð¾î ½Ç·Â(?)"¸¸ ÀÖ´Ù¸é GTK¸¦ °ñ·Á°¡¸ç ÀÌ±æ ¼ö ÀÖÀ» °Ì´Ï´Ù. GTK+Àº ÀÌ·¸°Ô
±×´ÙÁö ¾î·Á¿î °Ô ¾Æ´Õ´Ï´Ù. :)
ÀÌ Àå¿¡¼´Â GTK+ ObjectÀÇ ÀüºÎ³ª ´Ù¸§¾ø´Â widget¿¡ ´ëÇØ, ÀÏÁ¾ÀÇ
°ø°Ý ÀÛÀü¼³¸íÀ» ÇØÁÖ°í ÀÖ½À´Ï´Ù. ÀÌ¹Ì ´Ù¸¥ Widget Áý´ÜÀ» ½áº» °æÇè ȤÀº
ÃÖ¼ÒÇÑ Xlib¸¦ ´Ù·ïº» °æÇèÀÌ ÀÖ´Ù¸é C¾ð¾î¿¡ ´ÉÅëÇÑ °Í¸¸ÅÀ̳ª Å« µµ¿òÀÌ µÉ
°ÍÀÔ´Ï´Ù. Âü, ÀÌ Àå¿¡´Â Gtk widget objectµéÀÇ °èÃþ±¸Á¶µµ ÁÙÁÙÀÌ ¼Ò°³µÇ¾î
ÀÖ½À´Ï´Ù. ¸Å¿ì ¿ä±äÇÑ Á¤º¸ÁÒ.
- ¹öư widget
¿ì¼± Á¦ÀÏ ¸¸¸¸ÇÑ widgetÀ¸·Î ¹öưÀ» ÇØÄ¡¿ì°í ÀÖ½À´Ï´Ù. ±×³É ¹öư,
ÀÌ»Û ¹öư(ÇȽº¸ÊÀÌ ºÙÀº *), ƯÀÌÇÑ ¹öư(Åä±Û, üũ, ¶óµð¿À,..) µî ¿ì¸®°¡
À©µµ¿ë ÀÀ¿ë¾îÇõ鿡¼ ¸¹ÀÌ ÀÌ¿ëÇØ ¿Â ¸ðµç(?) Á¾·ùÀÇ ¹öưµéÀ» ÆÄÇìĨ´Ï´Ù.
- ´Ù¾çÇÑ widgetµé
ÀÚ±â È¥ÀÚ ¾²À̱⺸´Ù ´Ù¸¥ widgetÀ» ²Ù¹Ì±â À§ÇØ ¾²ÀÌ´Â °æÇâÀÌ ÀÖ´Â
¸î°¡Áö Àâ´ÙÇÑ widgetÀ» ¼Ò°³ÇÕ´Ï´Ù. ¶óº§(label), dz¼±µµ¿ò¸»(tooltip), ÁøÇà
¸·´ë(progress bar), ´ëÈ»óÀÚ(dialog box), ÇȽº¸Ê(pixmap) µîÀÔ´Ï´Ù. ƯÈ÷
ÇȽº¸Ê¿¡ ´ëÇØ¼´Â ²Ï ±æ°í ÀÚ»óÇϰÔ(?) ´Ù·ð±º¿ä.
TooltipÀ» dz¼±µµ¿ò¸»À̶ó°í ÇØ¼®ÇÑ °Ç, MacOS(ÇÑ±ÛÆÇ)¿¡¼ ±×·± °É
dz¼±µµ¿ò¸»À̶ó ºÎ¸£´Â µ¥ Àͼ÷ÇØÁ³±â ¶§¹®ÀÔ´Ï´Ù. ¶Ç´Ù¸¥ Ç¥ÇöÀº ¸ô¶ó¿ä. :)
¶Ç, °£´ÜÇϸ鼵µ °ÅÀÇ ¸ðµç ¾îÇõ鿡¼ ¿ä±äÇÏ°Ô ¾²ÀÏ ÆÄÀϼ±Åà ¹Ú½º°¡
¼Ò°³µÇ¾î ÀÖ½À´Ï´Ù. ±×³É '½¬¾î°¡´Â ÆäÀÌÁö' Á¤µµ µÉ µí Çϳ׿ä. :) ¿¹Á¦¸¦
ÄÄÆÄÀÏÇØ¼ ½ÇÇàÇØ º¸¸é, ¿Ö ³Êµµ³ªµµ ŸŶ(toolkit)À» ã´ÂÁö ¾Ë ¼ö ÀÖÀ»
°Ì´Ï´Ù.
- ÄÁÅ×ÀÌ³Ê widget
³ëÆ®ºÏ(notebook)°ú ½ºÅ©·ÑµÈ À©µµ(scrolled window)¸¦ ´Ù·ì´Ï´Ù.
À̵éÀº °á°úÀûÀ¸·Î º¸¿©Áö°Ô µÉ ´Ù¸¥ widgetµéÀ» Á¶Á÷ÀûÀ¸·Î °ü¸®ÇÏ´Â widget
µéÀÔ´Ï´Ù. À¥½áÄ¡¿£Áø(Yahoo,Altavista,..)À¸·Î ÈçÇÑ ´Ü¾î, ¿¹¸¦µé¾î "girl"À»
°Ë»öÇØº¸¸é ´Ùµé ¾Ë´Ù½ÃÇÇ ¹«Áö¸·ÁöÇÑ °¹¼öÀÇ ¸µÅ©°¡ ½ñ¾ÆÁöÁÒ? À̶§ ȸéÀ»
°ü¸®Çϱâ À§ÇØ À¥ºê¶ó¿ìÀú À©µµ´Â ½ºÅ©·ÑµË´Ï´Ù. Áï, ½ºÅ©·Ñ¹Ù(scroll bar)°¡
»ý±âÁÒ. ÇÏÁö¸¸ "girl"ÀÇ °æ¿ìó·³ ¼öõ ¼ö¸¸ °³ÀÇ ¸µÅ©¸¦ °¡Á³´Ù¸é ½ºÅ©·Ñ¹Ù
·Îµµ °¨´ç¸øÇÏÁÒ? ±×·¡¼ ±× ÆäÀÌÁöÀÇ Á¦ÀÏ ¾Æ·¡ÂÊ¿¡ ³»·Á¿Íº¸¸é Àüü ¸µÅ©¸¦
1ºÎÅÍ 20±îÁö, ±×¸®°í <´õ ÀÖÀ½(NEXT)>À̶ó´Â, ÆäÀÌÁö(page)·Î °ü¸®Çϰí ÀÖÀ½À»
¾Ë ¼ö ÀÖ½À´Ï´Ù. ÀÌ·¸°Ô ÆäÀÌÁö¸¦ °ü¸®ÇÏ´Â °Ô ³ëÆ®ºÏÀÔ´Ï´Ù.
- ¸®½ºÆ® widget
ÆÄÀϸŴÏÀú(file manager)°¡ °¡Àå ÁÁÀº ¿¹°¡ µÇ°Ú³×¿ä. M$À©µµ±×ÀÇ
Ž»ö±â(explorer)³ª TkDeskÀÇ ÆÄÀϰü¸®Ã¢À» º¸¸é, °¢ ÆÄÀÏÀÇ À̸§°ú ¼Ó¼ºµéÀ»
¾ÆÀÌÅÛ(item)À¸·Î ÇÏ´Â ¸®½ºÆ®(list)·Î ÀÌ·ç¾îÁ® ÀÖ½À´Ï´Ù. ÀÌ Àå¿¡¼ ´Ù·ç´Â
°ÍÀº ÀÌ·± ¸®½ºÆ®¸¦ ¸¸µå´Â ¹æ¹ý°ú, ¸¶¿ì½º¹öưÀÇ Á¿ìŬ¸¯À» ÀûÀýÈ÷ ³¢¿ö¸ÂÃç
¼±ÅÃ(selection)À» °ü¸®ÇÏ´Â ¹æ¹ý µîÀÔ´Ï´Ù. °£´ÜÇÑ ¿¹Á¦ ÇÁ·Î±×·¥ÀÌ ÀÖÀ¸´Ï
Âü°íÇϼ¼¿ä.
- ¸Þ´º widget
¸Þ´º(menu)¸¦ ¸¸µå´Â ¹æ¹ýÀ» ¼Ò°³Çϰí ÀÖ½À´Ï´Ù. GTK+ ¿ª½Ã ÇϳªÀÇ
ŸŶÀ̴ϱñ ³ª¸§´ë·Î ¸Þ´º Çϳª ¸¸µé¾î ÁÖ´Â ÇÔ¼ö ÂëÀº Á¦°øÇÕ´Ï´Ù. ±×¸®°í
¼¶¼¼ÇÔ¿¡¼± ¾à°£ ¶³¾îÁöÁö¸¸, ¸Þ´º¸¦ ¿Õâ ´ë·®»ý»êÇØÁÖ´Â °øÀå(factory)µµ
Á¦°øÇÕ´Ï´Ù. ¸Þ´º¿¡´Â Ç®´Ù¿î(pull-down)°ú ÆË¾÷(pop-up) µÎ°¡Áö°¡ ÀÖÁÒ.
±×¸®°í ½¬¿î ¹æ¹ý°ú "´õ" ½¬¿î ¹æ¹ý(¸Þ´º°øÀå)À» °¢°¢ ÀÌÇØÇÒ ¼ö ÀÖµµ·Ï µÎ
¿¹Á¦ ÇÁ·Î±×·¥ÀÌ ¼Ò°³µÇ¾ú½À´Ï´Ù.
- ÅØ½ºÆ® widget
¸¹Àº ¾çÀÇ ÅØ½ºÆ®¸¦ ´Ù·ê ¶§ Æí¸®ÇÑ ÅØ½ºÆ® widget¿¡ °üÇØ ¼³¸íÇϰí ÀÖ½À´Ï´Ù.
ÀÌ widgetÀº ÀÏ¹Ý ÅØ½ºÆ® ¿¡µðÅͳª ºä¾î¿Í ºñ½ÁÇÑ ±â´ÉÀ» °®°í ÀÖ½À´Ï´Ù.
- ¹®¼ÈµÇÁö ¾ÊÀº widgetµé
'ÀÌ·± °Íµé¿¡ ´ëÇØ¼´Â ¾ÆÁ÷ Æ©Å丮¾óÀÌ ¾øÀ¸´Ï ´ç½ÅÀÌ ÇÑ ¹ø
¸¸µé¾î ºÁ!' -> ÀÌ·¯´Â±º¿ä. :) ´©°¡ º»º¸±â·Î Preview¶ó´Â widget¿¡ ´ëÇØ
½á³ù´Ù¸ç ±× ¹®¼¸¦ ÀοëÇß´õ±º¿ä. ÇÏÁö¸¸ Àü ±× ºÎºÐÀ» °ú°¨È÷(?!) »èÁ¦Çϰí
ÀÌ Àå Àüü¸¦ ºñ¿öµ×½À´Ï´Ù. (ÁË¼Û *)
www.gtk.org¿¡ ÀÖ´Â ¿ø¹®À» Âü°íÇϼ¼¿ä.
- À̺¥Æ®¹Ú½º widget
gtk+970916.tar.gz ÀÌÈÄÀÇ ¹èÆ÷º»¿¡¼¸¸ Áö¿øÇÏ´Â widgetÀ̶ó´Â±º¿ä.
¸Þ´ºµµ ¾Æ´Ï°í ¹öưµµ ¾Æ´Ï°í, ¾î·µç °á°úÀûÀ¸·Î À¯¿ëÇϰÔ(?) ¾²Àδٳ׿ä. :)
- WidgetÀÇ ¼Ó¼ºÀ» ¼¼ÆÃÇϱâ
Á¦¸ñÀº ±×·²µíÇÏÁö¸¸, ½ÇÁ¦·Î ÀÌ ÀåÀ» ¿¾îº¸´Ï ÇÔ¼ö¿øÇü(prototype)
¸î °³ »ÓÀÌ´õ±º¿ä. ÇÏÁö¸¸ GTK+¿¡¼µµ ¿ª½Ã ±ä ÇÔ¼öÀ̸§Àº ±× ÀÚü°¡ ¼³¸íÀÔ
´Ï´Ù. ù ºÎºÐ¿¡ ¹«½¼ ÀܼҸ®°¡ ÀÖ´øµ¥, ±×³É ÀÖ´Â ±×´ë·Î ÇØ¼®ÇØ µ×½À´Ï´Ù.
°¢ widget objectµéÀÇ ¼Ó¼º(property)À» °ü¸®Çϱâ À§ÇÑ ÇÔ¼öµéÀÔ´Ï´Ù.
- ŸÀӾƿô, ±×¸®°í I/O¿Í Idle ÇÔ¼öµé
ÁÖ¾îÁø ½Ã°£(milliseconds)¸¶´Ù È£ÃâµÇ´Â ÇÔ¼ö, ±×³É ´ë±âÇÏ´Â ÇÔ¼ö,
µ¥ÀÌÅÍÀÇ À̵¿À» °¨½ÃÇÏ´Â(monitoring) ÇÔ¼ö µîÀÌ ¼Ò°³µÇ¾î ÀÖ½À´Ï´Ù. ¿¹Á¦´Â
¾øÁö¸¸ ´ëÃæ º¸¸é °¨ÀÌ ÀâÈú °Ì´Ï´Ù. ^^;
- Selection °ü¸®Çϱâ
´ëºÎºÐÀÇ Å͹̳ÎÀ̳ª ¿¡µðÅÍ(editor)´Â ¸¶¿ì½º·Î º»¹®À» Âï ±ÜÀ¸¸é
±× ¼±ÅÃµÈ ¿µ¿ªÀÌ ¹ÝÀüµÇ°í, ¸Þ´º¿¡¼ ±× ¿µ¿ª¿¡ ´ëÇØ Ä«ÇÇ(copy), ÄÆ(cut),
ÆäÀ̽ºÆ®(paste) µîÀÇ ÀÛ¾÷À» ÇÒ ¼ö ÀÖ½À´Ï´Ù. ±×·±µ¥ ¾î¶² ¿¡µðÅÍ¿¡¼ ¹º°¡
±Ü¾î³õ°í °ð¹Ù·Î ´Ù¸¥ ¿¡µðÅÍÀÇ ¶Ç ÇÑ ¿µ¿ªÀ» ±ÜÀ¸¸é º¸Åë ¾î¶»°Ô µÇ´ø°¡¿ä?
Á¦°¡ ±â¾ïÇÏ´Â °ÅÀÇ ¸ðµç ¾îÇÃÀÇ °æ¿ì, ¸ÕÀú ±Ü¾ú´ø ³»¿ëÀº '¹«½Ã'µÇ´õ±º¿ä.
ÀÌ·± ¹®Á¦¸¦ selectionÀÌ °ü¸®ÇÕ´Ï´Ù. ±²ÀåÈ÷ ¾î·Á¿î ´Ü¾îµµ ÀÖ°í ÇØ¼, °Ü¿ì
¹ø¿ªÇß½À´Ï´Ù. (¿ø¹®Àº ²Ï ÀоîÁÙ ¸¸ Çߴµ¥, Á¦°¡ ¹ø¿ªÇÑ °Ç ³ªµµ ÀбⰡ
½È³×¿ä. :)
- glib
GTK+ FAQ¿¡¼µµ °£´ÜÈ÷ ¹àÇûÁö¸¸, GTK+´Â ±âÁ¸ÀÇ libc°¡ ¾Æ´Ñ, glib¸¦
ÀÌ¿ëÇÕ´Ï´Ù. ´çÀå °¢ Ç÷§Æû¿¡¼ ÀÌ »õ·Î¿î ¹öÀüÀÇ C ¶óÀ̺귯¸®¸¦ ¼³Ä¡Çؾß
ÇÒ »Ó¸¸ ¾Æ´Ï¶ó, ¸î°¡Áö Ç¥ÁØÇÔ¼öµéÀÌ glib¿¡¼ ¾î¶»°Ô º¯Çß´ÂÁö ´ëÃæ ¾Ë¾Æ³ö¾ß
ÇϰÚÁÒ. (ÀϹÝÀûÀÎ »ç¿ëÀÚ ÀÔÀå¿¡¼´Â º°·Î º¯ÇÑ °Ô ¾ø½À´Ï´Ù, ¿ø·¡ printf°¡
g_print·Î ¹Ù²ï ½ÄÀ̴ϱñ¿ä. ;)
ÀÌ Àå¿¡¼´Â ±âÁ¸ÀÇ libc¿¡¼´Â Á¦°øÇÏÁö ¾Ê´Â »õ·Î¿î °ÍµéÀ» À§ÁÖ·Î,
°£´ÜÇÑ ¼³¸íÀ» Çϰí ÀÖ½À´Ï´Ù. °¢ ÀÚ·áÇü¸¶´ÙÀÇ ±ØÇѰª(extrema)°ú, ¾ÆÅ°ÅØÃÄ
(architecture)¿¡ °ü°è¾øÀÌ typedefµÈ ÁÖ¿ä ÀÚ·áÇü(data type)µé, ±×¸®°í ¸»ÀÌ
³ª¿Â ±è¿¡ ÁÙÁÙÀÌ ¿¬°á¸®½ºÆ®(linked list)µµ ¼Ò°³ÇØ ³ù±º¿ä. ±âÁ¸ÀÇ ¸Þ¸ð¸®
°ü¸® ÇÔ¼ö ´ë½Å ¾²¶ó¸é¼ g_malloc/g_free¸¦ ºñ·ÔÇÑ, glibÆÇÀÇ ¸Þ¸ð¸®ÇÔ¼öµéµµ
ÀÖÀ¸¸ç, ½Ã½ºÅÛ Å¸À̸Ó(timer)ÇÔ¼ö, ¹®ÀÚ¿(string)ÇÔ¼ö±îÁö Àֳ׿ä. ±×¸®°í
³¡À¸·Î À¯Æ¿¸®Æ¼ ¹× ¿¡·¯ÇÔ¼öµéÀ» ¼Ò°³Çß½À´Ï´Ù.
- GTKÀÇ rc ÆÄÀÏ
À¯´Ð½º °è¿ÀÇ ¿î¿µÃ¼Á¦¸¦ ÀÌ¿ëÇÏ´Â ºÐÀ̶ó¸é ²Þ¿¡¼µµ ÀÌ rcÆÄÀÏÀ»
ÆíÁýÇÏÁö³ª ¾ÊÀ»Áö ¸ð¸£°Ú³×¿ä. ^^; ÀÌ Àå¿¡¼´Â ¿ì¸®°¡ Àͼ÷ÇØÁø ¾îÇõéó·³,
¶È°°Àº ¹ÙÀ̳ʸ®(binary,executable)¸¦ °¢ »ç¿ëÀÚÀÇ ÀÔ¸À¿¡ ¸Â°Ô 'ȯ°æ¼³Á¤'À»
ÇØ¼ ÀÌ¿ëÇÒ ¼ö ÀÖ°Ô ÇÏ´Â °É ¼Ò°³ÇÕ´Ï´Ù. GTK+ÀÇ rcÆÄÀÏÀº ´Ù¸¥ ´ëºÎºÐÀÇ X¿ë
¾îÇõé°ú ºñ½ÁÇÑ, Àϰü¼º ÀÖ´Â ½Éº¼(simbol)À» ÀÌ¿ëÇÕ´Ï´Ù. ¸¶Áö¸· ºÎºÐ¿¡
¿¹Á¦ rcÆÄÀÏÀÌ ÀÖÀ¸´Ï Âü°íÇϼ¼¿ä.
- ÀڽŸ¸ÀÇ widget ¸¸µé±â
ÀÌ ÀåÀÇ ³»¿ëÀº "Creating Your Own Widgets", Áï "ÀڽŸ¸ÀÇ widget ¸¸µé±â"
ÀÔ´Ï´Ù. ½ÇÁ¦ ÇÏ´Â ¿ªÇÒµµ ±×·¸Áö¸¸ À̸§µµ Tictactoe¶ó´Â widgetÀ» ÀÌ·¸°Ô
Àú·¸°Ô ¸¸µé¾î °¡´Â °úÁ¤¿¡¼ ¿©·¯°¡Áö ÁÖÀDz¨¸®/Âü°í²¨¸®¸¦ ´Ã¾î³õ¾Ò½À´Ï´Ù.
WidgetÀ» ¸¸µç´Ù´Â °Ç ÀÌ¹Ì ÀÖ´Â widgetÀ» ÀÌ¿ëÇÏ´Â °Í°ú´Â ¶Ç´Ù¸¥
°³³äÀ¸·Î, ¸î°¡Áö Áý°í ³Ñ¾î°¥ °ÍÀÌ ÀÖ½À´Ï´Ù. ¿ì¼±, ÁøÂ¥ ÇãÇã¹úÆÇ¿¡¼ ½ÃÀÛ
ÇÏ´Â °Ô ¾Æ´Ï¶ó "¾îµð¼ »ó¼Ó"¹ÞÀ» °ÍÀÎÁö¸¦, Áï ±×ÀÇ parent class¸¦ ¼±ÅÃÇØ¾ß
ÇÕ´Ï´Ù. ±×¸®°í ÀÌ widgetÀÌ Ã³¸®ÇؾßÇÒ ½Ã±×³Î°ú À̺¥Æ®¿¡ ´ëÇØ¼µµ ¸ñÀû¿¡
¸Â°Ô "Àß" ¼³Á¤ÇؾßÁÒ. ±×¸®°í ÀÌ ÀåÀÇ ¸¶Áö¸·¿¡¼´Â, ÀÌ·¸°Ô ¾Ö½á(?) ¸¸µç
widgetµéÀÇ ¾î¼³Ç ¹®Á¦Á¡µéÀ» ÁöÀûÇϰí, ±× ÇØ°á¹æÇâÀ» Á¦½ÃÇϰí ÀÖ±º¿ä.
- ³«¼Àå, °£´ÜÇÑ ±×¸®±â ¿¹Á¦
»ó´çÈ÷ ¹æ´ëÇϰí Àâ´ÙÇÑ(?) ³»¿ëÀ» ´Ù·ç´Â ÀåÀÔ´Ï´Ù. GIMPó·³, ÁøÂ¥
±×¸²À» ´Ù·ç±â À§Çؼ ¾Ë¾Æ¾ß ÇÒ °ÍµéÀ̶ó°í Çϴ±º¿ä.
¸ÕÀú ¸¶¿ì½º¿Í Űº¸µåÀÇ ¹Ì¹¦ÇÑ Àú¼öÁØ À̺¥Æ®(low-level event)¸¦
´Ù·ç°í ÀÖ½À´Ï´Ù. Xlib¿¡¼ Á¢ÇÒ ¼ö ÀÖµíÀÌ ¿©·¯ #define »ó¼öµéÀ» ºñÆ®¿¬»ê
(bitwise operation)½ÃŰ´Â °ÅÁÒ. ÀÌ »ó¼öµéÀº Űº¸µå¿Í ¸¶¿ì½º¿¡¼ ÀϾ´Â
¿©·¯°¡Áö À̺¥Æ®µéÀ» ¼¶¼¼ÇÏ°Ô ±¸º°Çϱâ À§ÇÑ °ÍÀ̰ÚÁÒ? µÚ¸¦ ÀÕ´Â ³ðµéÀº
³«¼¸¦ ÇÒ µµÈÁö¸¦ °ü¸®ÇÏ´Â ¹æ¹ýÀÔ´Ï´Ù. ´ëºÎºÐÀÇ widget°ú ÇÔ¼öµéÀº GTKÀÇ
º£À̽º(base)¸¦ ÀÌ·ç´Â GDK(General Drawing Kits) ¶óÀ̺귯¸®¿¡¼ ¿Â °Íµé
ÀÔ´Ï´Ù. À©µµ¿¡ Á÷Á¢ ±×¸®´Â °Íº¸´Ù, ÇȽº¸ÊÀ̶ó´Â °¡»óÀÇ µµÈÁö¿¡ ±×·Á³õ°í
±× ³»¿ëÀ» ÇÊ¿äÇÒ ¶§ À©µµ·Î º¹»çÇØ ÁÖ´Â ¹æ½ÄÀ» ¾²ÁÒ, Xlib¿¡¼Ã³·³.
´ÙÀ½¿£ ÇȽº¸Ê¿¡ ±×¸²À» ±×¸®´Â µµ±¸µé¿¡ ´ëÇØ ÀܼҸ®°¡ À̾îÁý´Ï´Ù.
Xlib¿¡¼ GC(Graphics Context)¶õ ³ðÀ» ±¸°æÇØ ºÃ´Ù¸é ´õ ½±°Ô ÀÌÇØÇÒ ¼ö ÀÖÀ»
°Ì´Ï´Ù. ¿¹¸¦µé¾î »ç°¢ÇüÀ» Çϳª ±×¸®´Â µµ±¸´Â gdk_draw_rectangle()À̶õ ³ð
Àε¥, »ç°¢ÇüÀ» ÀÌ·ç´Â ¼±ÀÇ ±½±â, »ö±ò, Á¾·ù(½Ç¼±/Á¡¼±/¼â¼±) µî ±âº»ÀûÀÎ
¼Ó¼ºµéÀ» GC¿¡ ÀúÀåÇØ ³õ°í, ½ÇÁ¦·Î ±×¸± ¶§´Â gdk_draw_rectangleÀ̶õ ÇÔ¼öÀÇ
ÀÎÀڷμ ÇØ´çÇÏ´Â ¼Ó¼ºÀ» °¡Áö°í ÀÖ´Â GC¸¦ ³Ñ°ÜÁÝ´Ï´Ù. ¹°·Ð GTK+´Â ÃæºÐÈ÷
°´Ã¼ÁöÇâÀûÀ̱⠶§¹®¿¡ ±âº»¸¸ ÀÌÇØÇÑ´Ù¸é Xlib¿¡¼º¸´Ù ´õ Á÷°üÀûÀ¸·Î Áñ±æ ¼ö
ÀÖÀ» °Ì´Ï´Ù.
¾ÆÁ÷ ³¡³ªÁö ¾Ê¾Ò±º¿ä! -_-; ÀÌ Àå¿¡¼´Â ´õ ¼¶¼¼ÇÑ ±×¸²À» ±×¸®±â
À§ÇØ ¸¶¿ì½ºº¸´Ù ´õ ÁÁÀº(´õ ºñ½Ñ?) ÀÔ·ÂÀåÄ¡¸¦ ÀÌ¿ëÇÒ °ÍÀ», Àº±ÙÈ÷ ºÎÃß±â°í
ÀÖ½À´Ï´Ù. Drawing tablet°°Àº, Ư¼öÇÑ ÀÔ·ÂÀåÄ¡¿¡¼ ¹ß»ýÇÏ´Â ¶Ç´Ù¸¥ À̺¥Æ®
µéÀ» ´Ù·ç±â À§ÇØ È®ÀåÀ̺¥Æ®(extended event)¸¦ Á¦°øÇÑ´Ù°í Çϳ׿ä. ¸¶¿ì½º
¿¡¼ ¹ß»ýÇÏ´Â ¸î°¡Áö À̺¥Æ®¸¸À¸·Îµµ ¸Ó¸®°¡ ¾ÆÇµ¥ ¸»ÀÔ´Ï´Ù. :) ¾î·µç
ÀÌ ÀåÀÇ ¸¶Áö¸·¿¡¼´Â, ¸¶¿ì½ºº¸´Ù ´õ ÁÁÀº ÀåÄ¡(device)ÀÇ ±â´ÉÀ» ÀÌ¿ëÇÏ´Â
¹æ¹ý¿¡ ´ëÇØ À̾߱âÇϰí ÀÖ½À´Ï´Ù.
- GTK ¾îÇÃÀ» °³¹ßÇÏ´Â ÆÁ
³Ê¹« Áß¿äÇÑ ³»¿ëÀ̶ó ²À Á÷Á¢ º¸¶ó°í¹Û¿¡´Â ¸»ÇÒ ¼ö ¾ø³×¿ä. ;)
- Contributing
¿ª½Ã ¸Å¿ì Áß¿äÇÑ °Ì´Ï´Ù.
- Credits
ÀÌ ¹®¼¸¦ Á¦ÀÛÇÏ´Â µ¥ µµ¿òÀÌ µÈ »ç¶÷µé¿¡°Ô °¨»çÀÇ ¸»À» ÀüÇÏ´Â,
¿ª½Ã ¾ÆÁÖ Áß¿äÇÑ ÀåÀÔ´Ï´Ù. ÀϺΠ¿ø¹®À» ±×´ë·Î µ×½À´Ï´Ù.
- Tutorial Copyright and Permissions Notice
GPL¿¡ ÀÇÇÑ ¸ðµç ¹®¼¿¡¼ º¼ ¼ö ÀÖ´Â, Á¤¸» Áß¿äÇÑ ±ÛÀÔ´Ï´Ù.
ÀϺη¯ ¿ø¹®À» ±×´ë·Î ³öµ×½À´Ï´Ù.
Á¦°¡ 3¿ù 26ÀÏ¿¡ ÀԴ븦 ÇÏ´Â °ü°è·Î
liberta@zeus.phys.cau.ac.kr, ±×¸®°í
liberta@cau.ac.kr ·Î ¸ÞÀÏÀ»
º¸³»¼Åµµ ´äÀÌ ¾øÀ» °Ì´Ï´Ù. :)
ÀÌ ¹®¼¿¡ ´ëÇÑ Ãß°¡¿Í ¼öÁ¤, ±×¸®°í ¾î¶² °÷À¸·ÎÀÇ ¾÷·Îµå µîÀº
ÀüÀûÀ¸·Î Àڽſ¡°Ô ´Þ·Á ÀÖ½À´Ï´Ù. ±×·³ GTK+°ú ÇÔ²² Áñ°Å¿î ¿©ÇàÀ»
ÇÏ½Ã±æ ¹Ù¶ø´Ï´Ù. :)
(¼ÁÖÅ´ÔÀÌ ¹ø¿ªÇϽŠÀÌ ¹®¼¸¦ ÇÑÁöÈ£°¡ ´Ù½Ã ÀÏ¹Ý text¿¡¼ SGML ÇüÅ·Π¹Ù²Ù°í
ÃֽŠ¿ø¹®ÀÎ 5¿ù 24ÀÏÀÚ TutorialÀ» ÂüÁ¶Çؼ ´Þ¶óÁø ºÎºÐÀ» º¸ÅÂ¾î ¼öÁ¤Çß½À´Ï´Ù.
ÀÌ ¹®¼¸¦ ÀÐÀ¸½Ã´Ù°¡ °©Àڱ⠹ø¿ªÀÌ ¿¾ÇÇØÁ³´Ù°í ´À³¢½Ã´Â ºÎºÐÀÌ ÀÖ´Ù¸é ¾Æ¸¶
±× ºÎºÐÀº ÇÑÁöÈ£°¡ »õ·Î ¹ø¿ªÇؼ Ãß°¡ÇÑ °÷Àϰ̴ϴÙ. ^^;
ÀÌ ±ä ¹®¼¸¦ ¹ø¿ªÇÏ¿© ÁֽôÀ¶ó ¼ö°íÇϽмÁÖÅ´Բ² °¨»çµå¸³´Ï´Ù.
Ȥ½Ã À߸ø ¹ø¿ªµÈ °÷À̳ª ½Ç¼ö, ¿ÀÀÚ¸¦ ¹ß°ßÇϽŠºÐÀº
hanjiho@penta.co.kr·Î
¸ÞÀÏÀ» º¸³»ÁÖ½Ã¸é ¹«Ã´ °í¸¿°Ú½À´Ï´Ù. ¼ÁÖÅÂ´Ô ¸»¾¸´ë·Î GTK+¿Í Áñ°Å¿î ¿©ÇàÀ»
ÇÏ½Ã±æ ¹Ù¶ø´Ï´Ù.)
GTK(GIMP Toolkit)Àº ¿ø·¡ GIMP(General Image Manipulation Program)À» ¸¸µé±â
À§ÇÑ ÅøÅ¶À¸·Î °³¹ßµÇ¾ú´Ù. GTK´Â XlibÀÇ ÇÔ¼öµé¿¡ ´ëÇÑ ±âº»ÀûÀÎ wrapperÀÎ
GDK(GIMP Drawing Kit)¸¦ ±â¹ÝÀ¸·Î Çϰí ÀÖ´Ù. ¿ø·¡ GIMP¸¦ ¸¸µé ¸ñÀûÀ¸·Î
°³¹ßµÇ¾úÁö¸¸, Áö±ÝÀº ¸î °¡Áö ÇÁ¸® ¼ÒÇÁÆ®¿þ¾îÀÇ Á¦ÀÛ¿¡ ¾²ÀÌ°Ô µÇ¾ú´Ù. GTKÀÇ
Á¦ÀÛÀÚµéÀº ´ÙÀ½°ú °°´Ù.
GTK´Â º»ÁúÀûÀ¸·Î °´Ã¼ÁöÇâÀûÀÎ ¾îÇà °³¹ßÀÚ È¯°æÀÌ´Ù(API, Application
Programmers Interface). ºñ·Ï ¿ÏÀüÈ÷ C·Î ¾²¿©Á³Áö¸¸ Ŭ·¡½ºÀÇ °³³ä°ú callback
ÇÔ¼ö(ÇÔ¼ö¿¡ ´ëÇÑ Æ÷ÀÎÅÍ)°¡ °®Ãß¾îÁø °ÍÀÌ´Ù.
¿©±â¿¡´Â ¿¬°á¸®½ºÆ®(linked list)¸¦ ´Ù·ç±â
À§ÇÑ ¸î °¡Áö ÇÔ¼öµé°ú ÇÔ²², glib¶ó°í ºÒ¸®¿ì¸ç ¸î °¡Áö Ç¥ÁØÇÔ¼öµéÀ» ´ëÄ¡ÇÒ ¼ö
ÀÖ´Â ÇÔ¼öµéµµ ¼¼¹øÂ° ¿ä¼Ò·Î Æ÷ÇԵǾî ÀÖ´Ù. g_strerror()ó·³, ¿©±â ¾²ÀÎ ¾î¶²
ÇÔ¼öµéÀº ´Ù¸¥ À¯´Ð½ºµé¿¡ ´ëÇØ Ç¥ÁØÀÌ ¾Æ´Ï°Å³ª ¾²¿©Áú ¼ö ¾ø´Â °ÍÀ̱⠶§¹®¿¡,
GTKÀÇ À̽ļºÀ» ³ôÀ̱â À§ÇØ ¿©±â¿¡ ´ëÇÑ ´ëÄ¡ÇÔ¼öµéµµ ¾²¿´´Ù. ¶ÇÇÑ g_mallocÀÌ
µð¹ö±ë ±â´ÉÀ» °ÈÇßµíÀÌ libcÀÇ ¹öÀü¿¡ º¸°ÀÌ ÀÌ·ç¾îÁö±âµµ Çß´Ù.
ÀÌ ¹®¼´Â ´ÜÁö GTK¸¦ À§ÇÑ Âü°í°¡ µÉ »ÓÀ̸ç, ¿ÏÀüÇÑ °ÍÀ» ÀǹÌÇÏÁö ¾Ê´Â´Ù.
µ¶ÀÚ´Â C¾ð¾î¸¦ Àß ¾Ë¸ç CÇÁ·Î±×·¥À» ¾î¶»°Ô ¸¸µå´ÂÁö ¾Ë°í ÀÖÀ» °ÍÀ̶ó°í °¡Á¤
ÇÑ´Ù. ²À ÇÊ¿äÇÑ °ÍÀº ¾Æ´Ï°ÚÁö¸¸, µ¶ÀÚ°¡ ÀÌ¹Ì X ÇÁ·Î±×·¥¿¡ ´ëÇÑ °æÇèÀÌ
ÀÖ´Ù¸é ¸Å¿ì Å« µµ¿òÀÌ µÉ °ÍÀÌ´Ù. ¸¸¾à ´ç½ÅÀÌ widget ¼¼Æ®¿¡ ´ëÇØ GTK°¡ óÀ½
Á¢ÇÑ °ÍÀ̶ó¸é, ÀÌ ¹®¼¸¦ ¾î¶»°Ô ¹ß°ßÇÏ°Ô µÇ¾ú°í ¶Ç Ưº°È÷ Èûµç ºÎºÐÀº ¾î¶²
°ÍÀ̶ó´Â °ÍÀ» ²À ¾Ë·ÁÁֱ⠹ٶõ´Ù. GTK¸¦ À§ÇØ C++ÀÇ Çü½Ä¿¡ µû¸¥ APIµµ ÀÖ´Ù´Â
°ÍÀ» ÂüÁ¶ÇÒ °ÍÀ̸ç, ¸¸¾à C++À» ´õ ¼±È£ÇÑ´Ù¸é ÀÌ°Í ´ë½Å¿¡ ±×°É ¼±ÅÃÇϱâ
¹Ù¶õ´Ù. ¶ÇÇÑ Objective C, Guile°úÀÇ ¹ÙÀεùµµ ÀÖÁö¸¸, ¾î·µç ¿©±â¼´Â
±×°ÍµéÀ» µû¸£Áö ¾Ê°Ú´Ù.
´ç½ÅÀÌ ÀÌ ¹®¼¸¦ ÅëÇØ GTK¸¦ °øºÎÇÏ´Â µ¥ ÀÖ¾î¼ ¾î¶² ¹®Á¦¶óµµ ³ª¿¡°Ô ¾Ë·Á
Áֱ⠹ٶó¸ç, ±×°ÍÀº ÀÌ ¹®¼°¡ Çâ»óµÇ´Â °Í¿¡ Å« µµ¿òÀÌ µÉ °ÍÀ̶ó°í »ý°¢ÇÑ´Ù.
¸ÕÀú ÇÒ ÀÏÀº ¹°·Ð GTKÀÇ ¼Ò½º¸¦ ¹Þ¾Æ¼ ±×°ÍÀ» ¼³Ä¡ÇÏ´Â °ÍÀÌ´Ù. ¾ðÁ¦³ª
°¡Àå ÃֽйöÀüÀ» ftp.gtk.orgÀÇ /pub/gtk¿¡¼ °¡Á®¿Ã ¼ö ÀÖ´Ù. GTK¿¡ ´ëÇÑ
¶Ç´Ù¸¥ ¼Ò½ºµéÀº
http://www.gtk.org/¿¡ ÀÖ´Ù.
GTK´Â GNU autoconf¸¦
ÀÌ¿ëÇÑ´Ù. ÀÏ´Ü ¾ÐÃàÀ» Ǭ ´ÙÀ½¿¡, ./configure --help¸¦ Ãļ ¿É¼ÇµéÀ» »ìÆì
º¸±â ¹Ù¶õ´Ù.
GTK¿¡ ´ëÇÑ ¼Ò°³¸¦ À§Çؼ, °¡´ÉÇÑ ÇÑ °£´ÜÇÑ ÇÁ·Î±×·¥ºÎÅÍ ½ÃÀÛÇØ º¸ÀÚ. ÀÌ
ÇÁ·Î±×·¥Àº 200x200 Çȼ¿ÀÇ À©µµ¸¦ ¸¸µå´Â °ÍÀ¸·Î, ½©À» ÀÌ¿ëÇÏÁö ¾Ê°í´Â ³¡³¾
¼ö ¾ø´Â ÇÁ·Î±×·¥ÀÌ´Ù.
#include <gtk/gtk.h>
int main (int argc, char *argv[])
{
GtkWidget *window;
gtk_init (&argc, &argv);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_widget_show (window);
gtk_main ();
return 0;
}
¸ðµç ÇÁ·Î±×·¥Àº ¹°·Ð GTK ¾îÇÿ¡ ¾²ÀÏ º¯¼ö, ÇÔ¼ö, ±¸Á¶Ã¼ µîÀÌ ¼±¾ðµÇ¾î ÀÖ´Â
gtk/gtk.h¸¦ Æ÷ÇÔÇÒ °ÍÀÌ´Ù.
gtk_init (&argc, &argv);
GTK·Î ¾²¿©Áö´Â ´Ù¸¥ ¸ðµç ÇÁ·Î±×·¥¿¡¼ ºÎ¸£°Ô µÇ´Â ÇÔ¼öÀÎ gtk_init(gint
*argc, gchar ***argv) ¸¦ ºÎ¸£°í ÀÖ´Ù. À̰ÍÀº µðÆúÆ®·Î ¾µ ºñÁÖ¾ó°ú Ä®¶ó¸Ê
µî ¸î°¡Áö¸¦ ¼¼ÆÃÇÏ¸ç ±× ÀÌÈÄ gdk_init(gint *argc, gchar ***argv)·Î ³Ñ¾î°£´Ù.
ÀÌ ÇÔ¼ö´Â ¾²ÀÏ ¶óÀ̺귯¸®¸¦ ÃʱâÈ Çϰí, µðÆúÆ®·Î ½Ã±×³Î Çڵ鷯¸¦ ¼Â¾÷Çϸç,
¸í·ÉÇàÀ» ÅëÇØ ÇÁ·Î±×·¥¿¡ ÀüÇØÁø ÀÎÀÚµé Áß ¾Æ·¡ÀÇ °ÍµéÀ» ã¾Æ üũÇÑ´Ù.
-
--display
-
--debug-level
-
--no-xshm
-
--sync
-
--show-events
-
--no-show-events
´ç½ÅÀÇ ¾îÇÃÀÌ ÀνÄÇÏÁö ¾ÊÀ» °ÍµéÀ» ³²°ÜµÎ°í, À§ÀÇ °ÍµéÀ» ÀÎÀÚÀÇ ¸®½ºÆ®¿¡¼
Á¦°ÅÇÑ´Ù. À̰ÍÀº ¸ðµç GTK ¾îÇÿ¡¼ »ý·«ÇÒ Ç¥ÁØÀûÀÎ ÀÎÀÚµéÀÇ ¼¼Æ®¸¦ ¸¸µç´Ù.
´ÙÀ½ÀÇ µÎ ÁÙ¿¡¼´Â À©µµ¸¦ ¸¸µé°í º¸¿©ÁØ´Ù.
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_widget_show (window);
GTK_WINDOW_TOPLEVELÀ̶õ ÀÎÀÚ´Â À©µµ ¸Å´ÏÀúÀÇ Àå½Ä°ú À§Ä¡¼³Á¤¿¡ µû¸£°Ô
ÇÑ´Ù. 0x0 Å©±âÀÇ À©µµ¸¦ ¸¸µéÁö ¾Ê°í, child°¡ ¾ø´Â À©µµ´Â µðÆúÆ®·Î 200x200
Å©±â·Î ¸¸µé¾îÁ®¼ ¿ì¸®´Â ±×°ÍÀ» ¸¶À½²¯ ´Ù·ê ¼ö ÀÖ´Ù.
gtk_widget_show() ÇÔ¼ö´Â ÀÌ widgetÀÇ ¼Ó¼º¿¡ ´ëÇÑ ¼¼ÆÃÀÌ ³¡³µÀ½À» GTK¿¡
¾Ë·ÁÁÖ´Â °ÍÀ̰í, ±×·¡¼ ±× widgetÀº º¸¿©Áö°Ô µÈ´Ù.
¸¶Áö¸· ÁÙÀº GTKÀÇ ÁÖ Ã³¸® ·çÇÁ¿¡ µé¾î°¡´Â °ÍÀÌ´Ù.
gtk_main ();
gtk_main()Àº GTK ¾îÇà Àü¹ÝÀûÀ¸·Î º¼ ¼ö ÀÖ´Â ¶Ç ÇϳªÀÇ ÇÔ¼öÈ£ÃâÀÌ´Ù.
ÇÁ·Î±×·¥ÀÌ ¿©±â¿¡ À̸£¸é, GTK´Â X À̺¥Æ®, ŸÀӾƿô, ¶Ç´Â ÆÄÀÏ ÀÔÃâ·Â °¨Áö
µîÀ» ±â´Ù¸®¸ç ´ë±âÇÏ°Ô µÈ´Ù. ±×·¯³ª ÀÌ °£´ÜÇÑ ÇÁ·Î±×·¥¿¡¼´Â ±×·± °ÍµéÀÌ
¹«½ÃµÇ°í ÀÖ´Ù.
3.1 GTK¿¡¼ÀÇ Hello World ÇÁ·Î±×·¥
ÀÌÁ¦ ÇϳªÀÇ widget(¹öư)À» À§ÇÑ ÇÁ·Î±×·¥ÀÌ´Ù, ±× À¯¸íÇÑ hello world¸¦
GTK·Î½á ±¸ÇöÇØ º¸ÀÚ.
/* helloworld.c */
#include <gtk/gtk.h>
/* À̰ÍÀº callbackÇÔ¼ö´Ù. ¿©±â¼´Â µ¥ÀÌÅÍÀÎÀÚµéÀÌ ¹«½ÃµÇ¾ú´Ù. */
void hello (GtkWidget *widget, gpointer data)
{
g_print ("Hello World\n");
}
gint delete_event(GtkWidget *widget, GdkEvent *event, gpointer data)
{
g_print ("delete event occured\n");
/* "delete_event"¶ó´Â ½Ã±×³ÎÇڵ鷯¿¡¼ TRUE¸¦ ¸®ÅÏÇϸé,
* GTK´Â "destroy" ½Ã±×³ÎÀ» ¹ß»ý½ÃŲ´Ù. FALSE¸¦ ¸®ÅÏÇϸé
* À©µµ°¡ ÁøÂ¥·Î ÆÄ±«µÇ±æ ¿øÇÏÁö ¾Ê´Â °ÍÀÌ´Ù. À̰ÍÀº
* 'ÁøÂ¥·Î ³¡³»·Æ´Ï±î?' °°Àº ´ëÈ»óÀÚ°¡ Æ¢¾î³ª¿À°Ô ÇÒ ¶§
* À¯¿ëÇÏ´Ù. */
/* FALSE¸¦ TRUE·Î °íÄ¡¸é main À©µµ´Â "delete_event"¿Í ÇÔ²²
* ÆÄ±«µÉ °ÍÀÌ´Ù. */
return (FALSE);
}
/* ¶Ç´Ù¸¥ callback */
void destroy (GtkWidget *widget, gpointer data)
{
gtk_main_quit ();
}
int main (int argc, char *argv[])
{
/* GtkWidgetÀº widgetµéÀ» À§ÇÑ ±â¾ïÀå¼Ò ŸÀÔÀÌ´Ù. */
GtkWidget *window;
GtkWidget *button;
/* À̰ÍÀº ¸ðµç GTK ¾îÇõ鿡¼ È£ÃâµÈ´Ù. ÀÎÀÚµéÀº ¸í·ÉÇà »óÀ¸·ÎºÎÅÍ
* ÁÖ¾îÁ® ¾îÇ÷ΠÀüÇØÁø´Ù. */
gtk_init (&argc, &argv);
/* »õ·Î¿î À©µµ¸¦ ¸¸µç´Ù. */
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
/* À©µµ°¡ "delete_event"¸¦ ¹ÞÀ¸¸é(ÀÌ´Â À©µµ¸Å´ÏÀú¸¦ ÅëÇÑ´Ù), ¿ì¸®´Â
* À§¿¡¼ Á¤ÀÇÇÑ ÇÔ¼ö delete_event()¸¦ È£ÃâÇÒ °ÍÀÎÁö È®ÀÎÇÑ´Ù. ÀÌ
* callbackÇÔ¼ö·Î ÀüÇØÁø µ¥ÀÌÅÍ´Â NULLÀÌ°í µû¶ó¼ ¿©±â¼ ¹«½ÃµÈ´Ù. */
gtk_signal_connect (GTK_OBJECT (window), "delete_event",
GTK_SIGNAL_FUNC (delete_event), NULL);
/* ¿©±â¼´Â ½Ã±×³ÎÇڵ鷯¿¡ "destroy" À̺¥Æ®¸¦ ¿¬°áÇØ ÁØ´Ù.
* ÀÌ À̺¥Æ®´Â ¿ì¸®°¡ À©µµ¿¡ ´ëÇØ gtk_widget_destroy()¸¦ È£ÃâÇϰųª,
* ¶Ç´Â "delete_event" callback¿¡¼ 'TRUE'¸¦ ¸®ÅÏÇßÀ» ¶§ ¹ß»ýÇÑ´Ù. */
gtk_signal_connect (GTK_OBJECT (window), "destroy",
GTK_SIGNAL_FUNC (destroy), NULL);
/* À©µµÀÇ border width¸¦ ¼¼ÆÃÇÑ´Ù. */
gtk_container_border_width (GTK_CONTAINER (window), 10);
/* "Hello World"¶ó´Â ¶óº§ÀÌ ÀÖ´Â »õ·Î¿î ¹öưÀ» ¸¸µç´Ù. */
button = gtk_button_new_with_label ("Hello World");
/* ¹öưÀÌ "clicked" ½Ã±×³ÎÀ» ¹ÞÀ¸¸é NULLÀ» ÀÎÀÚ·Î ÇØ¼ hello()°¡
* È£ÃâµÈ´Ù. ÀÌ hello() ÇÔ¼ö´Â À§¿¡¼ Á¤ÀǵǾú´Ù. */
gtk_signal_connect (GTK_OBJECT (button), "clicked",
GTK_SIGNAL_FUNC (hello), NULL);
/* À̰ÍÀÌ "clicked"µÇ¸é gtk_widget_destroy(window)°¡ È£Ãâ, ±× À©µµ¸¦
* ÆÄ±«ÇÏ°Ô µÈ´Ù. ¾Õ¼ ¼³¸íÇßµíÀÌ, 'destroy' ½Ã±×³ÎÀº ¿©±â¼ ÀÌ·¸°Ô
* ¹ß»ýÇϰųª, ¶Ç´Â À©µµ¸Å´ÏÀú¸¦ ÅëÇØ ¹ß»ýÇÑ´Ù. */
gtk_signal_connect_object (GTK_OBJECT (button), "clicked",
GTK_SIGNAL_FUNC (gtk_widget_destroy),
GTK_OBJECT (window));
/* À̰ÍÀº ¹öưÀ» À©µµ, Áï GTK ÄÁÅ×À̳ÊÀÇ Çϳª·Î ÆÐÅ·ÇÑ´Ù. */
gtk_container_add (GTK_CONTAINER (window), button);
/* ³¡À¸·Î »õ·Î ¸¸µç widgetÀÎ ¹öưÀ» º¸¿©ÁÖ´Â °ÍÀÌ´Ù. */
gtk_widget_show (button);
/* À©µµ Àüü¸¦ ¿©±â¼ º¸¿©ÁØ´Ù. */
gtk_widget_show (window);
/* ¸ðµç GTK ¾îÇÃÀº ²À gtk_main()À» Çϳª¾¿ °¡Áö°í ÀÖ´Ù. ÄÁÆ®·ÑÀº
* ¿©±â¼ ³¡³ª°í ÀÌÁ¦ ¾î¶² À̺¥Æ®(۸¦ ´©¸¥´Ù°Å³ª ¸¶¿ì½º¸¦ Á¶ÀÛÇÏ´Â
* µîÀÇ)°¡ ¹ß»ýÇÒ ¶§±îÁö ´ë±âÇÑ´Ù. */
gtk_main ();
return 0;
}
3.2 Hello world¸¦ ÄÄÆÄÀÏÇϱâ
ÄÄÆÄÀÏÇϱâ À§ÇØ ÀÌ·¸°Ô Ç϶ó.
gcc -Wall -g helloworld.c -o hello_world `gtk-config --cflags` \
`gtk-config --libs`
Gtk2.0¿¡¼´Â gtk-config´ë½Å pkg-config·Î º¯°æµÇ¾úÀ¸¹Ç·Î, ÄÄÆÄÀÏÇϱâ À§ÇØ ÀÌ·¸°Ô Ç϶ó.
gcc -Wall -g helloworld.c -o hello_world `pkg-config --cflags --libs gtk+-2.0`
ÀÌ·¸°Ô ÇÏ´Â °ÍÀº gtk¿Í ÇÔ²² µþ·Á¿À´Â gtk-config¶õ ÇÁ·Î±×·¥À»
ÀÌ¿ëÇÏ´Â °ÍÀÌ´Ù. ÀÌ ÇÁ·Î±×·¥Àº gtk¸¦ ¾²´Â ÇÁ·Î±×·¥À» ÄÄÆÄÀÏÇϱâ À§Çؼ
¾î¶² ÄÄÆÄÀÏ·¯ ½ºÀ§Ä¡µéÀÌ ÇÊ¿äÇÑÁö '¾Ë°í'ÀÖ´Ù.
gtk-config --cflags ´Â ÄÄÆÄÀÏ·¯°¡ header ÆÄÀϵéÀ» ã¾Æº¸¾Æ¾ß ÇÏ´Â
include µð·ºÅ丮µéÀ» Ãâ·ÂÇϰí,
gtk-config --libs ´Â ¸µÅ©µÇ¾î¾ß ÇÏ´Â ¶óÀ̺귯¸®µé°ú
±× ¶óÀ̺귯¸®µéÀÌ Á¸ÀçÇÏ´Â µð·ºÅ丮µéÀ» Ãâ·ÂÇÑ´Ù.
º¸Åë ¸µÅ©½ÃŰ´Â ¶óÀ̺귯¸®µéÀº ´ÙÀ½°ú °°Àº °ÍµéÀÌ´Ù.
- The GTK library (-lgtk), GDK¸¦ ±â¹ÝÀ¸·ÎÇÑ widget ¶óÀ̺귯¸®´Ù.
- The GDK library (-lgdk), Xlib¸¦ °¨Ãß¾î µÑ·¯½Ñ wrapper´Ù.
- The glib library (-lglib), ´Ù¾çÇÑ ÇÔ¼ö¸¦ Æ÷ÇÔÇϰí ÀÖÀ¸¸ç, ¿©±â¼
¾²ÀÎ °ÍÀº g_print()ÇÔ¼ö´Ù. GTK´Â glib¸¦ ±â¹ÝÀ¸·Î Çϰí ÀÖÀ¸¹Ç·Î
¾ðÁ¦³ª ÀÌ ¶óÀ̺귯¸®°¡ ÇÊ¿äÇÒ °ÍÀÌ´Ù. ÀÚ¼¼ÇÑ °ÍÀº
glibÀ» ÂüÁ¶Ç϶ó.
- The Xlib library (-lX11), GDK¿¡ ÀÇÇØ ¾²¿©Áö°Ô µÈ´Ù.
- The Xext library (-lXext), À̰ÍÀº °øÀ¯ ¸Þ¸ð¸® pixmap°ú ´Ù¸¥ X È®Àåµé¿¡
´ëÇÑ Äڵ带 À§ÇÑ °ÍÀÌ´Ù.
- The math library (-lm), À̰ÍÀº ¿©·¯ ¸ñÀûÀ¸·Î GTK¿¡¼ ¾²ÀÌ°Ô µÈ´Ù.
3.3 ½Ã±×³Î°ú callback¿¡ ´ëÇÑ ÀÌ·Ð
Hello world ÇÁ·Î±×·¥À» ÀÚ¼¼È÷ »ìÆìº¸±â¿¡ ¾Õ¼, À̺¥Æ®¿Í callback¿¡ ´ëÇØ
Áý°í ³Ñ¾î°¡ÀÚ. GTK´Â À̺¥Æ®·Î µ¹¾Æ°¡´Â ŸŶÀ̸ç, À̰ÍÀº ¾î¶² À̺¥Æ®°¡
¹ß»ýÇØ¼ ÀûÀýÇÑ ´Ù¸¥ ÇÔ¼ö·Î Á¦¾î°¡ ³Ñ¾î°¡Áö ¾Ê´Â ÇÑ °è¼Ó ´ë±âÇÑ´Ù´Â Àǹ̴Ù.
ÀÌ Á¦¾î¸¦ ³Ñ±ä´Ù´Â °ÍÀº "½Ã±×³Î"ÀÇ À̿뿡 ÀÇÇØ ÀÌ·ç¾îÁø´Ù. ¸¶¿ì½º ¹öưÀ»
´©¸£´Â °Í°°ÀÌ ¾î¶² À̺¥Æ®°¡ ÀÖÀ¸¸é, ´·¯Á³´Ù¿¡ ÇØ´çÇÏ´Â ÀûÀýÇÑ ½Ã±×³ÎÀÌ
widget¿¡ ÀÇÇØ "¹ß»ý"ÇÏ°Ô µÈ´Ù. À̰ÍÀÌ GTK°¡ ÇÏ´Â À¯¿ëÇÑ ÀÛ¾÷ÀÇ ´ëºÎºÐÀÌ´Ù.
¹öưÀÇ ÀÛ¿ëÀ¸·Î ¾î¶² µ¿ÀÛÀ» ½ÃŰ·Á¸é, ¿ì¸®´Â ÀÌ·± ½Ã±×³ÎµéÀ» Àâ¾Æ³»µµ·Ï
½Ã±×³Î Çڵ鷯¸¦ ¼Â¾÷Çϰí ÀÌ¿¡ Àû´çÇÑ ÇÔ¼ö¸¦ ºÎ¸£¸é µÈ´Ù. À̰ÍÀº ´ÙÀ½°ú °°Àº
ÇÔ¼ö¸¦ ÀÌ¿ëÇÔÀ¸·Î½á ÀÌ·ç¾îÁø´Ù.
gint gtk_signal_connect (GtkObject *object,
gchar *name,
GtkSignalFunc func,
gpointer func_data);
ù¹øÂ° ÀÎÀÚ´Â ½Ã±×³ÎÀ» ¹ß»ý½Ãų widgetÀ̰í, µÎ¹øÂ°´Â Àâ¾Æ³»°íÀÚ ÇÏ´Â
½Ã±×³ÎÀÇ À̸§ÀÌ´Ù. ¼¼¹øÂ° ÀÎÀÚ´Â ±× ½Ã±×³ÎÀÌ Å½ÁöµÇ¾úÀ» ¶§ È£ÃâÇÒ ÇÔ¼ö¸ç,
³×¹øÂ°´Â ÀÌ ÇÔ¼ö¿¡ ³Ñ°ÜÁÙ Á¤º¸´Ù.
¼¼¹øÂ° ÀÎÀÚ·Î ³ª¿ÍÀÖ´Â ÇÔ¼ö¸¦ "callback ÇÔ¼ö"¶ó°í ºÎ¸£¸ç ´ÙÀ½Ã³·³ ÀÌ·ç¾îÁ®
ÀÖ´Ù.
void callback_func(GtkWidget *widget, gpointer callback_data);
ÀÌ ÇÔ¼öÀÇ Ã¹¹øÂ° ÀÎÀÚ´Â ½Ã±×³ÎÀ» ¹ß»ý½ÃŲ widgetÀ» ÇâÇÑ Æ÷ÀÎÅͰ¡ µÇ°í,
µÎ¹øÂ° ÀÎÀÚ´Â À§¿¡ º¸ÀÎ gtk_signal_connect() ÇÔ¼öÀÇ ³×¹øÂ° ÀÎÀÚ·Î ÁÖ¾îÁ®
ÀÖ´Â Á¤º¸¿¡ ´ëÇÑ Æ÷ÀÎÅÍ´Ù.
Hello world ¿¹Á¦¿¡¼ ¾²ÀÎ ¶Ç´Ù¸¥ È£ÃâÀº À̰ÍÀÌ´Ù.
gint gtk_signal_connect_object (GtkObject *object,
gchar *name,
GtkSignalFunc func,
GtkObject *slot_object);
gtk_signal_connect_object()´Â callbackÇÔ¼ö°¡ GTK object¿¡ ´ëÇÑ Æ÷ÀÎÅͶó´Â,
´Ü ÇϳªÀÇ ÀÎÀÚ¸¦ ÀÌ¿ëÇÑ´Ù´Â Á¡¸¸ »©°í´Â gtk_signal_connect()¿Í °°´Ù.
±×·¯¹Ç·Î ½Ã±×³ÎÀ» ¿¬°á½Ãų ¶§ ÀÌ ÇÔ¼ö¸¦ ÀÌ¿ëÇÑ´Ù¸é callbackÇÔ¼ö´Â ÀÌ·±
¸ð¾çÀ» ÇØ¾ß ÇÒ °ÍÀÌ´Ù.
void callback_func (GtkObject *object);
¿©±â¼ÀÇ object¶õ ´ë°³ widgetÀ» ¸»ÇÑ´Ù. ¿ì¸®´Â ¾î·µç µÇµµ·Ï
gtk_signal_connect_object¸¦ ÀÌ¿ëÇØ¼ callbackÀ» ¼Â¾÷ÇÏÁö´Â ¾ÊÀ» °ÍÀÌ´Ù.
±×µéÀº ¿ì¸®ÀÇ
hello world ¿¹Á¦¿¡¼Ã³·³, ÁÖ·Î ÀÎÀڷμ ½Ã±×³Î widget/object¸¦ Çã¿ëÇÏ´Â GTK
ÇÔ¼öµéÀ» ºÎ¸¦ ¶§ ¾²À̰í ÀÖ´Ù.
½Ã±×³ÎÀ» ¿¬°á½ÃŰ´Â µ¥ µÎ °³ÀÇ ÇÔ¼ö¸¦ °¡Áö°í ÀÖ´Â °ÍÀº ´ÜÁö ¼·Î ´Ù¸¥
°¹¼öÀÇ ÀÎÀÚ¸¦ °¡Áö°í ÀÖ´Â callbackÀ» Çã¿ëÇϱâ À§ÇؼÀÌ´Ù. GTK ¶óÀ̺귯¸®¿¡
ÀÖ´Â ¸¹Àº ÇÔ¼öµéÀº ÀÎÀڷμ ¿ÀÁ÷ GtkWidget Æ÷ÀÎÅ͸¸À» Çã¿ëÇϹǷÎ, ÀÌ·± °æ¿ì
¿¡´Â gtk_signal_connect_object() ¸¦ ÀÌ¿ëÇÏ¸é µÉ °ÍÀÌ´Ù. ¹Ý¸é ÀÚ½ÅÀÇ ÇÔ¼ö¿¡
´ëÇØ¼´Â, callback¿¡ Ãß°¡ÀûÀÎ Á¤º¸¸¦ °¡Á®¾ß ÇÒ Çʿ䰡 ÀÖÀ» °ÍÀÌ´Ù.
3.4 Hello World¸¦ µû¶ó ÇѰÉÀ½¾¿
ÀÌÁ¦ Àû¿ëµÈ À̷п¡ ´ëÇØ ¾Ë¾Ò°í, hello world ¿¹Á¦ ÇÁ·Î±×·¥À» µû¶ó ´õ È®½ÇÈ÷
ÇØµÎÀÚ.
À̰ÍÀº ¹öưÀÇ "´¸²"À̶ó´Â À̺¥Æ®¿¡ ´ëÇØ È£ÃâµÉ callbackÇÔ¼ö´Ù. ÀÌ ¿¹Á¦
¿¡¼´Â widget°ú Á¤º¸°¡ ¸ðµÎ ¹«½ÃµÇÁö¸¸, ±×°ÍµéÀ» ´Ù·ç´Â °ÍÀº ±×´ÙÁö ¾î·ÆÁö
¾Ê´Ù. ÀÌ°Í ´ÙÀ½ÀÇ ¿¹Á¦´Â ¾î¶² ¹öưÀÌ ´·¯Á³´Â°¡¸¦ ¾Ë·ÁÁÖ±â À§ÇØ Á¤º¸ ÀÎÀÚ¸¦
ÀÌ¿ëÇÏ´Â °ÍÀÌ´Ù.
void hello (GtkWidget *widget, gpointer data)
{
g_print ("Hello World\n");
}
ÀÌ callbackÀº ´Ù¼Ò Ưº°ÇÏ´Ù. À©µµ¸Å´ÏÀú°¡ ¾îÇÿ¡ ÀÌ À̺¥Æ®¸¦ º¸³»¸é
"delete_event"°¡ ¹ß»ýÇÏ°Ô µÈ´Ù. ¿ì¸®´Â ¿©±â¼ ÀÌ·± À̺¥Æ®µé¿¡ ´ëÇØ ¹«¾ùÀ»
ÇØÁà¾ß ÇÒÁö ¼±ÅÃÇÑ´Ù. ¿ì¸®´Â ±×°ÍÀ» ¹«½ÃÇÒ ¼öµµ ÀÖ°í, ÀÌ¿¡ ´ëÇÑ ¹ÝÀÀÀ»
Á¤¸®ÇÒ ¼öµµ ÀÖÀ¸¸ç, ¶Ç´Â °£´ÜÈ÷ ±× ¾îÇÃÀ» Á¾·áÇÒ ¼öµµ ÀÖ´Ù.
ÀÌ callbackÀÇ ¸®ÅϰªÀ» ÅëÇØ GTK´Â ¾î¶² ÀÏÀ» ÇØ¾ßÇÒ Áö ¾Ë°Ô µÈ´Ù. FALSE¸¦
¸®ÅÏÇϸé GTK´Â ¿ì¸®°¡ "destroy"½Ã±×³ÎÀ» ¹ß»ýÇÏ´Â °ÍÀ» ¿øÇÏÁö ¾Ê´Â´Ù°í ÆÇ´Ü
ÇÏ°Ô µÈ´Ù. ±×¸®°í TRUE¸¦ ¸®ÅÏÇÏ´Â °ÍÀ¸·Î ¿ì¸®´Â "destroy"½Ã±×³ÎÀÌ ¹ß»ýÇÔÀ»
È®ÀνÃ۰í, "destroy"½Ã±×³Î Çڵ鷯¸¦ È£ÃâÇÏ°Ô µÈ´Ù.
gint delete_event(GtkWidget *widget, GdkEvent *event, gpointer data)
{
g_print ("delete event occured\n");
return (FALSE);
}
¿©±â ´ÜÁö gtk_main_quit()À» È£ÃâÇÏ´Â °ÍÀ¸·Î Á¾·áÇØ ¹ö¸®´Â, ¶Ç´Ù¸¥ callback
ÇÔ¼ö°¡ ÀÖ´Ù. À̰Ϳ¡ ´ëÇØ¼± ±ä¸» ¾Ê°Ú´Ù, º¸¸é ¾Ë ¼ö ÀÖÀ» °ÍÀ̹ǷÎ.
void destroy (GtkWidget *widget, gpointer data)
{
gtk_main_quit ();
}
´ç½ÅÀÌ main() ¶õ °Í¿¡ ´ëÇØ ¾Ë°í ÀÖÀ¸¸®¶ó »ý°¢ÇÑ´Ù, ´Ù¸¥ ¾îÇðú ¸¶Âù°¡Áö·Î,
¸ðµç GTK ¾îÇà ¿ª½Ã main() À» Çϳª¾¿ °¡Áö°í ÀÖ´Ù.
int main (int argc, char *argv[])
{
ÀÌ ºÎºÐ¿¡¼, GtkWidgetÇüÀÇ ±¸Á¶Ã¼¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ ¼±¾ðÇÑ´Ù. À̰͵éÀº
À©µµ¿Í ¹öưÀ» ¸¸µé±â À§ÇØ ¾Æ·¡¿¡¼ ¾²ÀÌ°Ô µÈ´Ù.
GtkWidget *window;
GtkWidget *button;
¿©±â ´Ù½Ã gtk_init°¡ ³ª¿Â´Ù. Àü°ú ¸¶Âù°¡Áö·Î, À̰ÍÀº ŸŶÀ» ÃʱâÈÇϰí,
¸í·ÉÇà¿¡¼ ÁÖ¾îÁø ÀÎÀÚµéÀ» ºÐ¼®ÇÑ´Ù. À̰ÍÀº ¸í·ÉÇà¿¡¼ °¨ÁöµÈ ¾î¶² ÀÎÀÚ¶óµµ
ÀÎÀÚÀÇ ¸®½ºÆ®¿¡¼ »èÁ¦Çϰí, argc¿Í argv¸¦ º¯Çü½ÃÄÑ ±× ÀÎÀÚµéÀÌ Á¸ÀçÇÏÁö ¾Ê´Â
°Íó·³ º¸ÀÌ°Ô ÇØ¼, ´ç½ÅÀÇ ¾îÇÃÀÌ ³²¾ÆÀÖ´Â ÀÎÀڵ鸸À» ºÐ¼®Çϵµ·Ï ÇØÁØ´Ù.
gtk_init (&argc, &argv);
»õ À©µµ¸¦ Çϳª ¸¸µç´Ù. À̰ÍÀº ²Ï³ª °£´ÜÇÏ´Ù. GtkWidget *window °¡ °¡¸®
Ű´Â ±¸Á¶Ã¼¿¡ ¸Þ¸ð¸®°¡ ÇÒ´çµÇ¾î ÀÌÁ¦ ½ÇÁ¦·Î Á¸ÀçÇÏ´Â ±¸Á¶Ã¼¸¦ °¡¸®Å°°Ô µÈ
°ÍÀÌ´Ù. »õ·Î¿î À©µµ¸¦ ¼Â¾÷ÇÏÁö¸¸, ¾ÆÁ÷ gtk_widget_show(window)¸¦ È£ÃâÇÏÁö
¾Ê¾Ò±â ¶§¹®¿¡ ½ÇÁ¦·Î º¸¿©ÁöÁø ¾Ê°í ÀÖ´Ù. ÀÌ À©µµ´Â ÇÁ·Î±×·¥ÀÇ ³¡ ±Ùó¿¡¼¾ß
º¸ÀÌ°Ô µÉ °ÍÀÌ´Ù.
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
ÀÌ °æ¿ì¿£ À©µµ°¡ µÇ°ÚÁö¸¸, ¿©±â ÇÑ object¿¡ ½Ã±×³Î Çڵ鷯¸¦ ¿¬°á½ÃŰ´Â
¿¹°¡ ÀÖ´Ù. ¿©±â¼´Â "destory"½Ã±×³ÎÀÌ Å½ÁöµÈ´Ù. ÀÌ ½Ã±×³ÎÀº ¿ì¸®°¡ À©µµ¸¦
¾ø¾Ö±â À§Çؼ À©µµ¸Å´ÏÀúÀÇ ±â´ÉÀ» ÀÌ¿ëÇßÀ» ¶§(±×¸®°í ¿ì¸®°¡ "delete_event"
Çڵ鷯¿¡¼ TRUE¸¦ ¸®ÅÏÇßÀ» ¶§), ¶Ç´Â ÆÄ±«ÇÒ object·Î À©µµwidgetÀ» ¼±ÅÃÇÏ¿©
gtk_widget_destroy()¸¦ È£ÃâÇßÀ» ¶§ ¹ß»ýÇÑ´Ù. À̰ÍÀ» ¼Â¾÷ÇÏ´Â °ÍÀ¸·Î ¿ì¸®´Â
ÇÑ ¹øÀÇ È£Ãâ·Î µÎ °æ¿ì ¸ðµÎ¸¦ ´Ù·ê ¼ö ÀÖ´Ù. ¿©±â¼, ±×°ÍÀº ¾Õ¿¡¼ Á¤ÀǵÈ
destroy() ÇÔ¼ö¸¦ NULL ÀÎÀڷΠȣÃâÇÏ¿© GTK¸¦ Á¾·áÇÏ°Ô ÇÑ´Ù.
GTK_OBJECT¿Í GTK_SIGNAL_FUNC´Â Äڵ带 ½±°Ô ºÐ¼®ÇÒ ¼ö ÀÖ°Ô ÇØÁÖ¸ç ÀÚ·áÇü
ij½ºÆÃ°ú üũ¸¦ ÇØÁÖ´Â ¸ÅÅ©·ÎµéÀÌ´Ù.
gtk_signal_connect (GTK_OBJECT (window), "destroy",
GTK_SIGNAL_FUNC (destroy), NULL);
À̹ø ÇÔ¼ö´Â container objectÀÇ ¼Ó¼ºÀ» ¼³Á¤ÇØ ÁÖ±â À§ÇØ ¾²¿´´Ù. À̰ÍÀº
À©µµ¸¦ 10 Çȼ¿ÀÇ ³ÊºñÀÇ ºó ¿µ¿ªÀ¸·Î µÑ·¯½×ÀÌ°Ô ÇÑ´Ù. ¿ì¸®´Â ¾ÕÀ¸·Î
Widget ¼Ó¼º¼³Á¤
À̶ó´Â section¿¡¼ À¯»çÇÑ ±â´ÉÀ» °¡Áø ´Ù¸¥ ÇÔ¼öµéÀ» Á¢ÇÏ°Ô µÉ
°ÍÀÌ´Ù.
±×¸®°í, GTK_CONTAINER´Â ¿ª½Ã ÀÚ·áÇü ij½ºÆÃÀ» ÇØÁÖ´Â ¸ÅÅ©·Î´Ù.
gtk_container_border_width (GTK_CONTAINER (window), 10);
ÀÌ È£ÃâÀº »õ ¹öưÀ» Çϳª ¸¸µç´Ù. À̰ÍÀº »õ·Î¿î GtkWidget ±¸Á¶Ã¼¸¦ À§ÇÑ
¸Þ¸ð¸® °ø°£À» ÇÒ´çÇϰí, ±×°ÍÀ» ÃʱâÈÇϸç, ±×¸®°í buttonÀ̶ó´Â Æ÷ÀÎÅͰ¡ ±×
¿µ¿ªÀ» °¡¸®Å°µµ·Ï ÇÑ´Ù. ÀÌ ¹öưÀº º¸¿©Áö°Ô µÇ¾úÀ» ¶§ "Hello World"¶ó´Â
¶óº§À» °¡Áö°Ô µÉ °ÍÀÌ´Ù.
button = gtk_button_new_with_label ("Hello World");
¿ì¸®´Â ¿©±â¼ ÀÌ ¹öưÀÌ ¹º°¡ À¯¿ëÇÑ ÀÏÀ» Çϵµ·Ï ÇÑ´Ù. ¿ì¸®´Â ±×°Í¿¡
½Ã±×³Î Çڵ鷯¸¦ ´Þ¾ÆÁÖ°í, "clicked"½Ã±×³ÎÀÌ ¹ß»ýÇßÀ» ¶§ ¿ì¸®ÀÇ hello()
ÇÔ¼ö°¡ È£ÃâµÇµµ·Ï ÇÑ´Ù. ÀüÇØÁú Á¤º¸´Â ¾ø°í, µû¶ó¼ ¿ì¸®´Â hello()¶ó´Â
callbackÇÔ¼ö¿¡ ´Ü¼øÈ÷ NULLÀ» ÀüÇØÁØ´Ù. ºÐ¸íÈ÷, ¿ì¸®°¡ ¸¶¿ì½º Æ÷ÀÎÅÍ·Î ±×
¹öưÀ» Ŭ¸¯ÇßÀ» ¶§ "clicked"½Ã±×³ÎÀÌ ¹ß»ýÇÏ°Ô µÈ´Ù.
gtk_signal_connect (GTK_OBJECT (button), "clicked",
GTK_SIGNAL_FUNC (hello), NULL);
¿ì¸®´Â ¶ÇÇÑ ÇÁ·Î±×·¥À» ³¡³»±â À§Çؼµµ ÀÌ ¹öưÀ» ÀÌ¿ëÇÑ´Ù. À̰ÍÀº À©µµ
¸Å´ÏÀú¸¦ ÅëÇØ¼, ȤÀº ¿ì¸® ÇÁ·Î±×·¥À» ÅëÇØ¼ "destroy"½Ã±×³ÎÀÌ ¾î¶»°Ô ÀüÇØ
¿À´ÂÁö¸¦ º¸¿©ÁÙ °ÍÀÌ´Ù. ¾Õ¿¡¼Ã³·³ ¹öưÀÌ ´·ÁÁö¸é ¸ÕÀú hello() callback
ÇÔ¼ö°¡ ºÒ·ÁÁö°í, µÚÀÌ¾î ±×µéÀÌ ¼Â¾÷µÈ ¼ø¼´ë·Î À̰ÍÀÌ È£ÃâµÈ´Ù. ÇÊ¿äÇÏ´Ù¸é
¾ó¸¶µçÁö callbackÇÔ¼ö¸¦ ¾µ ¼ö ÀÖÀ¸¸ç, ±×°Íµé ¸ðµÎ´Â ¿ì¸®°¡ ¿¬°á½ÃÄѳõÀº
¼ø¼´ë·Î ½ÇÇàµÈ´Ù. gtk_widget_destroy()ÇÔ¼ö°¡ ¿ÀÁ÷ GtkWidget *widget¸¸À»
ÀÎÀÚ·Î Çã¿ëÇϱ⠶§¹®¿¡, ¿ì¸®´Â ¿©±â¼ gtk_signal_connect()¸¦ ¹Ù·Î ¾²Áö ¾Ê°í
gtk_signal_connect_object()¸¦ ¾´´Ù.
gtk_signal_connect_object (GTK_OBJECT (button), "clicked",
GTK_SIGNAL_FUNC (gtk_widget_destroy),
GTK_OBJECT (window));
À̰ÍÀº ÆÐÅ·È£ÃâÀÌ¸ç µÚ¿¡¼ ´õ ±í°Ô ´Ù·ê °ÍÀÌ´Ù. ÇÏÁö¸¸ »ó´çÈ÷ ½±°Ô ÀÌÇØÇÒ
¼ö ÀÖ´Ù. À̰ÍÀº ´ÜÁö GTK¿¡°Ô, ¹öưÀº ±× ¹öưÀÌ º¸¿©Áö°Ô µÉ À©µµ¿¡ À§Ä¡Çؾß
µÈ´Ù´Â °É ¾Ë·ÁÁØ´Ù.
gtk_container_add (GTK_CONTAINER (window), button);
ÀÌÁ¦ ¿ì¸®´Â ÇÊ¿äÇÑ ¸ðµç ¼Â¾÷À» ¸¶ÃÆ´Ù. ÀÚ¸®¸¦ ÀâÀº ¸ðµç ½Ã±×³Î Çڵ鷯¿Í
ÇÔ²², ¸ðµç ¹öưÀÌ °¢°¢ ÀÖ¾î¾ß ÇÒ À©µµ¿¡ ÀÚ¸®¸¦ Àâ¾Ò°í, ¿ì¸®´Â GTK°¡ ½ºÅ©¸°
À§¿¡ widgetµéÀ» "º¸¿©ÁÖ±â"¸¦ ¿ä±¸ÇÑ´Ù. À©µµwidgetÀÌ °¡Àå ³ªÁß¿¡ º¸¿©Áø´Ù.
µû¶ó¼ À©µµ°¡ ¸ÕÀú º¸¿©Áö°í ±× ³»ºÎ¿¡ ¹öư ¸ð¾çÀÌ µÚÀÌ¾î ±×·ÁÁö´Â °Ô ¾Æ´Ï¶ó,
¿ÏÀüÈ÷ ¸ð¾çÀ» °®Ãá À©µµ°¡ ÇѲ¨¹ø¿¡ º¸¿©Áö°Ô µÈ´Ù.
gtk_widget_show (button);
gtk_widget_show (window);
±×¸®°í ¹°·Ð, ¿ì¸®´Â gtk_main()À» ºÒ·¯¼ X ¼¹ö·ÎºÎÅÍ À̺¥Æ®°¡ ¹ß»ýÇϱ⸦
±â´Ù¸®°Ô Çϰí, ÀÌ À̺¥Æ®°¡ ŽÁöµÇ¾úÀ» ¶§ ½Ã±×³ÎÀ» ³»µµ·Ï widgetÀ» È£ÃâÇÒ
°ÍÀÌ´Ù.
gtk_main ();
±×¸®°í ¸¶Áö¸· ¸®ÅÏ. gtk_quit()°¡ È£ÃâµÈ ÀÌÈÄ Á¦¾î´Â ¿©±â¼ ³¡³ª°Ô µÈ´Ù.
return 0;
ÀÌÁ¦, ¿ì¸®°¡ GTKÀÇ ¹öư À§¿¡¼ ¸¶¿ì½º ¹öưÀ» Ŭ¸¯Çϸé widgetÀº "clicked"
½Ã±×³ÎÀ» ¹ß»ý½ÃŲ´Ù. ÀÌ·± Á¤º¸¸¦ ÀÌ¿ëÇϱâ À§ÇØ ¿ì¸® ÇÁ·Î±×·¥Àº ±× ½Ã±×³ÎÀ»
Àâ¾Æ³¾ ½Ã±×³Î Çڵ鷯¸¦ ¼Â¾÷Çϰí, ±×°ÍÀº ¿ì¸®ÀÇ ¼±Åÿ¡ ÀÇÇÑ ÇÔ¼öµéÀ» À绡¸®
ºÎ¸£°Ô µÈ´Ù. ¿ì¸®ÀÇ ¿¹Á¦¿¡¼´Â ¿ì¸®°¡ ¸¸µç ¹öưÀÌ ´·ÁÁö¸é hello()ÇÔ¼ö°¡
NULL ÀÎÀڷΠȣÃâµÇ°í, µÚÀ̾î ÀÌ ½Ã±×³ÎÀ» À§ÇÑ ´ÙÀ½ Çڵ鷯°¡ È£ÃâµÈ´Ù.
À̰ÍÀº À©µµ widgetÀ» ÀÎÀÚ·Î ÇÏ¿© gtk_widget_destroy()ÇÔ¼ö¸¦ È£ÃâÇØ¼ À©µµ
widgetÀ» ¾ø¾Ø´Ù. À̰ÍÀº À©µµ°¡ "destroy"½Ã±×³ÎÀ» ¹ß»ýÇÏ°Ô ÇØ¼ ŽÁöµÇ°í,
"destroy"¿¡ ÇØ´çÇÏ´Â callbackÇÔ¼ö¸¦ È£ÃâÇØ¼ GTK°¡ Á¾·áµÇ°Ô ÇÏ´Â °ÍÀÌ´Ù.
À̺¥Æ®µéÀÇ ¶Ç´Ù¸¥ »ç¿ë¹æ¹ýÀº À©µµ¸¦ Á¾·áÇϴµ¥ À©µµ ¸Å´ÏÁ®¸¦ ¾²´Â °ÍÀÌ´Ù.
ÀÌ·¸°Ô Çϸé "delete_event" ½Ã±×³ÎÀÌ ¹ß»ýÇϰí ÀÌ´Â ¿ì¸®ÀÇ "delete_event"
Çڵ鷯¸¦ È£ÃâÇÑ´Ù.
¸¸ÀÏ ¿ì¸®°¡ ¿©±â¼ TRUE¸¦ ¸®ÅÏÇϸé À©µµ´Â ±×´ë·Î ȸ鿡 ³²°í ¾Æ¹«Àϵµ
»ý±âÁö ¾Ê´Â´Ù. FALSE¸¦ ¸®ÅÏÇϸé GTK´Â "destroy" ½Ã±×³ÎÀ» ¹ß»ýÇϰí
"destroy" callbackÀÌ È£ÃâµÇ¾î GTK°¡ Á¾·áµÈ´Ù.
ºñ·Ï ¾²ÀÓ»õ´Â °ÅÀÇ °°Àº °ÍÀÌÁö¸¸, À¯´Ð½º ½Ã½ºÅÛÀÇ ½Ã±×³ÎÀº ¿©±â¼ ¸»ÇÏ´Â
ÀÌ·± ½Ã±×³Î°ú ´Ù¸¥ °ÍÀÌ¸ç »ç¿ëµÇÁöµµ ¾Ê´Â´Ù´Â Á¡À» ±â¾ïÇϱ⠹ٶõ´Ù.
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
µµ ÀÖ´Ù. À̰ÍÀº À©µµ¸Å´ÏÀú¿Í ¾à°£ ´Ù¸¥ ¹æ½ÄÀ¸·Î »óÈ£ÀÛ¿ëÇϸç, ÀϽÃÀûÀÎ À©µµ
µé¿¡ ´ëÇØ ¾²¿©Á®¾ß ÇÑ´Ù.
¿ì¸®°¡ ¾î¶² ¾îÇÃÀ» °³¹ßÇϸé¼, ÇϳªÀÇ À©µµ¿¡ Çϳª ÀÌ»óÀÇ ¹öưÀ» ³õÀ¸·Á ÇÒ
°ÍÀÌ´Ù. ¿ì¸®ÀÇ Ã¹¹øÂ° 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¿¡¼ ¹Ú½º¸¦ ÆÐÅ·ÇÏ´Â °ÍÀº óÀ½¿£ È¥¶õ½º·¯¿ïÁö
¸ð¸¥´Ù. ¸¹Àº ¿É¼ÇµéÀÌ ÀÖÀ¸¸ç, ±×µéÀÌ ¾î¶»°Ô ¼·Î ²ç¾î ¸ÂÃçÁö´ÂÁö Áï½Ã °£ÆÄ
ÇÒ ¼ö´Â ¾øÀ» °ÍÀÌ´Ù. ±×·¯³ª °á±¹, ¿ì¸®´Â ´Ù¼¸ °¡ÁöÀÇ ±âº»ÀûÀÎ ½ºÅ¸ÀÏÀ»
°¡Áö°Ô µÈ´Ù.
°¢°¢ÀÇ ÁÙÀº ¸î °³ÀÇ ¹öưÀ» °¡Áö°í ÀÖ´Â ÇϳªÀÇ ¼öÆò¹Ú½º(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ÀÇ °¢ ¹æÇâ¿¡¼ »ý°Ü³ª´Â °ÍÀÌ´Ù. À̰ÍÀÌ ±× Á¡À» ¸íÈ®È÷
ÇØÁÙ °ÍÀÌ´Ù.
¿©±â ÀÌ À̹ÌÁö¸¦ ¸¸µé¾î ÁÖ´Â Äڵ尡 ÀÖ´Ù. ³ª´Â ¿©·¯ ¹ø °Á¶ÇßÀ¸¹Ç·Î
À̰Ϳ¡¼ º° ¹®Á¦´Â ¾øÀ¸¸®¶ó ¹Ï´Â´Ù. ½º½º·Î ÄÄÆÄÀÏÇØ¼ °¡Áö°í ³î¾Æ º¸µµ·Ï
ÇÑ´Ù.
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 ¿¬»êÀÚ¸¦ ¾µ ¼ö ÀÖ´Ù.
ÀÌ ¿É¼ÇµéÀº ´ÙÀ½°ú °°´Ù.
- GTK_FILL - GTK_FILLÀÌ ¼³Á¤µÇ¸é Å×ÀÌºí ¹Ú½º°¡ widgetº¸´Ù Ŭ ¶§ widgetÀº
»ç¿ë°¡´ÉÇÑ ¸ðµç °ø°£À¸·Î È®´ëµÈ´Ù.
- GTK_SHRINK - Å×À̺í widgetÀÌ ´õ ÀûÀº °ø°£À» Â÷ÁöÇϵµ·Ï µÇ¾úÀ» ¶§ widget
Àº Á¤»óÀûÀ¸·Î À©µµÀÇ ¾Æ·¡ÂÊÀ¸·Î ¹Ð·Á³ª¼ ÀϺΰ¡ º¸ÀÌÁö ¾Ê°Ô µÈ´Ù. ¸¸¾à
GTK_SHRINK°¡ ¼³Á¤µÇ¸é widgetÀº ÀÚµ¿À¸·Î ÁÙ¾îµé¾î ³»ºÎ¿¡ ²À ¸Â°Ô µÈ´Ù.
- GTK_EXPAND - À̰ÍÀÌ ¼³Á¤µÇ¸é Å×À̺íÀº À©µµÀÇ ³²´Â °ø°£À¸·Î ²Ë Â÷°Ô
È®´ëµÈ´Ù.
ÆÐµùÀº ¹Ú½º ¾È¿¡¼Ã³·³, Çȼ¿ ´ÜÀ§·Î ¶Ñ·ÇÇÑ ¿µ¿ªÀ» 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.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;
}
GTK¿¡¼ widgetÀ» ¸¸µå´Â ÀϹÝÀûÀÎ ÀýÂ÷´Â ´ÙÀ½°ú °°´Ù.
- gtk_*_new - »õ·Î¿î widgetÀ» ¸¸µé±â À§ÇÑ ´Ù¾çÇÑ ÇÔ¼ö. ÀÌ°Íµé ¸ðµÎ´Â
¿©±â¼ ÀÚ¼¼È÷ º¸¿©Áú °ÍÀÌ´Ù.
- Àû´çÇÑ Çڵ鷯¿¡ »ç¿ëÇÒ ¸ðµç ½Ã±×³ÎÀ» °áÇÕ½ÃŲ´Ù.
- WidgetÀÇ ¼Ó¼ºÀ» ¼¼ÆÃÇÑ´Ù.
- gtk_container_add()³ª gtk_box_pack_start()°°Àº Àû´çÇÑ ÇÔ¼ö¸¦ ½á¼
widgetÀ» ÄÁÅ×ÀÌ³Ê ¾ÈÀ¸·Î ÆÐÅ·ÇÑ´Ù.
- gtk_widget_show()·Î widgetÀ» º¸ÀδÙ.
gtk_widget_show()´Â ¿ì¸®°¡ widgetÀÇ ¼Ó¼ºÀ» ¸ðµÎ ¼¼ÆÃÇßÀ½À» GTK¿¡°Ô ¾Ë¸®°í,
±×°ÍÀº ÀÌÁ¦ º¸¿©Áú Áغñ°¡ ´Ù µÈ °ÍÀÌ´Ù. ¿ì¸®´Â ±×°ÍÀ» ´Ù½Ã º¸ÀÌÁö ¾Ê°Ô Çϱâ
À§ÇØ gtk_widget_hide¸¦ ÀÌ¿ëÇÒ ¼öµµ ÀÖ´Ù. WidgetµéÀÌ º¸¿©Áö´Â ¼ø¼´Â Áß¿ä
ÇÏÁö ¾Ê´Ù. ³»°¡ ¸»ÇÏ·Á´Â °ÍÀº, °¢°¢ÀÇ widgetÀÌ »ý°Ü³ª´Â ´ë·Î ½ºÅ©¸°¿¡
º¸¿©Áö°Ô ÇÏ´Â °Íº¸´Ù´Â, À©µµ¸¦ °¡Àå ³ªÁß¿¡ º¸¿©Áö°Ô ÇØ¼ ¸ðµç ±¸¼º¿ä¼Ò°¡
Çѹø¿¡ Æ¢¾î¿À¸£°Ô ÇÏ´Â °ÍÀÌ ³´´Ù´Â °ÍÀÌ´Ù. gtk_widget_show()ÇÔ¼ö¸¦ ÀÌ¿ëÇϰÔ
µÇ¸é ¾î¶² widget(À©µµ ¿ª½Ã ÇϳªÀÇ widgetÀÌ´Ù)ÀÇ ±¸¼º¿ä¼ÒµéÀº ±× À©µµ ÀÚü°¡
º¸¿©Áö±â Àü¿¡ ¸ÕÀú º¸¿©ÁöÁö ¾Ê´Â´Ù.
6.1 ij½ºÆÃ(ÀÚ·áÇüÀÇ °Á¦º¯È¯)
°è¼ÓÇÏ¸é¼ ¾Ë°ÚÁö¸¸, GTK´Â ÀÚ·áÇüÀÇ °Á¦º¯È¯ ½Ã½ºÅÛÀ» ¾´´Ù. À̰ÍÀº ÁÖ¾îÁø
´ë»óÀ» ij½ºÆÃÇÏ´Â ´É·ÂÀ» Å×½ºÆ®ÇÒ ¶§³ª, ±×¸®°í ij½ºÆÃÀ» ½ÇÇàÇÒ ¶§³ª, ¾ðÁ¦³ª
¸ÅÅ©·Î¸¦ ÀÌ¿ëÇÔÀ¸·Î½á ÀÌ·ç¾îÁø´Ù. ¿ì¸®°¡ º¸°Ô µÉ ¸î¸îÀº ´ÙÀ½°ú °°´Ù.
- GTK_WIDGET(widget)
- GTK_OBJECT(object)
- GTK_SIGNAL_FUNC(function)
- GTK_CONTAINER(container)
- GTK_WINDOW(window)
- GTK_BOX(box)
À̰͵éÀº ¸ðµÎ ÇÔ¼öÀÇ ÀÎÀÚµéÀ» ij½ºÆ®Çϱâ À§ÇØ ¾²¿´´Ù. ¿ì¸®´Â À̵éÀ»
¿¹Á¦µé¿¡¼ º¼ °ÍÀ̸ç, ÇÔ¼öÀÇ ¼±¾ðºÎ¸¦ º¸´Â °Í¸¸À¸·Î ±×µéÀ» ÀÌ¿ëÇÒ ¶§¸¦ ¸»ÇÒ
¼ö ÀÖÀ» °ÍÀÌ´Ù.
¾Æ·¡ÀÇ Å¬·¡½º °èÃþ±¸Á¶¿¡¼ º¼ ¼ö ÀÖµíÀÌ, ¸ðµç GtkWidgetµéÀº ±â¹ÝŬ·¡½ºÀÎ
GtkObject¿¡¼ ÆÄ»ýµÈ °ÍÀÌ´Ù. À̰ÍÀº ¾î¶² ÇÔ¼ö°¡ object¸¦ ¿ä±¸ÇÒ ¶§ ¾îµð¼
µçÁö widgetÀ» ÀÌ¿ëÇÒ ¼ö ÀÖÀ½À» ÀǹÌÇÑ´Ù - ´Ü¼øÈ÷ GTK_OBJECT() ¸ÅÅ©·Î¸¦
ÀÌ¿ëÇØ¼. ¿¹¸¦ µé¾î º¸ÀÚ.
gtk_signal_connect(GTK_OBJECT(button), "clicked",
GTK_SIGNAL_FUNC(callback_function), callback_data);
À̰ÍÀº ¹öưÀ» ÇϳªÀÇ object·Î ij½ºÆ®Çϰí, ÇÔ¼ö Æ÷ÀÎÅ͸¦ callbackÀ¸·Î
ij½ºÆ®ÇÑ´Ù.
¸¹Àº widgetµéÀº ¶ÇÇÑ ÄÁÅ×À̳ʴÙ. ¾Æ·¡ÀÇ Å¬·¡½º °èÃþ±¸Á¶¸¦ º¸¸é »ó´ç¼öÀÇ
widgetµéÀÌ GtkContainer¿¡¼ ÆÄ»ýµÇ¾úÀ½À» ¾Ë ¼ö ÀÖÀ» °ÍÀÌ´Ù. ±×µé Áß ¾î¶²
widgetÀÌ¶óµµ ÄÁÅ×À̳ʸ¦ ¿ä±¸ÇÏ´Â ÇÔ¼ö¿¡ ³Ñ°ÜÁÖ±â À§ÇØ GTK_CONTAINER ¸ÅÅ©·Î¸¦
ÀÌ¿ëÇÒ ¼ö ÀÖ´Ù.
ºÒÇàÇϰԵµ ÀÌ·± ¸ÅÅ©·ÎµéÀº ÀÌ ¹®¼¿¡¼ ±¤¹üÀ§ÇÏ°Ô ´Ù·ç¾îÁöÁö ¾Ê¾Ò´Ù. ³ª´Â
¿©·¯ºÐÀÌ GTKÀÇ Çì´õÆÄÀϵéÀ» »ìÆìº¸±â¸¦ ±ÇÇÑ´Ù. »ç½Ç, ÇÔ¼öÀÇ ¼±¾ðºÎ¸¦ º¸¸é¼
widgetÀÌ ¾î¶»°Ô ÀÛ¿ëÇÏ´ÂÁö °øºÎÇÏ´Â °ÍÀº ±×¸® ¾î·ÆÁö ¾Ê´Ù.
6.2 WidgetÀÇ °èÃþ±¸Á¶
¿©·¯ºÐÀÌ Âü°íÇÒ ¼ö ÀÖµµ·Ï, ¿©±â 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
| `GtkCTree
| +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
6.3 À©µµ¿Í ¹«°üÇÑ widget
¿©±âÀÇ widgetµéÀº °ü·ÃµÈ À©µµ°¡ ¾ø´Â °ÍµéÀÌ´Ù. ¸¸¾à ¾î¶² À̺¥Æ®¸¦ Æ÷Âø
ÇÏ·Á¸é GtkEventBox¸¦ ÀÌ¿ëÇØ¾ß ÇÒ °ÍÀÌ´Ù.
The EventBox Widget¿¡ ´ëÇÑ sectionÀ»
ÂüÁ¶Ç϶ó.
GtkAlignment
GtkArrow
GtkBin
GtkBox
GtkImage
GtkItem
GtkLabel
GtkPaned
GtkPixmap
GtkScrolledWindow
GtkSeparator
GtkTable
GtkViewport
GtkAspectFrame
GtkFrame
GtkVPaned
GtkHPaned
GtkVBox
GtkHBox
GtkVSeparator
GtkHSeparator
¿ì¸®´Â °¢°¢ÀÇ widgetÀ» Â÷·Ê·Î ½ÃÇèÇÏ°í ±×µéÀ» º¸ÀÏ ¼ö ÀÖ´Â °£´ÜÇÑ ÇÔ¼öµéÀ»
¸¸µé¾î °¡¸ç GTK¿¡ ´ëÇÑ Å½±¸¸¦ °è¼ÓÇÒ °ÍÀÌ´Ù. ¶Ç´Ù¸¥ ÈǸ¢ÇÑ ¼Ò½º´Â GTK¿Í
ÇÔ²² ¹èÆ÷µÈ testgtk.c ÀÌ´Ù. ±×°ÍÀº gtk/testgtk.c ¿¡¼ ãÀ» ¼ö ÀÖÀ» °ÍÀÌ´Ù.
7.1 º¸ÅëÀÇ ¹öư
¿ì¸®´Â ¹öưwidget¿¡ ´ëÇØ¼´Â °ÅÀÇ º¸¾Æ¿Ô´Ù. ±×°ÍÀº »ó´çÈ÷ °£´ÜÇÏ´Ù.
±×·±µ¥ ¹öưÀ» ¸¸µå´Âµ¥´Â µÎ°¡Áö ¹æ¹ýÀÌ ÀÖ´Ù. ¿ì¸®´Â ¶óº§ÀÌ ÀÖ´Â ¹öưÀ»
¸¸µé±â À§ÇØ gtk_button_new_with_labe()À» ÀÌ¿ëÇÒ ¼ö ÀÖ°í, ºó ¹öưÀ» ¸¸µé±â
À§ÇØ gtk_button_new()¸¦ ÀÌ¿ëÇÒ ¼öµµ ÀÖ´Ù. ±×·± ´ÙÀ½ ±×°Í¿¡ ¶óº§À» ºÙÀ̵çÁö
ÇȽº¸ÊÀ» ºÙÀ̵çÁö ÇÏ´Â °ÍÀº ¿©·¯ºÐ¿¡°Ô ´Þ·ÁÀÖ´Ù. ±×·¸°Ô ÇÏ·Á¸é »õ·Î¿î
¹Ú½º¸¦ ¸¸µé°í gtk_box_pack_start·Î½á ÀÌ ¹Ú½º ¾È¿¡ ¿ì¸®ÀÇ object¸¦ ÆÐÅ·Çϸç,
±× ´ÙÀ½¿£ gtk_container_add·Î½á ±× ¹Ú½º¸¦ ¹öư ¾ÈÀ¸·Î ÆÐÅ·ÇÏ¸é µÈ´Ù.
ÀÌ ¿¹Á¦´Â gtk_button_new¸¦ ÀÌ¿ëÇÏ¿© ±×¸²°ú ¶óº§ÀÌ ÀÖ´Â ¹öưÀ» ¸¸µç´Ù.
¹Ú½º¸¦ ¸¸µå´Â Äڵ尡 ´Ù¸¥ °Íµé·ÎºÎÅÍ ¶³¾îÁ® ³ª¿Í ÀÖÀ¸¸ç ¿©·¯ºÐÀÇ ÇÁ·Î±×·¥
¿¡¼ ±×°ÍÀ» ÀÌ¿ëÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
/* buttons.c */
#include <gtk/gtk.h>
/* À̹ÌÁö¿Í ±×°Í¿¡ ÆÐÅ·µÈ ¶óº§À» °¡Áö°í ÀÖ´Â hbox¸¦ Çϳª ¸¸µç´Ù.
* ±×¸®°í ±× ¹Ú½º¸¦ ¸®ÅÏÇÑ´Ù. */
GtkWidget *xpm_label_box (GtkWidget *parent, gchar *xpm_filename, gchar *label_text)
{
GtkWidget *box1;
GtkWidget *label;
GtkWidget *pixmapwid;
GdkPixmap *pixmap;
GdkBitmap *mask;
GtkStyle *style;
/* xpm°ú ¶óº§À» À§ÇÑ ¹Ú½º¸¦ ¸¸µç´Ù. */
box1 = gtk_hbox_new (FALSE, 0);
gtk_container_border_width (GTK_CONTAINER (box1), 2);
/* ¹öưÀÇ ½ºÅ¸ÀÏÀ» ÃëÇÑ´Ù.. background »ö±òÀ» ÃëÇÏ´Â °Í °°Àºµ¥,
* ¾Æ´Ï¶ó¸é ´©±º°¡ ³ª¿¡°Ô Á¤Á¤ÇØ ÁÖ±æ ¹Ù¶õ´Ù. */
style = gtk_widget_get_style(parent);
/* xpm ÆÄÀϷκÎÅÍ ÇȽº¸ÊÀ» ¸¸µç´Ù. */
pixmap = gdk_pixmap_create_from_xpm (parent->window, &mask,
&style->bg[GTK_STATE_NORMAL],
xpm_filename);
pixmapwid = gtk_pixmap_new (pixmap, mask);
/* ¹öưÀ» À§ÇÑ ¶óº§À» ¸¸µç´Ù. */
label = gtk_label_new (label_text);
/* ¹Ú½º ¾ÈÀ¸·Î ÇȽº¸Ê°ú ¶óº§À» ÆÐÅ·ÇØ ³Ö´Â´Ù. */
gtk_box_pack_start (GTK_BOX (box1),
pixmapwid, FALSE, FALSE, 3);
gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 3);
gtk_widget_show(pixmapwid);
gtk_widget_show(label);
return (box1);
}
/* ¿ì¸®ÀÇ ÀüÇüÀûÀÎ callback ÇÔ¼ö´Ù. */
void callback (GtkWidget *widget, gpointer data)
{
g_print ("Hello again - %s was pressed\n", (char *) data);
}
int main (int argc, char *argv[])
{
/* GtkWidgetÀº widgetµéÀ» À§ÇÑ ±â¾ïÀå¼Ò Á¾·ù´Ù. */
GtkWidget *window;
GtkWidget *button;
GtkWidget *box1;
gtk_init (&argc, &argv);
/* À©µµ¸¦ Çϳª ¸¸µç´Ù. */
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_title (GTK_WINDOW (window), "Pixmap'd Buttons!");
/* ¸ðµç À©µµµé¿¡ ´ëÇØ ÀÌ·¸°Ô ÇØÁÖ´Â °ÍÀÌ ÁÁÀ» °ÍÀÌ´Ù. */
gtk_signal_connect (GTK_OBJECT (window), "destroy",
GTK_SIGNAL_FUNC (gtk_exit), NULL);
/* À©µµÀÇ border width¸¦ ¼¼ÆÃÇÑ´Ù. */
gtk_container_border_width (GTK_CONTAINER (window), 10);
/* »õ·Î¿î ¹öưÀ» Çϳª ¸¸µç´Ù. */
button = gtk_button_new ();
/* ÀÌÂë¿¡¼ ÀÌ ÇÔ¼ö¸¦ ¾²´Â °ÍÀ» ±â¾ïÇ϶ó. */
gtk_signal_connect (GTK_OBJECT (button), "clicked",
GTK_SIGNAL_FUNC (callback), (gpointer) "cool button");
/* ¹Ú½º¸¦ ¸¸µå´Â ÇÔ¼ö´Ù. */
box1 = xpm_label_box(window, "info.xpm", "cool button");
/* ¿ì¸® widgetµéÀ» ÆÐÅ·Çϰí, º¸¿©ÁØ´Ù. */
gtk_widget_show(box1);
gtk_container_add (GTK_CONTAINER (button), box1);
gtk_widget_show(button);
gtk_container_add (GTK_CONTAINER (window), button);
gtk_widget_show (window);
/* ¿©±â¼ºÎÅÍ´Â ¹º°¡ Àç¹ÌÀÖ´Â ÀÏÀÌ ½ÃÀÛµÉ ¶§±îÁö ¹«ÀÛÁ¤ ±â´Ù¸°´Ù. */
gtk_main ();
return 0;
}
xpm_label_box ÇÔ¼ö´Â ÄÁÅ×À̳ʰ¡ µÉ ¼ö ÀÖ´Â ¾î¶² widget¿¡¶óµµ ÇȽº¸Ê°ú
¶óº§À» ÆÐÅ·Çϱâ À§ÇÏ¿© ¾²¿©Áú ¼ö ÀÖÀ» °ÍÀÌ´Ù.
7.2 Åä±Û ¹öư
Åä±Û¹öưÀº Ŭ¸¯¿¡ ÀÇÇØ ÅÃÀϵǴ µÎ°¡Áö Áß ¾î´À ÇÑ »óÅ¿¡ ÀÖ¾î¾ß ÇÑ´Ù´Â
Á¡¸¸ »«´Ù¸é º¸Åë ¹öư°ú ¸Å¿ì À¯»çÇÏ´Ù. ±×°ÍÀº ´·ÁÁø »óÅ·ΠÀÖ´Ù°¡µµ,
¿ì¸®°¡ ´Ù½Ã Ŭ¸¯ÇØ ÁÖ¸é ´Ù½Ã Æ¢¾î³ª¿À°Ô µÉ ¼ö ÀÖ´Ù. ¶Ç Ŭ¸¯ÇÏ¸é ±×°ÍÀº
´Ù½Ã ´·¯Á® µé¾î°¥ °ÍÀÌ´Ù.
Åä±Û¹öư¿¡ ¾²ÀÌ´Â ¸¹Àº ÇÔ¼öµéÀÌ ¶óµð¿À¿Í üũ ¹öư¿¡ ÀÇÇØ »ó¼ÓµÇ¾î
¾²À̵íÀÌ, Åä±Û¹öưÀº üũ¹öư°ú ¶óµð¿À¹öưÀÇ ±â¹ÝÀÌ µÈ´Ù. À̰͵éÀ» Á¢ÇϰÔ
µÇ¸é ÀÌ Á¡À» ´Ù½Ã ÁöÀûÇÒ °ÍÀÌ´Ù.
»õ·Î¿î Åä±Û¹öưÀ» ¸¸µé·Á¸é À̰ÍÀ» ÀÌ¿ëÇÑ´Ù.
GtkWidget* gtk_toggle_button_new (void);
GtkWidget* gtk_toggle_button_new_with_label (gchar *label);
ÃßÃøÇÒ ¼ö ÀÖ°ÚÁö¸¸, À̰ÍÀº º¸Åë¹öư widgetÀÇ È£Ãâ°ú ¶È°°ÀÌ ÀÛ¿ëÇÑ´Ù.
ù¹øÂ° °ÍÀº ºó Åä±Û¹öưÀ», ±×¸®°í µÎ¹øÂ° °ÍÀº ÀÌ¹Ì ¶óº§widgetÀÌ ÆÐÅ·µÇ¾î
ÀÖ´Â ¹öưÀ» ¸¸µç´Ù.
Åä±Û¹öư°ú ¶óµð¿À¹öư, üũ¹öưÀÇ »óŸ¦ µÇµ¹¸®±â À§ÇØ, ¿ì¸®´Â ¾Æ·¡ÀÇ
¿¹Á¦¿¡¼ º¸¿©Áú ¸ÅÅ©·Î¸¦ ÀÌ¿ëÇÑ´Ù. À̰ÍÀº ¾î¶² callback¿¡¼ Åä±ÛÀÇ »óŸ¦
Å×½ºÆ®ÇÑ´Ù. Åä±Û¹öư¿¡ ÀÇÇØ ¹ß»ýÇÏ´Â ½Ã±×³ÎÀº (Åä±Û/üũ/¶óµð¿À ¹öư
widgetµé) "toggled" ½Ã±×³ÎÀÌ´Ù. ÀÌ ¹öưµéÀÇ »óŸ¦ üũÇÏ·Á¸é ÀÌ toggled
½Ã±×³ÎÀ» Àâ¾Æ³»µµ·Ï ½Ã±×³Î Çڵ鷯¸¦ ¼Â¾÷Çϰí, ±×°ÍÀÇ »óŸ¦ °áÁ¤Çϱâ À§ÇÑ
¸ÅÅ©·Î¸¦ ÀÌ¿ëÇÑ´Ù. ±× callbackÀº ÀÌ·± ¸ð¾çÀÇ °ÍÀÌ´Ù.
void toggle_button_callback (GtkWidget *widget, gpointer data)
{
if (GTK_TOGGLE_BUTTON (widget)->active)
{
/* ÄÁÆ®·ÑÀÌ ¿©±â·Î ¿À¸é, Åä±Û¹öưÀÇ »óÅ´ upÀÌ´Ù. */
} else {
/* Åä±Û¹öưÀº downÀÌ´Ù. */
}
}
void gtk_toggle_button_set_state (GtkToggleButton *toggle_button,
gint state);
À§ÀÇ È£ÃâÀº Åä±Û¹öư°ú, ±×°Í¿¡¼ ÆÄ»ýµÇ´Â ¶óµð¿À¿Í üũ¹öưÀÇ »óŸ¦
¼¼ÆÃÇϱâ À§ÇØ ¾²ÀÏ ¼ö ÀÖ´Ù. ù¹øÂ° ÀÎÀÚ·Î ¿ì¸®°¡ ¸¸µç ¹öưÀ» ³Ñ°ÜÁÖ°í,
±×¸®°í ±×°ÍÀÌ ´¸° »óÅÂÀÎÁö ¾Æ´ÑÁö¸¦ ±¸º°Çϱâ À§ÇØ µÎ¹øÂ° ÀÎÀÚ¸¦ TRUE ¶Ç´Â
FALSE·Î ³Ñ°ÜÁØ´Ù. µðÆúÆ®´Â ¾È ´·¯Áø »óÅÂ, Áï FALSEÀÌ´Ù.
¿ì¸®°¡ gtk_toggle_button_set_state()ÇÔ¼ö¸¦ ¾²¸é ¹öư¿¡¼ "clicked"½Ã±×³ÎÀÌ
¹ß»ýÇØ¼ ¹öưÀÇ »óŰ¡ ½ÇÁ¦·Î º¯ÇÏ°Ô µÊÀ» ±â¾ïÇÏÀÚ.
void gtk_toggle_button_toggled (GtkToggleButton *toggle_button);
À̰ÍÀº °£´ÜÈ÷ ¹öưÀ» Åä±ÛÇϰí, "toggled"½Ã±×³ÎÀ» ¹ß»ý½ÃŲ´Ù.
7.3 üũ¹öư
üũ¹öưÀº À§¿¡ ÀÖ´Â Åä±Û¹öư¿¡¼ ¸¹Àº Ư¼º°ú ÇÔ¼öµéÀ» »ó¼Ó¹Þ¾ÒÁö¸¸ ´Ù¼Ò
´Ù¸£°Ô º¸ÀδÙ. À̰ÍÀº ¹öư°ú ±× ¾ÈÀÇ ÅØ½ºÆ®·Î Àִٱ⺸´Ù´Â, ÅØ½ºÆ® ¿·¿¡
ÀÖ´Â ÀÛÀº »ç°¢ÇüÀ̶ó°í ÇÒ ¼ö ÀÖ´Ù. À̵éÀº ¾î¶² ¾îÇÿ¡¼ Åä±ÛµÇ´Â ¿É¼ÇÀ¸·Î¼
¸¹ÀÌ ºÃÀ» °ÍÀÌ´Ù.
À̰ÍÀ» ¸¸µå´Â µÎ°¡Áö ÇÔ¼ö´Â º¸Åë¹öư¿¡¼¿Í ¸¶Âù°¡Áö´Ù.
GtkWidget* gtk_check_button_new (void);
GtkWidget* gtk_check_button_new_with_label (gchar *label);
new_with_labelÇÔ¼ö´Â ¿·¿¡ ÅØ½ºÆ® ¶óº§À» °¡Áö°í Àִ üũ¹öưÀ» ¸¸µç´Ù.
üũ¹öưÀÇ »óŸ¦ üũÇÏ´Â °ÍÀº Åä±Û¹öư¿¡¼¿Í °°´Ù.
7.4 ¶óµð¿À¹öư
¶óµð¿À¹öưÀº ±×µéÀÌ ±×·ìȵǾî ÀÖ¾î¼ ÇÑ ¹ø¿¡ ¿ÀÁ÷ Çϳª¾¿¸¸ ¼±ÅÃ/º¹±ÍµÉ ¼ö
ÀÖ´Ù´Â Á¡¸¸ »©°í´Â üũ¹öư°ú À¯»çÇÏ´Ù. À̰ÍÀº ¾îÇÃÀÌ ¿É¼ÇÀÇ ¸®½ºÆ®¿¡¼
Çϳª¸¦ ¼±ÅÃÇϵµ·Ï ÇÏ´Â °æ¿ì¿¡ ¾²À̸é ÁÁÀ» °ÍÀÌ´Ù.
»õ·Î¿î ¶óµð¿À¹öưÀ» ¸¸µå´Â µ¥ ¾²´Â ÇÔ¼öµéÀÌ´Ù.
GtkWidget* gtk_radio_button_new (GSList *group);
GtkWidget* gtk_radio_button_new_with_label (GSList *group,
gchar *label);
ÀÌ È£Ãâµé¿¡´Â ´Ù¼Ò ´Ù¸¥ ÀÎÀÚ°¡ ÀÖ´Ù´Â °ÍÀ» ´«¿©°Ü º¸ÀÚ. À̵éÀº ÀûÀýÈ÷
ÀÓ¹«¸¦ ¼öÇàÇÒ ±×·ìÀ» ÇÊ¿ä·Î ÇÑ´Ù. ù¹øÂ° ÇÔ¼ö´Â ù¹øÂ° ÀÎÀÚ·Î NULLÀ» ³Ñ°Ü
Áà¾ß ÇÑ´Ù. ±×¸®°í ¿ì¸®´Â À̰ÍÀ» ÀÌ¿ëÇÏ¿© ±×·ìÀ» ¸¸µç´Ù.
GSList* gtk_radio_button_group (GtkRadioButton *radio_button);
±×¸®°í´Â ÀÌ ±×·ìÀ» gtk_radio_button_new ¶Ç´Â gtk_radio_button_new_with_
label¿¡ ù¹øÂ° ÀÎÀÚ·Î ³Ñ°ÜÁØ´Ù. ´ÙÀ½À» ÀÌ¿ëÇØ¼ ¾î¶² ¹öưÀÌ µðÆúÆ®·Î
´·¯Áö°Ô µÇ´ÂÁö¸¦ ºÐ¸íÈ÷ ÇØµÎ´Â °Íµµ ÁÁÀº »ý°¢ÀÌ´Ù.
void gtk_toggle_button_set_state (GtkToggleButton *toggle_button,
gint state);
À̰ÍÀº Åä±Û¹öư¿¡ ´ëÇÑ ºÎºÐ¿¡¼ ¼³¸íµÇ¾úÀ¸¸ç, Á¤È®È÷ °°Àº ¹æ¹ýÀ» µû¸¥´Ù.
´ÙÀ½ ¿¹´Â ¼¼°³ÀÇ ¹öưÀ¸·Î ÀÌ·ç¾îÁø ±×·ìÀ» ¸¸µç´Ù.
/* radiobuttons.c */
#include <gtk/gtk.h>
#include <glib.h>
void close_application( GtkWidget *widget, gpointer data ) {
gtk_main_quit();
}
main(int argc,char *argv[])
{
static GtkWidget *window = NULL;
GtkWidget *box1;
GtkWidget *box2;
GtkWidget *button;
GtkWidget *separator;
GSList *group;
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_window_set_title (GTK_WINDOW (window), "radio buttons");
gtk_container_border_width (GTK_CONTAINER (window), 0);
box1 = gtk_vbox_new (FALSE, 0);
gtk_container_add (GTK_CONTAINER (window), box1);
gtk_widget_show (box1);
box2 = gtk_vbox_new (FALSE, 10);
gtk_container_border_width (GTK_CONTAINER (box2), 10);
gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
gtk_widget_show (box2);
button = gtk_radio_button_new_with_label (NULL, "button1");
gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
gtk_widget_show (button);
group = gtk_radio_button_group (GTK_RADIO_BUTTON (button));
button = gtk_radio_button_new_with_label(group, "button2");
gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (button), TRUE);
gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
gtk_widget_show (button);
group = gtk_radio_button_group (GTK_RADIO_BUTTON (button));
button = gtk_radio_button_new_with_label(group, "button3");
gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
gtk_widget_show (button);
separator = gtk_hseparator_new ();
gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
gtk_widget_show (separator);
box2 = gtk_vbox_new (FALSE, 10);
gtk_container_border_width (GTK_CONTAINER (box2), 10);
gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
gtk_widget_show (box2);
button = gtk_button_new_with_label ("close");
gtk_signal_connect_object (GTK_OBJECT (button), "clicked",
GTK_SIGNAL_FUNC(close_application),
GTK_OBJECT (window));
gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
gtk_widget_grab_default (button);
gtk_widget_show (button);
gtk_widget_show (window);
gtk_main();
return(0);
}
´ÙÀ½ ¹®Àå°ú °°Àº ½ÄÀ¸·Î ¾î¶² º¯¼ö Çϳª°¡ ¹öưµéÀÇ ¸®½ºÆ®¸¦ °¡Áö°í ÀÖ¾î¾ßÇÒ
Çʿ䰡 ¾øµµ·Ï ÁÙ¿© ¾µ ¼öµµ ÀÖ´Ù.
button2 = gtk_radio_button_new_with_label(
gtk_radio_button_group (GTK_RADIO_BUTTON (button1)),
"button2");
8.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);
ù¹øÂ° ÀÎÀÚ´Â ¸¸µé¾îÁ³´ø ¶óº§À̰í, µÎ¹øÂ°´Â µÇ»ì¸®°íÀÚ ÇÏ´Â ¹®ÀÚ¿ÀÌ´Ù.
8.2 dz¼± µµ¿ò¸»(tooltip widget)
¸¶¿ì½ºÆ÷ÀÎÅ͸¦ ¾î¶² ¹öưÀ̳ª ´Ù¸¥ widget À§¿¡ ¸î ÃÊ ¸Ó¹«¸£°Ô Çϸé ÀÛÀº
ÅØ½ºÆ® ¹®ÀÚ¿ÀÌ Æ¢¾î³ª¿À´Â °æ¿ì°¡ ÀÖ´Ù. À̰ÍÀº °£´ÜÇÑ °ÍÀ̸ç, ±×·¡¼
¿©±â¼ ¿¹Á¦¾øÀÌ ¼³¸íÇϰڴÙ. ½ÇÁ¦·Î Äڵ带 º¸°í½Í´Ù¸é GDK¿Í ÇÔ²² ¹èÆ÷µÇ´Â
testgtk.c ÇÁ·Î±×·¥À» ÂüÁ¶Ç϶ó.
¶óº§ µî ¾î¶² widget¿¡´Â ÀÌ tooltipÀÌ ¾²ÀÌÁö ¾Ê´Â´Ù.
¿ì¸®°¡ óÀ½ ÀÌ¿ëÇÒ ÇÔ¼ö´Â »õ·Î¿î tooltipÀ» ¸¸µå´Â °ÍÀÌ´Ù. À̰ÍÀº ÁÖ¾îÁø
ÇÔ¼ö¿¡¼ Çѹø¸¸ ÇØÁÖ¸é µÈ´Ù. ÀÌ ÇÔ¼ö°¡ ¸®ÅÏÇÏ´Â GtkTooltipÀº
´ÙÁßÀÇ tooltipµéÀ» ¸¸µå´Âµ¥µµ ÀÌ¿ëµÉ ¼ö ÀÖ´Ù.
GtkTooltips *gtk_tooltips_new (void);
ÀÏ´Ü »õ·Î¿î tooltip°ú ±×°ÍÀ» »ç¿ëÇÒ widgetÀ» ¸¸µé¾úÀ¸¸é, ±×°ÍÀ» ¼¼ÆÃÇϱâ
À§ÇØ ÀÌ ÇÔ¼ö¸¦ ÀÌ¿ëÇ϶ó.
void gtk_tooltips_set_tip (GtkTooltips *tooltips,
GtkWidget *widget,
const gchar *tip_text,
const gchar *tip_private);
ù¹øÂ° ÀÎÀÚ´Â ¿ì¸®°¡ ¸¸µç tooltipÀ̰í, ´ÙÀ½Àº ÀÌ tooltipÀ» Æ÷ÇÔÇÏ°Ô µÉ
widgetÀÌ´Ù. ¼¼¹øÂ° ÀÎÀÚÀÎ ÅØ½ºÆ®´Â ¿ì¸®°¡ tooltip¿¡¼ ¸»ÇϰíÀÚ ÇÏ´Â
°ÍÀÌ´Ù. ¸¶Áö¸· ÀÎÀÚ´Â NULL·Î ÁÙ ¼ö ÀÖ´Ù.
À̰ÍÀº ªÀº ¿¹´Ù.
GtkTooltips *tooltips;
GtkWidget *button;
...
tooltips = gtk_tooltips_new ();
button = gtk_button_new_with_label ("button 1");
...
gtk_tooltips_set_tip (tooltips, button, "This is button 1", NULL);
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¿¡ °ü·ÃµÈ ÇÔ¼ö´Â À̰ÍÀÌ ÀüºÎ´Ù. ´õÀÌ»ó ¾Ë °Íµµ ¾ø´Ù. :)
8.3 ÁøÇื´ë(progress bar)
ÁøÇื´ë´Â ÀÛ¾÷ÀÇ »óȲÀ» ³ªÅ¸³»±â À§ÇØ ¾²ÀδÙ. ÀÌÁ¦ Äڵ带 º¸¸é ¾Ë°ÚÁö¸¸,
À̰ÍÀº ²Ï °£´ÜÇÏ´Ù. ±×·¯³ª ¸ÕÀú »õ·Î¿î ÁøÇื´ë¸¦ ¸¸µé¾îÁÖ´Â ÇÔ¼ö¸¦ »ìÆì
º¸´Â °ÍÀ¸·Î ½ÃÀÛÇÏÀÚ.
GtkWidget *gtk_progress_bar_new (void);
ÀÌÁ¦ ÁøÇื´ë°¡ ¸¸µé¾îÁ³°í ¿ì¸®´Â ±×°ÍÀ» ÀÌ¿ëÇÒ ¼ö ÀÖ´Ù.
void gtk_progress_bar_update (GtkProgressBar *pbar, gfloat percentage);
ù¹øÂ° ÀÎÀÚ´Â µ¿ÀÛ½Ãų ÁøÇื´ë°¡ µÇ°í, µÎ¹øÂ° ÀÎÀÚ´Â '¿Ï·áµÈ' ºÐ·®À»
³ªÅ¸³½´Ù. À̰ÍÀº ½ÇÁ¦ ¼ýÀÚ·Î 0ºÎÅÍ 1±îÁö°í, 0ºÎÅÍ 100ÆÛ¼¾Æ®¸¦ ÀǹÌÇÏ´Â
°ÍÀÌ´Ù.
ÁøÇื´ë´Â º¸Åë ŸÀӾƿôÀ̳ª ¶Ç´Â ¸ÖƼŽºÅ·ÇÏ´Â Âø°¢À» ÀÏÀ¸Å°°Ô ÇÏ´Â
ÇÔ¼öµé°ú ÇÔ²² ¾²ÀδÙ.
(section
ŸÀӾƿô, ±×¸®°í I/O¿Í Idle ÇÔ¼öµéÀ»
ÂüÁ¶Ç϶ó.)
¸ðµç °æ¿ì¿¡ gtk_progress_bar_updateÇÔ¼ö°¡ µ¿ÀÏÇÑ ¹æ½ÄÀ¸·Î ¾²ÀÌ°Ô µÈ´Ù.
À̰ÍÀº ŸÀӾƿôÀ» ÀÌ¿ëÇØ ¾÷µ¥ÀÌÆ®µÇ´Â ÁøÇื´ë¸¦ º¸ÀÎ ¿¹Á¦´Ù. À̰ÍÀº ¶ÇÇÑ
ÁøÇื´ë¸¦ ¸®¼Â, Áï ÃʱâÈÇÏ´Â ¹æ¹ýµµ º¸¿©ÁÙ °ÍÀÌ´Ù.
/* progressbar.c */
#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ÀÇ °ª¿¡ ÀÇÇØ ÁøÇื´ë¸¦ ¾÷µ¥ÀÌÆ®ÇÑ´Ù.
±×¸®°í ÁøÇื´ë¿¡ ´ëÇØ ¾Ë °ÍÀº À̰ÍÀÌ ÀüºÎ´Ù, Áñ°Üº¸±â¸¦ !
8.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¿µ¿ª¿£ »ç¿ëÀÚ¿¡°Ô ¹°¾îº¸°Å³ª ¿¡·¯¸Þ½ÃÁö¸¦ ³»°Å³ª ÇÏ´Â
¸ñÀûÀÇ ¶óº§À» ¸¸µé ¼ö ÀÖÀ» °ÍÀÌ´Ù. ±×¸®°í ³ª¼ »ç¿ëÀÚÀÇ ¼±Åÿ¡ µû¶ó
ÀÛµ¿Çϵµ·Ï ¹öư °¢°¢¿¡ ¼·Î ´Ù¸¥ ½Ã±×³ÎÀ» ¼³Á¤ÇØ µÑ ¼ö ÀÖ´Ù.
8.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 );
ÇȽº¸ÊÀ» ÀÌ¿ëÇÒ ¶§ ´ÜÁ¡ Çϳª´Â À̹ÌÁö¿¡ °ü°è¾øÀÌ ¸ðµç ´ë»óÀÌ Á÷»ç°¢Çü
À̶ó´Â °ÍÀÌ´Ù. ¿ì¸®´Â µ¥½ºÅ©Åé°ú ¾îÇÿ¡¼ ¾ÆÀÌÄÜÀÌ Á»´õ ÀÚ¿¬½º·¯¿î ¸ð¾çÀ»
°¡Áöµµ·Ï Çϰí½Í´Ù. ¿¹¸¦µé¾î ¾î¶² °ÔÀÓ ÀÎÅÍÆäÀ̽º¿¡¼, ¿ì¸®´Â ´©¸¦ ¹öưÀÌ
µÕ±Ù ¸ð¾çÀ» °¡Áöµµ·Ï ÇÏ°í ½Í¾îÇÑ´Ù. ÀÌ·¸°Ô Çϱâ À§Çؼ´Â ƯÁ¤ÇÑ ¸ð¾çÀ» °®Ãá
À©µµ¸¦ ÀÌ¿ëÇÑ´Ù.
ƯÁ¤ÇÑ ¸ð¾çÀ» °®Ãá À©µµ¶õ °£´ÜÈ÷ ¹è°æÀ» ÀÌ·ç´Â Çȼ¿µéÀÌ Åõ¸íÇÑ °ÍÀ» ¸»ÇÑ´Ù.
¹è°æ À̹ÌÁö°¡ ¿©·¯ »öÀ» ¶ì°í ÀÖ´Ù¸é, ÀÌ·¸°Ô ¿ì¸®´Â ¿ì¸®ÀÇ ¾ÆÀÌÄÜÀ» µÑ·¯½Ñ
µé¾î¸ÂÁö ¾Ê´Â °æ°èÀÎ Á÷»ç°¢ÇüÀ¸·Î °ãÃÄ ±×¸®Áö ¾Ê´Â´Ù. À̹ø ¿¹Á¦´Â ÀÌ·±
½ÄÀ¸·Î ÇØ¼ µ¥½ºÅ©Åé¿¡ ¼ö·¹¹ÙÄû À̹ÌÁö¸¦ º¸¿©ÁØ´Ù.
/* wheelbarrow.c */
#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 );
8.6 ·ê·¯(ruler)
·ê·¯ widgetÀº ÁÖ¾îÁø ÇÑ À©µµ¿¡¼ ¸¶¿ì½º Æ÷ÀÎÅÍÀÇ À§Ä¡¸¦ °¡¸®Å°´Âµ¥ ¾²ÀδÙ.
À©µµ´Â ÆøÀ» °¡·ÎÁö¸£´Â ¼öÆò ·ê·¯¿Í ³ôÀ̸¦ °¡·ÎÁö¸£´Â ¼öÁ÷·ê·¯¸¦ °¡Áú ¼ö ÀÖ´Ù.
·ê·¯ À§ÀÇ Á¶±×¸¸ »ï°¢Çü Ç¥½Ã±â(indicator)°¡ ·ê·¯¿¡ ´ëÇÑ Æ÷ÀÎÅÍÀÇ
Á¤È®ÇÑ À§Ä¡¸¦ º¸¿©ÁØ´Ù.
·ê·¯´Â ¹Ýµå½Ã ¹Ì¸® ¸ÕÀú ¸¸µé¾îÁ®¾ß¸¸ ÇÑ´Ù. ¼öÆò ¹× ¼öÁ÷ ·ê·¯´Â ´ÙÀ½ ÇÔ¼öµéÀ»
ÀÌ¿ëÇØ¼ ¸¸µé¾îÁø´Ù.
GtkWidget *gtk_hruler_new(void); /* ¼öÆò ·ê·¯ */
GtkWidget *gtk_vruler_new(void); /* ¼öÁ÷ ·ê·¯ */
·ê·¯°¡ Çѹø ¸¸µé¾îÁö¸é ÃøÁ¤´ÜÀ§¸¦ Á¤ÀÇÇÒ ¼ö ÀÖ´Ù. ·ê·¯ÀÇ ÃøÁ¤´ÜÀ§´Â
GTK_PIXELS³ª GTK_INCHES, GTK_CENTIMETERS ÁßÀÇ Çϳª°¡ µÈ´Ù.
void gtk_ruler_set_metric( GtkRuler *ruler,
GtkMetricType metric );
±âº» ¼³Á¤ ´ÜÀ§´Â GTK_PIXELSÀÌ´Ù.
gtk_ruler_set_metric( GTK_RULER(ruler), GTK_PIXELS );
¶Ç´Ù¸¥ Áß¿äÇÑ ·ê·¯ÀÇ Æ¯¼ºÀº ¾î¶»°Ô Å©±â ´ÜÀ§¸¦ ³ªÅ¸³»´À³Ä ÇÏ´Â Á¡°ú
Ç¥½Ã±â°¡ óÀ½ ¾îµð¿¡ ³õÀ̳ÄÇÏ´Â Á¡ÀÌ´Ù. À̵éÀº ´ÙÀ½ ÇÔ¼ö·Î °áÁ¤ÇÑ´Ù.
void gtk_ruler_set_range (GtkRuler *ruler,
gfloat lower,
gfloat upper,
gfloat position,
gfloat max_size);
ÀÎÀÚ lower¿Í upper´Â ·ê·¯ÀÇ ¹üÀ§¸¦ Á¤ÀÇÇϰí max_size´Â Ãâ·Â °¡´ÉÇÑ
°¡Àå Å« ¼ö¸¦ ¼³Á¤ÇÑ´Ù. PositionÀº ·ê·¯ ³»ÀÇ Ç¥½Ã±â Ãʱâ À§Ä¡ÀÌ´Ù.
800 Çȼ¿ÀÇ ¼öÁ÷ ·ê·¯´Â ÀÌ·¸°Ô µÈ´Ù.
gtk_ruler_set_range( GTK_RULER(vruler), 0, 800, 0, 800);
0ºÎÅÍ 800±îÁö ¸Å 100 Çȼ¿¸¶´Ù Ç¥Áö(marking)°¡ Ãâ·ÂµÉ °ÍÀÌ´Ù.
¸¸ÀÏ ·ê·¯ÀÇ ¹üÀ§¸¦ 7ºÎÅÍ 16À¸·Î ¹Ù²Ù·Á¸é ´ÙÀ½°ú °°ÀÌ ÇÑ´Ù.
gtk_ruler_set_range( GTK_RULER(vruler), 7, 16, 0, 20);
·ê·¯ÀÇ Ç¥½Ã±â´Â Æ÷ÀÎÅÍÀÇ »ó´ëÀûÀÎ À§Ä¡¸¦ °¡¸®Å°´Â Á¶±×¸¸ »ï°¢Çü Ç¥ÁöÀÌ´Ù.
¸¸ÀÏ ·ê·¯°¡ ¸¶¿ì½º Æ÷ÀÎÅ͸¦ µû¸£°Ô ÇÏ°í ½Í´Ù¸é motion_notify_event ½Ã±×³ÎÀÌ
·ê·¯ÀÇ motion_notify_event method¿Í ¿¬°áµÇ¾î¾ß¸¸ ÇÑ´Ù. ƯÁ¤ À©µµ ¿µ¿ª ³»ÀÇ
¸ðµç ¸¶¿ì½º ¿òÁ÷ÀÓÀ» µû¸£°Ô Çϱâ À§ÇØ ´ÙÀ½°ú °°ÀÌ ÇÑ´Ù.
#define EVENT_METHOD(i, x) GTK_WIDGET_CLASS(GTK_OBJECT(i)->klass)->x
gtk_signal_connect_object( GTK_OBJECT(area), "motion_notify_event",
(GtkSignalFunc)EVENT_METHOD(ruler, motion_notify_event),
GTK_OBJECT(ruler) );
´ÙÀ½ ¿¹Á¦´Â ¼öÆò ·ê·¯¸¦ À§¿¡ ¼öÁ÷ ·ê·¯¸¦ ¿ÞÂÊ¿¡ °¡Áø drawing area¸¦
¸¸µç´Ù. ÀÌ drawing area´Â 600 Çȼ¿ÀÇ Æø°ú 400 Çȼ¿ÀÇ ³ôÀ̸¦ °¡Áø´Ù.
¼öÆò ·ê·¯´Â 7ºÎÅÍ 13ÀÇ ¹üÀ§¿¡ ¸Å 100 Çȼ¿¸¶´Ù Ç¥Áö¸¦ Çϰí
¼öÁ÷ ·ç·¯´Â 0ºÎÅÍ 400ÀÇ ¹üÀ§¿¡ ¸¶Âù°¡Áö·Î ¸Å 100 Çȼ¿¸¶´Ù Ç¥Áö¸¦ ÇÑ´Ù.
·ê·¯µé°ú drawing areaÀÇ À§Ä¡ ¼³Á¤Àº Å×À̺íÀ» »ç¿ëÇÑ´Ù.
/* rulers.c */
#include <gtk/gtk.h>
#define EVENT_METHOD(i, x) GTK_WIDGET_CLASS(GTK_OBJECT(i)->klass)->x
#define XSIZE 600
#define YSIZE 400
/* ´Ý±â ¹öư(close button)ÀÌ ´·¯Áö¸é ÀÌ ÇÔ¼ö°¡ ºÒ¸°´Ù.
*/
void close_application( GtkWidget *widget, gpointer data ) {
gtk_main_quit();
}
/* ¸ÞÀÎ ÇÔ¼ö
*/
int main( int argc, char *argv[] ) {
GtkWidget *window, *table, *area, *hrule, *vrule;
/* gtk¸¦ ÃʱâÈÇÏ°í ¸ÞÀÎ À©µµ¸¦ ¸¸µç´Ù.*/
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);
/* ·ê·¯¿Í drawing area¸¦ ³õÀº Å×À̺íÀ» ¸¸µç´Ù */
table = gtk_table_new( 3, 2, FALSE );
gtk_container_add( GTK_CONTAINER(window), table );
area = gtk_drawing_area_new();
gtk_drawing_area_size( (GtkDrawingArea *)area, XSIZE, YSIZE );
gtk_table_attach( GTK_TABLE(table), area, 1, 2, 1, 2,
GTK_EXPAND|GTK_FILL, GTK_FILL, 0, 0 );
gtk_widget_set_events( area, GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK );
/* ¼öÆò ·ê·¯´Â °¡Àå À§¿¡ ³õÀδÙ. ¸¶¿ì½º°¡ drawing area À§¸¦ ¿òÁ÷À̸é,
motion_notify_event °¡ ·ê·¯ÀÇ ÀûÀýÇÑ À̺¥Æ® Çڵ鷯¿¡°Ô Àü´ÞµÈ´Ù.
*/
hrule = gtk_hruler_new();
gtk_ruler_set_metric( GTK_RULER(hrule), GTK_PIXELS );
gtk_ruler_set_range( GTK_RULER(hrule), 7, 13, 0, 20 );
gtk_signal_connect_object( GTK_OBJECT(area), "motion_notify_event",
(GtkSignalFunc)EVENT_METHOD(hrule, motion_notify_event),
GTK_OBJECT(hrule) );
/* GTK_WIDGET_CLASS(GTK_OBJECT(hrule)->klass)->motion_notify_event, */
gtk_table_attach( GTK_TABLE(table), hrule, 1, 2, 0, 1,
GTK_EXPAND|GTK_SHRINK|GTK_FILL, GTK_FILL, 0, 0 );
/* ¼öÁ÷ ·ê·¯´Â Á¦ÀÏ ¿ÞÂÊ¿¡ ³õÀδÙ. ¸¶¿ì½º°¡ drawing area À§¸¦ ¿òÁ÷À̸é,,
motion_notify_event °¡ ·ê·¯ÀÇ ÀûÀýÇÑ À̺¥Æ® Çڵ鷯¿¡°Ô Àü´ÞµÈ´Ù.
*/
vrule = gtk_vruler_new();
gtk_ruler_set_metric( GTK_RULER(vrule), GTK_PIXELS );
gtk_ruler_set_range( GTK_RULER(vrule), 0, YSIZE, 10, YSIZE );
gtk_signal_connect_object( GTK_OBJECT(area), "motion_notify_event",
(GtkSignalFunc)
GTK_WIDGET_CLASS(GTK_OBJECT(vrule)->klass)->motion_notify_event,
GTK_OBJECT(vrule) );
gtk_table_attach( GTK_TABLE(table), vrule, 0, 1, 1, 2,
GTK_FILL, GTK_EXPAND|GTK_SHRINK|GTK_FILL, 0, 0 );
/* ÀÌÁ¦ ¸ðµç °ÍÀ» º¸¿©ÁØ´Ù */
gtk_widget_show( area );
gtk_widget_show( hrule );
gtk_widget_show( vrule );
gtk_widget_show( table );
gtk_widget_show( window );
gtk_main();
return 0;
}
8.7 »óÅÂÇ¥½ÃÁÙ(statusbar)
»óÅÂÇ¥½ÃÁÙÀº ÅØ½ºÆ® ¸Þ½ÃÁö¸¦ º¸¿©Áִµ¥ ¾²ÀÌ´Â °£´ÜÇÑ widgetÀÌ´Ù.
ÀÌ widgetÀº ÅØ½ºÆ® ¸Þ½ÃÁöµéÀ» ½ºÅÿ¡ º¸°üÇÑ´Ù. µû¶ó¼ ÇöÀçÀÇ ¸Þ½ÃÁö¸¦ ²¨³»¸é
¹Ù·Î ÀÌÀüÀÇ ¸Þ½ÃÁö¸¦ ´Ù½Ã º¸¿©ÁÖ°Ô µÈ´Ù.
ÇÑ ¾îÇø®ÄÉÀ̼ÇÀÇ ¿©·¯ ºÎºÐµéÀÌ ¸Þ½ÃÁö¸¦ Ç¥½ÃÇϴµ¥ °°Àº »óÅÂÇ¥½ÃÁÙÀ»
»ç¿ëÇØ¾ßÇÏ´Â °æ¿ì, »óÅÂÇ¥½ÃÁÙ widgetÀº ¿©·¯ '»ç¿ëÀÚ'µéÀ» ±¸ºÐÇϴµ¥ ¾²ÀÌ´Â
Context Identifier¸¦ ¹ßÇàÇÑ´Ù. ¾î¶² context¸¦ °¡Á³´À³Ä¿¡ »ó°ü¾øÀÌ ½ºÅÃ
Á¦ÀÏ À§ÀÇ ¸Þ½ÃÁö°¡ º¸¿©Áø´Ù.
¸Þ½ÃÁöµéÀº Context IdentifierÀÇ ¼ø¼°¡ ¾Æ´Ï¶ó ³ªÁß¿¡ µé¾î°£ °ÍÀÌ ¸ÕÀú
³ª¿À´Â ¼ø¼·Î ½ºÅÿ¡ ½×ÀδÙ.
»óÅÂÇ¥½ÃÁÙÀº ´ÙÀ½ ÇÔ¼ö¸¦ ÅëÇØ ¸¸µé¾îÁø´Ù.
GtkWidget* gtk_statusbar_new (void);
»õ·Î¿î Context Identifier´Â °£´ÜÇÑ context¿¡ °üÇÑ ¼³¸í°ú ÇÔ²² ´ÙÀ½ ÇÔ¼ö¸¦
È£ÃâÇÏ¿© ¾òÀ» ¼ö ÀÖ´Ù.
guint gtk_statusbar_get_context_id (GtkStatusbar *statusbar,
const gchar *context_description);
»óÅÂÇ¥½ÃÁÙÀ» ´Ù·ç´Â ´ÙÀ½°ú °°Àº ÇÔ¼öµéÀÌ ÀÖ´Ù.
guint gtk_statusbar_push (GtkStatusbar *statusbar,
guint context_id,
gchar *text);
void gtk_statusbar_pop (GtkStatusbar *statusbar)
guint context_id);
void gtk_statusbar_remove (GtkStatusbar *statusbar,
guint context_id,
guint message_id);
¸ÕÀú gtk_statusbar_push´Â »óÅÂÇ¥½ÃÁÙ¿¡ »õ·Î¿î ¸Þ½ÃÁö¸¦ Ãß°¡Çϴµ¥ ¾²ÀδÙ.
ÀÌ ÇÔ¼ö´Â ³ªÁß¿¡ gtk_statusbar_remove¸¦ È£ÃâÇϴµ¥ ¾²ÀÏ ¼ö ÀÖ´Â
Message Identifier¸¦ ¸®ÅÏÇÑ´Ù. gtk_statusbar_remove´Â ÁÖ¾îÁø
Message¿Í Context IdentifierÀÇ ¸Þ½ÃÁö¸¦ »óÅÂÇ¥½ÃÁÙ¿¡¼ Á¦°ÅÇÑ´Ù.
gtk_statusbar_popÀº ÁÖ¾îÁø Context IdentifierÀÇ ½ºÅà Á¦ÀÏ À§ ¸Þ½ÃÁö¸¦
²¨³» »èÁ¦ÇÑ´Ù.
´ÙÀ½ ¿¹Á¦´Â ¹öư 2°³¿Í »óÅÂÇ¥½ÃÁÙ Çϳª¸¦ ¸¸µç´Ù. ºÆ° Çϳª´Â »óÅÂÇ¥½ÃÁÙ¿¡
»õ ¸Þ½ÃÁö¸¦ ³Ö°í ³ª¸ÓÁö ´Ù¸¥ ¹öưÀº ¸¶Áö¸·À¸·Î ³Ö¾îÁø ¸Þ½ÃÁö¸¦ Á¦°ÅÇÑ´Ù.
/* statusbar.c */
#include <gtk/gtk.h>
#include <glib.h>
GtkWidget *status_bar;
void push_item (GtkWidget *widget, gpointer data)
{
static int count = 1;
char buff[20];
g_snprintf(buff, 20, "Item %d", count++);
gtk_statusbar_push( GTK_STATUSBAR(status_bar), (guint) &data, buff);
return;
}
void pop_item (GtkWidget *widget, gpointer data)
{
gtk_statusbar_pop( GTK_STATUSBAR(status_bar), (guint) &data );
return;
}
int main (int argc, char *argv[])
{
GtkWidget *window;
GtkWidget *vbox;
GtkWidget *button;
int context_id;
gtk_init (&argc, &argv);
/* »õ À©µµ¸¦ Çϳª ¸¸µç´Ù */
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_widget_set_usize( GTK_WIDGET (window), 200, 100);
gtk_window_set_title(GTK_WINDOW (window), "GTK Statusbar Example");
gtk_signal_connect(GTK_OBJECT (window), "delete_event",
(GtkSignalFunc) gtk_exit, NULL);
vbox = gtk_vbox_new(FALSE, 1);
gtk_container_add(GTK_CONTAINER(window), vbox);
gtk_widget_show(vbox);
status_bar = gtk_statusbar_new();
gtk_box_pack_start (GTK_BOX (vbox), status_bar, TRUE, TRUE, 0);
gtk_widget_show (status_bar);
context_id = gtk_statusbar_get_context_id( GTK_STATUSBAR(status_bar), "Statusbar example");
button = gtk_button_new_with_label("push item");
gtk_signal_connect(GTK_OBJECT(button), "clicked",
GTK_SIGNAL_FUNC (push_item), &context_id);
gtk_box_pack_start(GTK_BOX(vbox), button, TRUE, TRUE, 2);
gtk_widget_show(button);
button = gtk_button_new_with_label("pop last item");
gtk_signal_connect(GTK_OBJECT(button), "clicked",
GTK_SIGNAL_FUNC (pop_item), &context_id);
gtk_box_pack_start(GTK_BOX(vbox), button, TRUE, TRUE, 2);
gtk_widget_show(button);
/* ´Ù¸¥ ¸ðµç °ÍµéÀÌ Çѹø¿¡ ¸ðµÎ ´Ù º¸À̵µ·Ï Çϱâ À§Çؼ
* Ç×»ó À©µµ¸¦ Á¦ÀÏ ¸¶Áö¸·¿¡ º¸¿©ÁØ´Ù. */
gtk_widget_show(window);
gtk_main ();
return 0;
}
8.8 ÅØ½ºÆ® ÀÔ·Â(text entry)
ÅØ½ºÆ® ÀÔ·Â widgetÀº ÇÑÁÙÂ¥¸® ÅØ½ºÆ® »óÀÚ ¾È¿¡ ¹®ÀÚ¸¦ ŸÀÌÇÁÇØ ³Ö°Å³ª
¶Ç´Â ±×³É º¸¿©ÁÙ ¼ö ÀÖ°Ô ÇØÁØ´Ù. ÅØ½ºÆ®´Â Çö ÀÔ·Â widgetÀÇ ³»¿ëÀ»
Ãß°¡Çϰųª ¶Ç´Â ¿ÏÀüÈ÷ ´ëüÇÏ´Â ÇÔ¼ö È£Ãâµé¿¡ ÀÇÇØ °áÁ¤µÈ´Ù.
ÅØ½ºÆ® ÀÔ·Â widgetÀ» ¸¸µå´Âµ¥´Â ´ÙÀ½ µÎ ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù.
GtkWidget* gtk_entry_new (void);
GtkWidget* gtk_entry_new_with_max_length (guint16 max);
óÀ½ °ÍÀº ´Ü¼øÈ÷ »õ·Î¿î ÀÔ·Â widgetÀ» Çϳª ¸¸µç´Ù. ±×¿¡ ¹ÝÇØ µÎ¹øÂ° °ÍÀº
ÆíÁý°¡´ÉÇÑ ÅØ½ºÆ®ÀÇ ±æÀÌ Á¦ÇÑÀ» °¡Áø ÀÔ·Â widgetÀ» ¸¸µç´Ù.
Çö ÀÔ·ÂÀÇ ÅØ½ºÆ®¸¦ º¯°æÇϴµ¥ ¾²ÀÌ´Â ¸î°¡Áö ÇÔ¼ö°¡ Á¸ÀçÇÑ´Ù.
void gtk_entry_set_text (GtkEntry *entry,
const gchar *text);
void gtk_entry_append_text (GtkEntry *entry,
const gchar *text);
void gtk_entry_prepend_text (GtkEntry *entry,
const gchar *text);
ÇÔ¼ö gtk_entry_set_textÀº ÀÔ·ÂµÈ ³»¿ëÀ» ¿ÏÀüÈ÷ º¯°æÇÑ´Ù.
ÇÔ¼ö gtk_entry_append_text¿Í gtk_entry_prepend_text´Â Çö ³»¿ëÀÇ ¾Õ ¶Ç´Â
µÚ¿¡ ¿øÇÏ´Â ÅØ½ºÆ®¸¦ µ¡ºÙÀδÙ.
´ÙÀ½ ÇÔ¼ö´Â ÇöÀçÀÇ ÅØ½ºÆ® ÀÔ·Â À§Ä¡¸¦ Á¤ÇÑ´Ù.
void gtk_entry_set_position (GtkEntry *entry,
gint position);
ÀÔ·Â widgetÀÇ ³»¿ëÀº ´ÙÀ½ ÇÔ¼ö È£Ãâ¿¡ ÀÇÇØ¼ ¾Ë ¼ö ÀÖ´Ù.
À̰ÍÀº ³ªÁß¿¡ ¼³¸íÇÒ callback ÇÔ¼ö ¾È¿¡¼ »ç¿ëÇÏ´Â °ÍÀÌ À¯¿ëÇÏ´Ù.
gchar* gtk_entry_get_text (GtkEntry *entry);
¸¸ÀÏ ÀÔ·ÂµÈ ³»¿ëÀÌ Å¸ÀÌÇο¡ ÀÇÇØ¼ º¯°æµÇ´Â °ÍÀ» ¿øÇÏÁö ¾Ê´Â´Ù¸é
ÆíÁýÀÌ ºÒ°¡´ÉÇϵµ·Ï »óŸ¦ ¹Ù²Ü ¼ö ÀÖ´Ù.
void gtk_entry_set_editable (GtkEntry *entry,
gboolean editable);
ÀÌ ÇÔ¼öÀÇ editable ÀÎÀÚ¿¡ TRUE³ª FALSE¸¦ ÁÖ¾î ÀÔ·Â widgetÀÌ ÆíÁý °¡´ÉÇÏ°Ô µÇ°Å³ª
¶Ç´Â °¡´ÉÇÏÁö ¾Êµµ·Ï º¯°æÇÒ ¼ö ÀÖ´Ù.
¸¸¾à ÆÐ½º¿öµå¸¦ ÀÔ·ÂÇÒ ¶§Ã³·³ ÀÔ·ÂÇÏ´Â ÅØ½ºÆ®°¡ º¸ÀÌÁö ¾Ê¾Æ¾ß ÇÑ´Ù¸é
boolean flag¸¦ °®´Â ´ÙÀ½ ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù.
void gtk_entry_set_visibility (GtkEntry *entry,
gboolean visible);
´ÙÀ½ ÇÔ¼ö¸¦ ½á¼ ÅØ½ºÆ®ÀÇ ÀÏÁ¤ ºÎºÐÀ» ¼±ÅÃ(selected)µÇµµ·Ï ¸¸µé ¼ö ÀÖ´Ù.
ÀÌ ±â´ÉÀº ¹Ì¸® ±âº» ÅØ½ºÆ®¸¦ Á¤ÇØ Ãâ·ÂÇϰí À̸¦ »ç¿ëÀÚ°¡ »õ·Î¿î ÀÔ·ÂÀ» À§Çؼ
°£´ÜÈ÷ Áö¿ï ¼ö ÀÖ°Ô Çϴµ¥ ÀÚÁÖ ¾²ÀδÙ.
void gtk_entry_select_region (GtkEntry *entry,
gint start,
gint end);
¸¸¾à¿¡ »ç¿ëÀÚ°¡ ÅØ½ºÆ®¸¦ ÀÔ·ÂÇÏ´Â °ÍÀ» ¾Ë¾ÆÃ¤°í ½Í´Ù¸é,
activate³ª changed ½Ã±×³ÎÀ» ¿¬°áÇÒ ¼ö ÀÖ´Ù.
Activate´Â »ç¿ëÀÚ°¡ ¿£ÅÍ۸¦ ŸÀÌÇÁÇϸé, Changed´Â ÅØ½ºÆ®°¡ ÀüºÎ ´Ù¸¥ °ÍÀ¸·Î
¹Ù²î¸é ¹ß»ýÇÑ´Ù.(¸ðµç ¹®ÀÚ°¡ ÀԷµǾú°Å³ª Áö¿öÁ³À» ¶§ µî)
´ÙÀ½Àº ÅØ½ºÆ® ÀÔ·Â widgetÀÇ ÇÑ ¿¹ÀÌ´Ù.
/* entry.c */
#include <gtk/gtk.h>
void enter_callback(GtkWidget *widget, GtkWidget *entry)
{
gchar *entry_text;
entry_text = gtk_entry_get_text(GTK_ENTRY(entry));
printf("Entry contents: %s\n", entry_text);
}
void entry_toggle_editable (GtkWidget *checkbutton,
GtkWidget *entry)
{
gtk_entry_set_editable(GTK_ENTRY(entry),
GTK_TOGGLE_BUTTON(checkbutton)->active);
}
void entry_toggle_visibility (GtkWidget *checkbutton,
GtkWidget *entry)
{
gtk_entry_set_visibility(GTK_ENTRY(entry),
GTK_TOGGLE_BUTTON(checkbutton)->active);
}
int main (int argc, char *argv[])
{
GtkWidget *window;
GtkWidget *vbox, *hbox;
GtkWidget *entry;
GtkWidget *button;
GtkWidget *check;
gtk_init (&argc, &argv);
/* create a new window */
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_widget_set_usize( GTK_WIDGET (window), 200, 100);
gtk_window_set_title(GTK_WINDOW (window), "GTK Entry");
gtk_signal_connect(GTK_OBJECT (window), "delete_event",
(GtkSignalFunc) gtk_exit, NULL);
vbox = gtk_vbox_new (FALSE, 0);
gtk_container_add (GTK_CONTAINER (window), vbox);
gtk_widget_show (vbox);
entry = gtk_entry_new_with_max_length (50);
gtk_signal_connect(GTK_OBJECT(entry), "activate",
GTK_SIGNAL_FUNC(enter_callback),
entry);
gtk_entry_set_text (GTK_ENTRY (entry), "hello");
gtk_entry_append_text (GTK_ENTRY (entry), " world");
gtk_entry_select_region (GTK_ENTRY (entry),
0, GTK_ENTRY(entry)->text_length);
gtk_box_pack_start (GTK_BOX (vbox), entry, TRUE, TRUE, 0);
gtk_widget_show (entry);
hbox = gtk_hbox_new (FALSE, 0);
gtk_container_add (GTK_CONTAINER (vbox), hbox);
gtk_widget_show (hbox);
check = gtk_check_button_new_with_label("Editable");
gtk_box_pack_start (GTK_BOX (hbox), check, TRUE, TRUE, 0);
gtk_signal_connect (GTK_OBJECT(check), "toggled",
GTK_SIGNAL_FUNC(entry_toggle_editable), entry);
gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(check), TRUE);
gtk_widget_show (check);
check = gtk_check_button_new_with_label("Visible");
gtk_box_pack_start (GTK_BOX (hbox), check, TRUE, TRUE, 0);
gtk_signal_connect (GTK_OBJECT(check), "toggled",
GTK_SIGNAL_FUNC(entry_toggle_visibility), entry);
gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(check), TRUE);
gtk_widget_show (check);
button = gtk_button_new_with_label ("Close");
gtk_signal_connect_object (GTK_OBJECT (button), "clicked",
GTK_SIGNAL_FUNC(gtk_exit),
GTK_OBJECT (window));
gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
gtk_widget_grab_default (button);
gtk_widget_show (button);
gtk_widget_show(window);
gtk_main();
return(0);
}
8.9 »ö ¼±ÅÃ(color selection)
»ö¼±Åà widgetÀº, »ç½Ç ÀüÇô ³î¶øÁö ¾Ê°ÚÁö¸¸, Á÷Á¢ »öÀ» ¼±ÅÃÇϴµ¥ ¾²ÀδÙ.
ÀÌ º¹ÇÕÀûÀÎ widgetÀº »ç¿ëÀÚ·Î ÇÏ¿©±Ý RGB(Red, Green, Blue)¿Í
HSV (Hue, Saturation, Value) ¼¼ ¿ä¼Ò¸¦ ÅëÇØ »öÀ» °í¸£°Ô ÇÑ´Ù.
ÀÌ´Â ½½¶óÀÌ´õ³ª ÀÔ·ÂâÀ» ÀÌ¿ëÇØ¼ °¢ ¿ä¼Ò¿¡ ƯÁ¤ °ªÀ» ÁÖ°ÔÇϰųª ¶Ç´Â,
hue-saturation wheel¿¡¼ Á÷Á¢ »öÀ» ¼±ÅÃÇÏ°Ô ÇÔÀ¸·Î½á
ÀÌ·ç¾îÁø´Ù. Çʿ信 µû¶ó¼´Â »öÀÇ Åõ¸íµµµµ Á¤ÇØÁÙ ¼ö ÀÖ´Ù.
ÀÌ »ö¼±Åà widgetÀº ¿ÜºÎ¿¡¼ gtk_color_selection_set_color()À» ÅëÇØ
ÁöÁ¤Ç߰ųª ¶Ç´Â »ç¿ëÀÚ°¡ Á÷Á¢ ÇöÀç »öÀ» º¯°æÇÒ ¶§¸¶´Ù
"color_changed"À̶ó´Â ´Ü ÇѰ¡ÁöÀÇ ½Ã±×³Î¸¸À» ¹ß»ý½ÃŲ´Ù.
ÀÌ »ö¼±Åà widgetÀÌ ¿ì¸®¿¡°Ô ¹«¾ùÀ» ³Ñ°ÜÁÖ¾î¾ß ÇÏ´ÂÁö º¸ÀÚ. ÀÌ widgetÀº
gtk_color_selection¿Í gtk_color_selection_dialogÀÇ µÎ ÇüŰ¡ ÀÖ´Ù.
GtkWidget *gtk_color_selection_new(void);
´ë°³ ÀÌ ÇÔ¼ö¸¸À» Á÷Á¢ ¾µ ¼ö´Â ¾ø´Ù. À̰ÍÀº ³ªÁß¿¡ ¾îµò°¡·Î ¿¬°áÀ» ½ÃÄÑÁÖ¾î¾ß¸¸
ÇÏ´Â GtkColorSelection widgetÀ» ¸¸µé µû¸§ÀÌ´Ù.
ÀÌ GtkColorSelection widgetÀº GtkVBox widget¿¡¼ »ó¼ÓµÈ °ÍÀÌ´Ù.
GtkWidget *gtk_color_selection_dialog_new(const gchar *title);
´ë°³ ÀÌ ÇÔ¼ö¸¦ »ö¼±Åà widgetÀ» ¸¸µå´Â µ¥ »ç¿ëÇÑ´Ù.
ÀÌ´Â GtkColorSelectionDialog¶ó´Â GtkDialog¿¡¼ »ó¼ÓµÈ widgetÀ» ¸¸µç´Ù.
ÀÌ widgetÀº GtkColorSelection, GtkHSeparator¿Í "Ok", "Cancel", "Help"ÀÇ
¹öư ¼¼°³¸¦ °¡Áø GtkHBoxµéÀ» Æ÷ÇÔÇÑ GtkFrame widgetÀ¸·Î ÀÌ·ç¾îÁ®ÀÖ´Ù.
GtkColorSelectionDialog structure¿¡¼ "ok_button", "cancel_button",
"help_button" widget¿¡ Á¢±ÙÇØ¼ ±× ¼¼ ¹öưµéÀ» Á÷Á¢ ´Ù·ê ¼ö ÀÖ´Ù.
(¿¹ : GTK_COLOR_SELECTION_DIALOG(colorseldialog)->ok_button)
void gtk_color_selection_set_update_policy(GtkColorSelection *colorsel,
GtkUpdateType policy);
ÀÌ ÇÔ¼ö´Â °»½Å Á¤Ã¥À» Á¤ÇÑ´Ù. ±âº» Á¤Ã¥Àº »ç¿ëÀÚ°¡ ¹«¾ùÀÌµç º¯°æÇÏ´Â
±×¶§¸¶´Ù ¹Ù·Î Áï½Ã ÇöÀçÀÇ »öÀ» °Å±â¿¡ µû¶ó ¹Ù²Ù´Â GTK_UPDATE_CONTINOUSÀÌ´Ù.
¼º´É¹®Á¦°¡ ¹ß»ýÇϸé GTK_UPDATE_DISCONTINOUS³ª GTK_UPDATE_DELAYED·Î
¹Ù²Ù¾î ÁÙ ¼ö ÀÖ´Ù.
void gtk_color_selection_set_opacity(GtkColorSelection *colorsel,
gint use_opacity);
»ö¼±Åà widgetÀº »öÀÇ Åõ¸íµµ(¾ËÆÄä³ÎÀ̶ó°íµµ ¾Ë·ÁÁø)¸¦ Á¶Á¤ÇÏ´Â ±â´Éµµ Áö¿øÇÑ´Ù.
ÀÌ ±â´ÉÀº ±âº» ¼³Á¤¿¡¼´Â ²¨Á®ÀÖ´Ù. À̰ÍÀ» »ç¿ëÇÏ·Á¸é À§ÀÇ ÇÔ¼ö¸¦
use_opacity¸¦ TRUE·Î ÇØ¼ È£ÃâÇÑ´Ù.
¸¶Âù°¡Áö·Î use_opacity¸¦ FALSE·Î ÇØ¼ È£ÃâÇϸé Åõ¸íµµ Á¶Á¤ ±â´ÉÀÌ ²¨Áø´Ù.
void gtk_color_selection_set_color(GtkColorSelection *colorsel,
gdouble *color);
»ö»ó array(gdouble)¿Í ÇÔ²² À§ ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ¿ÜºÎ¿¡¼ ÇöÀç »öÀ»
ÁöÁ¤ÇØ ÁÙ ¼ö ÀÖ´Ù. ÀÌ arrayÀÇ ±æÀÌ´Â »ö Åõ¸íµµ Á¶Á¤ ±â´ÉÀ» Äѳõ¾Ò´ÂÁö
²¨³õ¾Ò´ÂÁö¿¡ µû¶ó ´Þ¶óÁø´Ù. À§Ä¡ 0Àº »¡°£»ö, 1Àº ³ì»ö, 2´Â ÆÄ¶õ»öÀ̸ç
3Àº Åõ¸íµµÀÌ´Ù.(Åõ¸íµµ´Â ÀÌ ±â´ÉÀ» Äѳõ¾ÒÀ» ¶§¸¸ Àǹ̰¡ ÀÖ´Ù.
¾Õ¿¡¼ ³ª¿Â gtk_color_selection_set_opacity()¿¡ ´ëÇÑ ºÎºÐÀ» º¸¶ó.)
¸ðµç °ªÀº 0.0°ú 1.0 »çÀÌ¿¡ ÀÖ´Ù.
void gtk_color_selection_get_color(GtkColorSelection *colorsel,
gdouble *color);
¸¸ÀÏ 'color_changed" ½Ã±×³ÎÀ» ¹Þ¾ÒÀ» ¶§, ÇöÀç »öÀÌ ¾î¶² °ÍÀÌÁö ¾Ë°í ½Í´Ù¸é
À§ÀÇ ÇÔ¼ö¸¦ »ç¿ëÇÏ¸é µÈ´Ù. Color´Â »ö arrayÀÌ´Ù. ÀÌ »ö array¿¡ ´ëÇÑ °ÍÀº
gtk_color_selection_set_color() ÇÔ¼ö¿¡ ´ëÇÑ ºÎºÐÀ» º¸¶ó.
´ÙÀ½Àº GtkColorSelectionDialogÀ» »ç¿ëÇÏ´Â °£´ÜÇÑ ¿¹ÀÌ´Ù. ÀÌ ÇÁ·Î±×·¥Àº
drawing area¸¦ °¡Áø À©µµ Çϳª¸¦ ¸¸µç´Ù. À̰ÍÀ» Ŭ¸¯Çϸé
color selection dialog°¡ ¶á´Ù. À̸¦ Á¶Á¤Çؼ ¹è°æ»öÀ» ¹Ù²Ü ¼ö ÀÖ´Ù.
#include <glib.h>
#include <gdk/gdk.h>
#include <gtk/gtk.h>
GtkWidget *colorseldlg = NULL;
GtkWidget *drawingarea = NULL;
/* »öÀÌ ¹Ù²î¸é ÀÌ ÇÔ¼ö¸¦ ºÎ¸¥´Ù. */
void color_changed_cb (GtkWidget *widget, GtkColorSelection *colorsel)
{
gdouble color[3];
GdkColor gdk_color;
GdkColormap *colormap;
/* drawing areaÀÇ colormapÀ» ¾ò´Â´Ù */
colormap = gdk_window_get_colormap (drawingarea->window);
/* ÇöÀç »öÀ» ¾ò´Â´Ù */
gtk_color_selection_get_color (colorsel,color);
/* unsigned 16 bit Á¤¼ö(0..65535)·Î ¹Ù²ã¼ GdkColor¿¡ ³Ö´Â´Ù */
gdk_color.red = (guint16)(color[0]*65535.0);
gdk_color.green = (guint16)(color[1]*65535.0);
gdk_color.blue = (guint16)(color[2]*65535.0);
/* »öÀ» ÇÒ´çÇÑ´Ù */
gdk_color_alloc (colormap, &gdk_color);
/* À©µµÀÇ ¹è°æ»öÀ» Á¤ÇÑ´Ù */
gdk_window_set_background (drawingarea->window, &gdk_color);
/* À©µµ¸¦ Áö¿î´Ù */
gdk_window_clear (drawingarea->window);
}
/* Drawingarea event handler */
gint area_event (GtkWidget *widget, GdkEvent *event, gpointer client_data)
{
gint handled = FALSE;
GtkWidget *colorsel;
/* ¹öưÀÌ ´·¯Á³´ÂÁö È®ÀÎÇÑ´Ù */
if (event->type == GDK_BUTTON_PRESS && colorseldlg == NULL)
{
/* Yes, we have an event and there's no colorseldlg yet! */
handled = TRUE;
/* color selection dialog¸¦ ¸¸µç´Ù */
colorseldlg = gtk_color_selection_dialog_new("Select background color");
/* GtkColorSelection widgetÀ» ±¸ÇÑ´Ù */
colorsel = GTK_COLOR_SELECTION_DIALOG(colorseldlg)->colorsel;
/* "color_changed" ½Ã±×³ÎÀ» widget¿¡ ¿¬°áÇÑ´Ù. */
gtk_signal_connect(GTK_OBJECT(colorsel), "color_changed",
(GtkSignalFunc)color_changed_cb, (gpointer)colorsel);
/* color seclection dialog¸¦ º¸Àδ٠*/
gtk_widget_show(colorseldlg);
}
return handled;
}
/* À©µµ¸¦ ´Ý°í Çڵ鷯¿¡¼ ºüÁ®³ª°£´Ù */
void destroy_window (GtkWidget *widget, gpointer client_data)
{
gtk_main_quit ();
}
/* Main */
gint main (gint argc, gchar *argv[])
{
GtkWidget *window;
/* ŸŶÀ» ÃʱâÈÇϰí gtk¿Í °ü·ÃµÈ ¸í·ÉÀÔ·Â ¿ä¼ÒµéÀ» ¾ø¾Ø´Ù. */
gtk_init (&argc,&argv);
/* toplevel À©µµ¸¦ ¸¸µé°í Á¦¸ñ°ú policy¸¦ Á¤ÇÑ´Ù */
windo
|