· KLDP.org · KLDP.net · KLDP Wiki · KLDP BBS ·
Wxglade-Tutorial

wxGlade - a GUI builder for wxWidgets



ÁÖÀÇ : ÀÌ ¹öÁ¯ÀÇ Æ©Å͸®¾óÀº CVSÀÇ ÇöÀç¹öÁ¯¿¡ ¸ÂÃß¾îÁ® ÀÖÀ¸¹Ç·Î ÇöÀçÀÇ wxGladeÀÇ ¸±¸®Áî ¹öÁ¯°ú´Â Â÷ÀÌ°¡ ÀÖÀ» ¼ö ÀÖ´Ù.

wxGlade Tutorial ÀÌ Æ©Å͸®¾óÀÇ ¸ñÀûÀº wxGlade¿¡ ´ëÇÑ Àü¹ÝÀûÀÎ »çÇ×°ú ±â´É¿¡ ´ëÇØ ´ë·«ÀûÀ¸·Î ¾Ë¾Æº¸±â À§ÇÑ °ÍÀÌ´Ù. ªÀº ³»¿ë¿¡µµ ºÒ±¸ÇÏ°í, Â÷±ÙÂ÷±ÙÈ÷ ¸Å´º¹Ù¿Í »óŹ٠±×¸®°í notebook°°Àº ÄÁÆ®·ÑÀÌ Æ÷ÇÔµÈ frameÀ» ¾î¶»°Ô ¸¸µå´ÂÁö¸¦ ÅëÇؼ­ ¾î¶»°Ô ÇÁ·Î±×·¥ÀÌ µ¿ÀÛÇÏ´ÂÁö¿¡ ´ëÇØ ¾Ë ¼ö ÀÖÀ» °ÍÀÌ´Ù.


1. frame »ý¼º

»õ ÇÁ·¹ÀÓÀ» ¸¸µé±â À§Çؼ­´Â, "ÆÈ·¿Æ®"¿¡¼­ Àû´çÇÑ(¿ªÀÚÁÖ:ÇÁ·¹ÀÓ) ¹öÆ°À» Ŭ¸¯ÇÑ´Ù. »õâ¿¡ ÇØ´çÇϴ Ŭ·¡½ºÀÇ À̸§À» ¿ä±¸Çϴ âÀÌ ¶ã°ÍÀÌ´Ù. À̸§À» ÀÔ·ÂÇϵÇ, ¹Ýµå½Ã pythonÀ̳ª c++ Ŭ·¡½º¿¡ »ç¿ëÇÒ¼ö ÀÖ´Â(¹®¹ýÀûÀ¸·Î ¸Â´Â) À̸§À̾î¾ß ÇÑ´Ù.

ÀÌÁ¦ ÇÁ·¹ÀÓâÀÌ º¸ÀÌ°í, ¼Ó¼ºÃ¢ÀÌ ¹æ±Ý »ý¼ºµÈ widgetÀÇ ¼Ó¼ºÀ» º¸¿©ÁÙ°ÍÀÌ´Ù. ÀÌÁ¦ frameÀÇ Á¦¸ñ(ÇØ´ç ¿ÀºêÁ§Æ®ÀÇ À̸§°ú µ¿ÀÏÇØÁü)À» ¹Ù²Ù¾î º¸ÀÚ. "Frame with notebook" À̶ó°í ÀÔ·ÂÇØ º¸ÀÚ. Á¦¸ñ ÀԷ¶õÀ» ¹þ¾î³ª¸é ¹Ù·Î Àû¿ëµÇ¾î Áú °ÍÀÌ´Ù.

2. ¸Å´º¹Ù ¸¸µé±â

ÇöÀç ÇÁ·¹ÀÓÀÇ ¼Ó¼ºÃ¢À» ¼±ÅÃÇÑ´Ù. ±×¸®°í ÇØ´ç ÇÁ·¹ÀÓ¿¡¼­ ¸Å´º¹Ù »ý¼ºÀ» ¼±ÅÃÇÑ´Ù.

¼Ó¼ºÃ¢ÀÌ º¯Çϸç, ¸Å´º¹ÙÀÇ ¼Ó¼ºÀ» º¸¿©Áֱ⠽ÃÀÛÇÑ´Ù. : ¸Å´º ¹öÆ° ¼öÁ¤À» Ŭ¸¯ÇÏ°í ¸Å´º ¿¡µðÅÍ·Î ¸Å´º¸¦ ¸î°³ Ãß°¡ÇÑ´Ù.

"add" ¹öÆ°À» ´­·¯ ¸Å´º¸¦ Ãß°¡ÇÑ´Ù. ±×¸®°í Label Ç׸ñÀ» "File"·Î ¼öÁ¤ÇÑ´Ù. ÀÌÁ¦ File ¸Å´º¿¡ ÇϺθŴº¸¦ Ãß°¡ÇØ º¸ÀÚ : "Add"¹ö틍¸¦ Ŭ¸¯ÇÏ°í, LabelÇ׸ñÀ» "New"·Î ¹Ù²Û´Ù. ±×¸®°í > ¹öÆ°À» Ŭ¸¯ÇÑ´Ù. : New¸Þ´º°¡ File¸Þ´º ÇϺθ޴º·Î Ç¥½ÃµÇ±â À§ÇØ ¾ÈÂÊÀ¸·Î µé¿©¾²±â µÈ°ÍÀ» º¼ ¼ö ÀÖ´Ù.

3. »óŹ٠¸¸µé±â

ÇÁ·¡ÀÓ ¼Ó¼ºÃ¢(widget ÅÇ)¿¡¼­ Has MenuBar ¾Æ·¡¿¡ Has StatusBar¸¦ ¼±ÅÃÇÑ´Ù.

¼Ó¼ºÃ¢Àº ÇöÀç »óŹÙÀÇ ¼Ó¼ºÀ» ³ªÅ¸³»°í ÀÖ´Ù. : ¼öÁ¤Çϱâ À§ÇØ ´õºíŬ¸¯ÇÑ´Ù. "Created with wxGlade!"·Î ¼öÁ¤ÇÑ´Ù. size ¼Ó¼ºÀº ÇØ´ç ¼Ó¼ºÀÇ Â÷¿øÀ» ³ªÅ¸³½´Ù. ÃÖ¼ÒÇÑ ÇϳªÀÇ Çʵå´Â -1ÀÇ °ªÀ» °¡Á®¾ß ÇÑ´Ù.(³²Àº °ø°£À» ¸ðµÎ ä¿ì´Â ÇʵåÀÌ´Ù.)

4. notebook ¸¸µé±â

ÀÌÁ¦, ÇöÀç ÇÁ·¹ÀÓ¿¡ notebookÀ» Ãß°¡ÇØ º¸ÀÚ. Ãß°¡ÇÏ°Ô µÇ¸é ÇöÀç ÇÁ·¹ÀÓÀÌ BoxSizer°¡ ¸· Ãß°¡µÈ°ÍÀ» º¼¼ö ÀÖ´Ù. ±× ÀÌÀ¯´Â ¸ðµç ÄÁÅ×ÀÌ³Ê À§Á¬(container widget)Àº ÇϺΠÀ§Á¬(sub-widgets)À» Ãß°¡Çϱâ À§Çؼ­´Â Sizer¸¦ °¡Áö°í ÀÖ¾î¾ß Çϱ⠶§¹®ÀÌ´Ù. ±×¸®°í ÀϹÝÀûÀ¸·Î ÇÁ·¹ÀÓÀº ÇϳªÀÇ ÀÚ½Ä À©µµ¿ì¸¦ °¡Áö°Ô µÇ¹Ç·Î wxGlade´Â 1-solt BoxSizer¸¦ ÀÚµ¿Ãß°¡ ÇÑ´Ù.

ÀÌÁ¦ notebookÀ» Ãß°¡ÇÑ´Ù. ±×·¯±â À§Çؼ­´Â ÇÁ·¹ÀÓÀ» ¼±ÅÃÇÑÈÄ ÆÈ·¿Æ®¿¡¼­ Notebook ¹öÆ°À» Ŭ¸¯ÇÑ´Ù. ±×¸®°í sizerÀ§·Î µå·¡±× ÇÑ´Ù. ±×·¯°í ³ª¸é notebook ÅÇÀÇ À§Ä¡¸¦ °í¸£´Â âÀÌ ¶á´Ù. ¼±ÅÃÇÑ´Ù.

ÀÌÁ¦ ¼Ó¼ºÃ¢À» ¼±ÅÃÇغ¸. ÀÌÁ¦ Ŭ·¡½º À̸§ÀÌ wxNoteBookÀΰÍÀ» º¼¼öÀÖ´Ù. ´Ù½Ã¸»ÇØ ¿ÀºêÁ§Æ®ÀÇ Å¬·¡½º À̸§ÀÌ´Ù. ¸¸¾à °ªÀ» ¼öÁ¤Çϸé wxNotebook Ŭ·¡½º¸¦ »ó¼Ó¹ÞÀº »õ·Î¿î Ŭ·¡½º¸¦ ¸¸µé°Ô µÈ´Ù. ÇÁ·Î±×·¥ µ¿À۽ÿ¡´Â ¾Æ¹«·± ¿µÇâÀÌ ¾øÀ¸³ª »õ·Î »ý¼ºµÈ Ŭ·¡½ºÀÇ Á¤ÀÇµÈ Äڵ带 »ý¼ºÇÏ°Ô µÈ´Ù wxGlade°¡ »õ·Î¿î Ŭ·¡½º¸¦ À§ÇÑ Äڵ带 »ý¼ºÇϵµ·Ï, »õ·Î »ý¼ºµÈ MyNotebook Ŭ·¡½ºÀÇ °ªÀ» ¼öÁ¤ÇØ º¸ÀÚ

ÁÖÀÇ : À§ÀÇ ¼³¸íÀº ¼ÒÀ§ "container" widgets ¿¡¸¸ ÇØ´çµÈ´Ù. ´Ù½Ã ¸»ÇØ ÀÚ½ÄÀ» ¼ÒÀ¯ÇÒ¼ö ÀÖ´Â °Í¸¸ ÇØ´çµÈ´Ù. contolÀº ¾à°£ ´Ù¸£´Ù. ¿¹¸¦ µé¸é..

Æгξȿ¡ ¹öÆ°À» ³Ö¾ú´Ù. wxButton Ŭ·¡½º¸¦ »ç¿ëÇÑ´Ù. »õ·Î »ý¼ºµÈ MyCustomButtonÀÇ ¾î¶² °ªÀ» ¼öÁ¤Çϸé wxGlade´Â wxButton Ŭ·¡½º¸¦ »ó¼Ó¹ÞÀº MyCustomButtonÀÌ ¾îµò°¡¿¡ Á¤ÀÇ µÇ¾îÀÖ°í, ±× Ŭ·¡½¼´Â ÀϹÝÀûÀÎ wxButton Ŭ·¡½º¿Í ȣȯµÇ´Â »ý¼ºÀÚ¸¦ °¡Á³´Ù°í »ý°¢ÇÏ°í ±× ºÎºÐ¿¡ ´ëÇÑ Äڵ带 »ý¼ºÇÑ´Ù. ¾Æ·¡°¡ ±× ¿¹ÀÌ´Ù.
 button_1 = MyCustomButton(parent, id, "Label")
instead of
 button_1 = wxButton(parent, id, "Label")

ÁÖÀÇ 2: XRC Ãâ·Â¿¡ À־´Â ±âÁ¸ÀÇ °Í°ú Ŭ·¡½ºÀÇ °ªÀÌ ´Ù¸£¸é ±× °´Ã¼°¡ »ó¼Ó¹ÞÀº °ÍÀ̶ó°í »ý°¢ÇÑ´Ù. À§ÀÇ ¿¹Á¦¿¡ ÇØ´çÇÏ´Â Ãâ·ÂÀÌ ´ÙÀ½°ú °°´Ù.
 <object class="wxButton" name="button_1" subclass="MyCustomButton"/> 

±×·¯¹Ç·Î XRC ouput¿¡¼­ ÁÖÀÇÇÒÁ¡Àº ¼ÒÀ§ "top-level" widget(frame, dialog, ...)µéÀ» Ãß°¡ÇÒ¶§ Ŭ·¡½º°ªÀ» ÃʱâÄ¡·Î ¸®¼ÂÇØ¾ß ÇÔÀ» ±â¾ïÇؾßÇÑ´Ù. ±× ÀÌÀ¯´Â wxGlade´Â »ó¼ÓµÈ Ŭ·¡½º·Î ÀνÄÇϱ⠶§¹®ÀÌ´Ù.

5. notebook page Ãß°¡, »èÁ¦ Çϱâ

ÀÌ µ¿ÀÛÀº statusbarÀÇ Çʵ带 ´Ù·ç´Â°Í°ú °ÅÀÇ µ¿ÀÏÇÏ´Ù. notebook controlÀÇ ÅÇ ¼Ó¼ºÀº ÆäÀÌÁöÀÇ °ª°ú ±× Á¦¸ñÀ» ¼³Á¤ÇÑ´Ù.("Apply" Çϴ°ÍÀ» ÀØÁö ¸»¶ó!)

6. ÄÁÆ®·Ñ Ãß°¡Çϱâ.

ÀÌÁ¦ ÀÌ ÂªÀº tutorialÀÇ ¸¶Áö¸· ÆÄÆ®¿¡ µµ´ÞÇß´Ù. : notebookÀÇ Ã¹ÆäÀÌÁö¿¡ ¸î¸î ÄÁÆ®·ÑÀ» Ãß°¡ÇØ º¸ÀÚ. text area ¿Í µÎ°³ÀÇ ¹öÆ°À» Ãß°¡ÇÒ °ÍÀÌ´Ù. ÀÌ µ¿ÀÛµéÀº sizerµéÀ» ÀÌ¿ëÇؼ­ °´Ã¼µéÀ» layoutÇϴ°Ͱú wxGladeÀÇ cut & paste Áö¿øÀ» º¸°Ô µÈ´Ù.

Àü¿¡ ¾ê±âÇßµíÀÌ container¾È¿¡ widgetsÀ» Ãß°¡Çϱâ À§Çؼ­´Â sizer¸¦ ÀÌ¿ëÇØ¾ß ÇÑ´Ù. ÀÌÁ¦ ÄÜÆ®·ÑµéÀÌ Ãß°¡µÉ notebookÀÇ Ã¹ÆäÀÌÁö¿¡ sizer¸¦ Ãß°¡ÇØ º¸ÀÚ. ÀÌÁ¦ ÆÈ·¿¿¡¼­ BoxSizer ¹öÆ°À» Ŭ¸¯ÇÑ´Ù. ¸¶¿ì½º¸¦ ÆäÀÌÁö ¾ÈÀ¸·Î À̵¿½ÃÅ°¸é Æ÷ÀÎÅÍ°¡ ½ÊÀÚ¸ð¾çÀÌ µÈ´Ù. ±×¸®°í ÆäÀÌÁö¿¡ sizer¸¦ ¶³¾î¶ß¸°´Ù. ÀÌÁ¦ Ãß°¡ÇÒ sizer¿¡ ´ëÇÑ ¸î°¡Áö ¼Ó¼ºÀ» ¹¯´Â âÀÌ ¶ã°ÍÀÌ´Ù. ÇöÀç°ªÀ» ¼öÁ¤ÇÑ´Ù. 2Ä­Â¥¸® vertical box·Î ¸¸µç´Ù. ÀÌ°ÍÀº °­Á¦Á¶Ç×Àº ¾Æ´Ï´Ù. sizerÀÇ Ä­¼ö´Â ¾ðÁ¦µç ¹Ù²ð¼ö ÀÖ´Ù. ÀüÀڴ Ŭ·¡½º ¼Ó¼ºÀ» ¼öÁ¤ÇÏ´Â °ÍÀÌ°í, ÈÄÀÚ´Â sizerÀÇ "handle"¹öÆ° À§¿¡¼­ ¿ìŬ¸¯ Çϰųª widget Æ®¸®¿¡¼­ ÇØ´ç ³ëµå¸¦ ÅëÇؼ­ Æ˾÷¸Þ´º¸¦ ¶ç¿ï ¼ö ÀÖ´Ù. (´Ù½Ã¸»ÇØ. wxGlade¿¡¼­´Â °ÅÀÇ ¸ðµç °´Ã¼¿¡ ´ëÇÑ ¸Þ´º¸¦ ÀÌ·±½ÄÀ¸·Î ¶ç¿ï¼ö ÀÖ´Ù.)

TextCtrl ¹öÆ°À» Ŭ¸¯ÇÑÈÄ¿¡ sizerÀÇ Ã¹¹ø° ½½·Ô¿¡ ³Ö¾îº¸ÀÚ. ±âº»Á¤·ÄÀº ¿À¸¥ÂÊÁ¤·ÄÀÌ´Ù. layoutÀ» ¼öÁ¤Çϱâ À§Çؼ­´Â TextCtrlÀÇ layout¼Ó¼ºÅÇÀ» ¼±ÅÃÇÑ´Ù. AlignmentÀÇ wxEXPAND °ªÀ» 1·Î ¼öÁ¤ÇÑ´Ù. ¿©·¯ÁÙÀ» Ãâ·ÂÇÏ°í ½ÍÀ¸¸é Style(Widget ÅÇ¿¡¼­)ÀÇ wxTE_MULTILINE ÀÇ Ã¼Å©¹Ú½º¸¦ üũÇÑ´Ù. : wxGlade¿¡¼­´Â ´ëºÎºÐÀÇ Style ¼Ó¼ºÀÇ ¼öÁ¤Àº ¹Ù·Î º¸ÀÌÁö´Â ¾ÊÁö¸¸ »ý¼ºµÈ Äڵ忡´Â Àû¿ëÀÌ µÈ´Ù.

µÎ¹ø° ½½·Ô¿¡ horizontal SizerÀ» ¹èÄ¡ÇÑ´Ù. ¿©±â´Â ¹öÆ°ÀÌ µÎ°³ µé¾î°£´Ù. ½½·ÔÀÇ ¼ýÀÚ´Â 3À¸·Î ¼öÁ¤ÇÑ´Ù. µÎ ¹öÆ° »çÀÌ¿¡ °ø°£À» ÁÖ±â À§ÇÑ °ÍÀÌ´Ù. (È­¸é¿¡¼­ µÑ »çÀÌ°¡ ³Ê¹« ºÙ°Ô ÇÏÁö ¾Ê±â À§Çؼ­ÀÌ´Ù.)

ù¹ø° ½½·Ô¿¡ Àû´çÇÑ ¹öÆ°À» »õ·Î ³Ö´Â´Ù. µÎ¹ø° ¹öÆ°À» Ãß°¡Çϱâ À§Çؼ­ Ŭ¸³º¸µå¸¦ »ç¿ëÇÒ °ÍÀÌ´Ù. ù¹ø° ¹öÆ°ÀÇ Æ˾÷¸Þ´º¿¡¼­ Copy itemÀ» Ŭ¸¯ÇÑ´Ù.(¾Æ´Ï¸é ±×Àú ¹öÆ°À» ¼±ÅÃÇÑ ÈÄ Ctrl+C¸¦ ´©¸¥´Ù.), ÀÌÁ¦ ¸¶¿ì½º¸¦ ¼¼¹ø° ½½·Ô¿¡¼­ ½½·Ô¿¡ Æ˾÷¸Þ´º¿¡¼­ º¹»çµÈ widgetÀ» ºÙÀ̱â À§ÇØ Paste itemÀ» Ŭ¸¯ÇÑ´Ù.(¾Æ´Ï¸é, ºó ¼¼¹ø° ½½·ÔÀ» ¼±ÅÃÇÑ ÈÄ Ctrl+V¸¦ ´©·ç°Å³ª, ºó ¼¼¹ø° ½½·Ô¿¡¼­ ¸¶¿ì½º ¹öÆ°ÀÌ 3°³¶ó¸é °¡¿îµ¥ ¹öÆ°À» ´©¸£¸é µÈ´Ù.)

Àû´çÇÑ °Å¸®¸¦ À¯ÁöÇϱâ À§ÇØ, ÀÌÁ¦ µÎ ¹öÆ° »çÀÌ¿¡ spacer¸¦ Ãß°¡ÇÑ´Ù.

ÀÌÁ¦ ¸¶Áö¸·À¸·Î ¹öÆ°ÀÌ µé¾îÀÖ´Â horizontal SizerÀÇ ¼Ó¼º¿¡¼­ wxEXPAND°ªÀ» 0À¸·Î ¼öÁ¤ÇÏ°í, wxALIGN_CENTER_HORIZONTALÀ» üũÇÏ°í, ¹öÆ°À» text area¿Í ¾Æ·¡ÂÊ notebookÀ¸·Î ºÎÅÍ ºÐ¸®Çϱâ À§ÇØ À§ÂÊ(wxTOP)°ú ¾Æ·¡ÂÊ(wxBOTTOM)ÀÇ border°ªÀ» 4·Î ¼öÁ¤ÇÑ´Ù.


NOTE on widgets' ids: ¸ðµç wxWindows widgetÀº event handlingµî¿¡¼­ »ç¿ë µÇ¾îÁö´Â id°ªÀ» °¡Áö°í ÀÖ´Ù. ±×·¯¹Ç·Î wxGladeÀÇ °¢ widgetÀº id ¼Ó¼ºÀ» °¡Áö°í ÀÖ´Ù. ±× °ªÀº ´ÙÀ½°ú °°Àº °ªµéÀÌ ¿Ã ¼ö ÀÖ´Ù.

  • a number: widgetÀÇ »ý¼ºÀÚ·Î ºÎÅÍ ¾ò¾îÁø integer°ªÀÌ´Ù.
  • a name: ÀÌ °æ¿ì wxGlade´Â ÇÁ·Î±×·¥ ¾îµò°¡¿¡ ¼±¾ðµÈ idÀÇ À̸§À¸·Î »ý°¢ÇÏ°í »ç¿ëÇÑ´Ù. ¿¹¸¦ µé¸é "wxID_OK"À» dialogÀÇ ±âº» OK ¹öÆ°ÀÇ id°ªÀ¸·Î »ç¿ëÇÒ ¼ö ÀÖ´Ù.
  • a pair name=value: ÀÌ °æ¿ì widgetÀÇ »ý¼ºÀÚ°¡ º¯¼ö¸¦ »ý¼ºÇϱâ Àü¿¡ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¸é "Test" ¹öÆ°ÀÇ id·Î TEST_BUTTON=wxNewId()À» »ç¿ëÇÒ ¼ö ÀÖ´Ù.(C++ ÄÚµå »ý¼º±ÔÄ¢¿¡ ÀÇÇϸé : constant initializer¿¡ ÀÇÇØ »ý¼ºµÈ id°ªÀÌ anonymous enumÀ¸·Î ÀúÀåµÈ´Ù. ±×·¯¹Ç·Î ÀÌ °æ¿ìÀÇ ÇÒ´çÀº ±ÔÄ¢¿¡ ¾î±ß³ªÁö¸¸ - Àӽ÷ΠTEST_BUTTON=100°ú °°ÀÌ »ç¿ëÇÒ¼ö ÀÖ´Ù.)
  • a pair name=?:ÀÌ·± ƯÀÌÇÑ ÇüÅ´ Äڵ尡 "name"¿¡ ÇØ´çÇÏ´Â ¼±¾ðºÎ¸¦ °¡Áö°Ô µÈ´Ù. ÀÚµ¿À¸·Î unique id°¡ ÇÒ´çµÈ´Ù. ÆÄÀ̽㿡¼­ "name=wxNewId()"°ú µ¿ÀÏÇÑ ÇüÅÂÀÌ´Ù. C++¿¡¼­´Â "name=1000"°ú µ¿ÀÏÇÑ Ç¥ÇöÀÌ´Ù.( ¹°·Ð 1000Àº ´ÜÁö ¿¹¸¦ µç°ÍÀÌ´Ù.) ÈÄÀÚÀÇ °æ¿ì wxGlade´Â ´Â Á¤È®ÇÏ°Ô id°ªÀ» 1000À¸·Î °ªÀ» Á¤ÇÏ·Á°í ÇÒ°ÍÀÌ´Ù. ¸ñÀû¿¡ µû¶ó id°ªÀ» Á¤ÇÏ¸é µÇ°Ú´Ù.

7. Last changes


¸¶Áö¸·À¸·Î, ÇöÀç layoutÀÌ ¸¾¿¡ µéÁö ¾ÊÀ¸¸é, ¹öÆ°µéÀ» test area ¾Æ·¡°¡ ¾Æ´Ï¶ó À§¿¡ µÑ ¼öµµ ÀÖ´Ù.¾î¶»°Ô Çϴ°¡? °£´ÜÇÏ´Ù. : ¹öÆ°µéÀÌ µé¾îÀÖ´Â SizerÀÇ Pos¼Ó¼ºÀ» ¼öÁ¤ÇÑ´Ù. test area ÀÌÀü¿¡ sizer¸¦ µÎ±â À§ÇØ °ªÀ» 0À¸·Î ¼öÁ¤ÇÑ´Ù. ½±Áö ¾ÊÀº°¡?

Now our window is complete: all we have to do is set a reasonable initial size for it. To do this, resize the frame until you find a good size, and then activate the Size property.

8. Code generation

ÄÚµå »ý¼º ÀÌÀü¿¡ ÀúÀåÇÏÀÚ. main wxGlade À©µµ¿ìÀÇ File menu¿¡¼­ Save As... À» ¼±ÅÃÇÑ´Ù.¹Ýµå½Ã ÇÊ¿äÇÑ ÀÛ¾÷Àº ¾Æ´ÏÁö¸¸ À§Çè¿ä¼Ò¸¦ ÁÙÀÌ´Â ¾ÆÁÖ ÁÁÀº °øºÎ´Ù. ¾ÆÁ÷ wxGlade´Â ¾ÆÁ÷ ±× Á¤µµ·Î ÇÁ·Î±×·¥ÀÌ ¼º¼÷ÇØ ÀÖÁö´Â ¾Ê´Ù. :-)

ÀÌÁ¦ code¸¦ »ý¼ºÇØ º¸ÀÚ : tree widget¿¡¼­ Application Ç׸ñÀ» ¼±ÅÃÇÏÀÚ(¸ÇÀ§¿¡ ÀÖ´Ù.) ¼Ó¼ºÃ¢¿¡ ApplicationÅÇÀÌ º¸ÀδÙ. ÀÌ ÆгÎÀº code generation ¿É¼ÇÀ» °¡Áö°í ÀÖ´Ù.

  • Name: wxApp ObjectÀÇ À̸§À» ¼³Á¤ÇÑ´Ù. ÀÌ°ÍÀº ÇÁ·Î±×·¥ÀÇ À̸§ÀÌ µÈ´Ù. ¸¸¾à ÀÌ ¼Ó¼º°ú ´ÙÀ½ ¼Ó¼º(Class)ÀÌ È°¼ºÈ­°¡ ¾ÈµÇ¾î ÀÖ´Ù¸é, ±× ÀÌÀ¯´Â appication startup¿¡ ´ëÇÑ Äڵ尡 ¾ø´Â °ÍÀÌ´Ù. ±×·¯³ª ÀÌ°ÍÀº ¸î¸î widget¿¡¸¸ ÇØ´çµÈ´Ù.

  • Class: wxApp·Î ºÎÅÍ »ó¼ÓµÈ Ŭ·¡½ºÀÇ À̸§ÀÌ´Ù. ÀÌ ¼Ó¼º°ú ÀÌÀü ¼Ó¼º(Name)ÀÌ È°¼ºÈ­°¡ ¾ÈµÇ¾î ÀÖ´Ù¸é application °´Ã¼°¡ wxPySimpleAppÀÏ °ÍÀÌ´Ù.(ÀÌ °ÍÀº Python¾ð¾î¿¡¸¸ ÇØ´çµÈ´Ù. C++ÀÇ °æ¿ì´Â startup Äڵ尡 »ý¼ºµÇ°Ô ÇÏ·Á¸é ¹Ýµå½Ã È°¼ºÈ­°¡ µÇ¾î ÀÖ¾î¾ß ÇÑ´Ù.)
  • Encoding: ÀúÀåÇÒ .wxg(¶Ç´Â XRC) ÆÄÀÏ¿¡¼­ »ç¿ëµÉ encoding ÀÌ´Ù.
  • Enable gettext support: ¸¸¾à üũµÇ¸é, »ý¼ºµÈ ¼Ò½ºÄÚµåÀÇ ¸ðµç ¹®ÀÚ¿­Àº "_()"·Î Ãß°¡µÈ ÇüÅ·Π¼öÁ¤µÉ °ÍÀÌ´Ù. ÀÌ°ÍÀº gettext¸¦ À§ÇÑ °ÍÀÌ´Ù.
  • Top window: »ý¼ºµÉ ÇÁ·Î±×·¥ÀÇ ÁÖ À©µµ¿ì
  • Code generation: Ãâ·Â¿¡ ÇØ´çÇÏ´Â »çÇ×À» Á¶ÀýÇÑ´Ù. ¸ðµç widgetÀ» Æ÷ÇÔÇÏ´Â ÇϳªÀÇ ¼Ò½ºÆÄÀÏÀ» ¸¸µé°ÍÀÎÁö, °¢ Ŭ·¡½º°¡ Á¤ÀÇµÈ µû·Îµû·Î ÆÄÀÏ·Î ¸¸µé°ÍÀÎÁö(C++¿ëÀ¸·Î Ãâ·ÂÇÒ¶§´Â ".h" °ú ".cpp" µÎ°³ÀÇ ÆÄÀÏÀ» »ý¼ºÇÑ´Ù.) Á¤ÇÑ´Ù.
  • Language: ¾î¶² ¾ð¾î(Python, C++, XRC(wxWindows ÀÚ¿øÀúÀå¿ë xml Æ÷¸Ë))·Î Äڵ带 »ý¼ºÇÒÁö Á¤ÇÑ´Ù. ¸¶Áö¸· °æ¿ì applicationÀÇ ¸î¸î ¼Ó¼º(Name, Class, Top window)À» ¹«½ÃÇÑ´Ù. ±×¸®°í ¸î¸îÀº ºñÈ°¼ºÈ­µÈ´Ù. (¿©·¯ ÆÄÀÏ¿¡ ÄÚµå»ý¼ºÀÌ ºÒ°¡´ÉÇÏ´Ù.)
  • Overwrite existing sources: ¸¸¾à üũµÇ¸é, ÄÚµå Àüü°¡ ¾÷µ¥ÀÌÆ® µÇÁö ¾Ê°í ´Ù½Ã »ý¼ºµÈ´Ù.(ÀÚ¼¼ÇÑ ³»¿ëÀº ¾Æ·¡ÀÇ Ã¹¹ø° note¸¦ Âü°íÇÑ´Ù.)
  • Output path: ´ÜÀÏ ÆÄÀÏ ¸ðµåÀÏ °æ¿ì, »ý¼ºÇÒ ÆÄÀÏ À̸§ÀÌ´Ù. ¿©·¯°³ ÆÄÀÏ·Î »ý¼ºÇÒ °æ¿ì, Ãâ·ÂÇÒ µð·ºÅ丮 ¸íÀÌ´Ù. : ¸¶Áö¸· °æ¿ì, ¸ðµç Custom Ŭ·¡½º´Â °¢ ClassÀÇ À̸§À¸·Î ÆÄÀÏÀÌ »ý¼ºµÈ´Ù. ´Ü wxApp Ŭ·¡½º´Â ¿¹¿ÜÀÌ´Ù. À§¿¡¼­ ¼³¸íÇÑ Name ¼Ó¼º°ªÀ¸·Î »ý¼ºµÈ´Ù. ¿¹¸¦ µé¸é notebookÀÇ °æ¿ì MyFrame.py, MyNotebook.py, app.py(Python ÀÏ °æ¿ì)
  • Generate code: ÄÚµå »ý¼º ½ÃÀÛ ¹öÆ°
À§¿¡¼­ ¼³¸íÇÑ ¿É¼ÇµéÀ» ¼±ÅÃÇÑÈÄ Generate code¹öÆ°À» ´©¸£¸é, Àá½Ã ÈÄ ¸Þ½ÃÁö µ¿ÀÛÀÌ ³¡³µ´Ù´Â ¸Þ½ÃÁö âÀÌ ¶ß°í ÄÚµå »ý¼ºÀÌ ³¡ÀÌ ³­´Ù. ¸¶Ä¡ ÀÌ ÂªÀº tutorialó·³.. ;-)

9. Notes

À̹ø¿£ wxGlade¿¡ ´ëÇØ ¹Ýµå½Ã ¾Ë¾Æ¾ß ÇÒ °Íµé¿¡ ´ëÇØ ¾Ë¾Æº¸ÀÚ.(¾Ë·ÁÁø ¹ö±×, ÇÑ°è, ¼û°ÜÁø ±â´É, tips and tricks...) tutorial¿¡¼­ ´Ù·çÁö ¸øÇß´ø.. Á߿伺¿¡ µû¶ó ´ëÃæ Á¤·ÄÇØ º¸¾Ò´Ù..

Python ¶Ç´Â C++ code¸¦ »ý¼ºÇÒ ¶§, Ãâ·Â ÆÄÀÏÀÌ Á¸ÀçÇϸé, wxGlade´Â ±âº»ÀûÀ¸·Î ¸ðµç ³»¿ëÀ» ÀúÀåÇÏÁö ¾Ê°í, ¾Æ·¡ÀÇ ÄÚµå »çÀÌÀÇ ³»¿ë¸¸ ÀúÀåÇÑ´Ù.
  # begin wxGlade: ...
  # end wxGlade
 
GUIÄڵ带 ´Ù½Ã »ý¼ºÇÒ°æ¿ì, ÀÌ ±â´ÉÀº ´ëºÎºÐÀÇ °æ¿ì ÀÓÀÇ·Î ÀúÀåÇÑ Äڵ带 ÀÒÀ» °ÆÁ¤À» ÇÏÁö ¾Ê°í ÀÛ¾÷ÇÒ ¼ö ÀÖ°Ô ÇØ ÁØ´Ù. ±×·¯³ª ÁÖÀÇÇÒ Á¡ÀÌ Àִµ¥ ´ÙÀ½°ú °°Àº »çÇ×À» ÁÖÀÇ ÇØ¾ß ÇÑ´Ù.
  • ¸¸¾à Ãâ·ÂÇÒ ÆÄÀÏ¿¡ custom Ŭ·¡½ºÁß °°Àº À̸§ÀÇ Å¬·¡½º°¡ ÀÖÀ» °æ¿ì, ±×¸®°í wxGlade ºí·°ÀÌ ¾ø´Â°æ¿ì, ±× Ŭ·¡½º¿¡ ´ëÇÑ ÄÚµå´Â »ý¼ºµÇÁö ¾Ê´Â´Ù.(shell¿¡¼­ °æ°í ¸Þ½ÃÁö´Â Ãâ·ÂµÈ´Ù.)
  • ¸¸¾à custom classes Áß À̸§ÀÌ º¯°æÇϸé, »ý¼ºµÈ ÆÄÀÏÀÇ °Íµµ °°ÀÌ ¼öÁ¤µÇ¾î¾ß ÇÑ´Ù. (±×¸®°í wxGlade tagsÀÇ À̸§µµ °°ÀÌ ¼öÁ¤µÇ¾î¾ß ÇÑ´Ù.) ±× ÀÌÀ¯´Â wxGlade°¡ ¼öÁ¤µÇ±â ÀÌÀüÀÇ À̸§À» ¾Ë ¹æ¹ýÀÌ ¾ø±â ¶§¹®ÀÌ´Ù. ±×¸®°í ¿ÏÀüÈ÷ »õ·Î¿î °ÍÀ¸·Î ÀνĵȴÙ. (´Ù½Ã¸»ÇØ ±âÁ¸ÀÇ °ÍÀ» ¼öÁ¤ÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó »õ·Î »ý¼ºµÈ Ŭ·¡½º·Î ÀνÄÇÏ°í »ý¼ºÇØ ¹ö¸°´Ù.) ¿¹¸¦ µé¸é MyFrameÀ̶ó´Â Ŭ·¡½º°¡ ÀÖ°í, »ý¼ºµÈ ÆÄÀÏÀº frame.pyÀÌ´Ù.
    #!/usr/bin/env python
    # generated by wxGlade 0.2 on Sat Dec 14 15:15:06 2002

    from wxPython.wx import *

    class MyFrame(wxFrame):
        def __init__(self, *args, **kwds):
            # begin wxGlade: MyFrame.__init__
            kwds["style"] = wxDEFAULT_FRAME_STYLE
            wxFrame.__init__(self, *args, **kwds)

            self.__set_properties()
            self.__do_layout()
            # end wxGlade

        def __set_properties(self):
            # begin wxGlade: MyFrame.__set_properties
            self.SetTitle("frame_1")
            # end wxGlade

        def __do_layout(self):
            # begin wxGlade: MyFrame.__do_layout
            pass
            # end wxGlade

    # end of class MyFrame
      


    ÀÌÁ¦ MyFrameÀ» RenamedFrameÀ¸·Î À̸§À» º¯°æÇϸé, ¸¸¾à frame.pyÀ» ¼öÁ¤ÇÏÁö ¾Ê´Â´Ù¸é, ±×¸®°í Äڵ带 ´Ù½Ã »ý¼º½ÃŲ´Ù¸é ´ÙÀ½°ú °°Àº °á°ú°¡ ³ªÅ¸³­´Ù.
    #!/usr/bin/env python
    # generated by wxGlade 0.2 on Sat Dec 14 15:15:06 2002

    from wxPython.wx import *

    class RenamedFrame(wxFrame):
        def __init__(self, *args, **kwds):
            # begin wxGlade: RenamedFrame.__init__
            kwds["style"] = wxDEFAULT_FRAME_STYLE
            wxFrame.__init__(self, *args, **kwds)

            self.__set_properties()
            self.__do_layout()
            # end wxGlade

        def __set_properties(self):
            # begin wxGlade: RenamedFrame.__set_properties
            self.SetTitle("frame_1")
            # end wxGlade

        def __do_layout(self):
            # begin wxGlade: RenamedFrame.__do_layout
            pass
            # end wxGlade

    # end of class RenamedFrame


    class MyFrame(wxFrame):
        def __init__(self, *args, **kwds):
            # content of this block not found: did you rename this class?
            pass

        def __set_properties(self):
            # content of this block not found: did you rename this class?
            pass

        def __do_layout(self):
            # content of this block not found: did you rename this class?
            pass

    # end of class MyFrame
      


    ÀÌ°ÍÀº ¸í¹éÈ÷ ¿øÇÏ´ø µ¿ÀÛÀÌ ¾Æ´Ï´Ù..
  • ¸¸¾à wxg ÆÄÀÏÀÇ custom Ŭ·¡½º¸¦ Á¦°ÅÇϸé, wxGlade´Â¼Ò½ºÄڵ带 Àç»ý¼ºÇÒ¶§¤Ô¤¨¤Â¤ÔÀÚµ¿À¸·Î ¼Ò½ºÄڵ忡¼­µµ Á¦°ÅÇÑ´Ù. (ÀÌÀü¹öÁ¯ÀÇ ¼Ò½º°¡ ¾ø´Ù¸é ´ç¿¬È÷ Àû¿ë ¾ÈµÈ´Ù.), ±×·¯³ª wxGlade ºí·°³»ÀÇ Äڵ带 ¾÷µ¥ÀÌÆ® ÇÏ·Á°í ÇÒ°ÍÀÌ´Ù. ÀÌ Àǹ̴ ´ÙÀ½°ú °°´Ù.
    • If you want to remove the class, you have to do it manually,
    • ¸¸¾à ÀÌ Å¬·¡½º¸¦ Á¦°ÅÇϱ⸦ ¿øÇÑ´Ù¸é, ¼öµ¿À¸·Î ÇؾßÇÒ °ÍÀÌ´Ù.
    • If you want to keep the class as is, you have to remove the wxGlade tags.
    • ¸¸¾à ÀÌ Å¬·¡½º¸¦ À¯ÁöÇϱ⸦ ¿øÇϸé, wxGlade tags¸¦ Á¦°ÅÇØ¾ß ÇÑ´Ù.
0.3¹öÀü¿¡¼­´Â Application ¼Ó¼ºÁß "Overwrite existing sources"À» üũÇÔÀ¸·Î¼­ "update contents" ±â´ÉÀ» ²ô´Â °ÍÀÌ °¡´ÉÇÏ´Ù. ¸¸¾à üũ µÇ¾î ÀÖÀ¸¸é wxGlade´Â Äڵ带 ¹Ø¹Ù´ÚºÎÅÍ ´Ù½Ã »ý¼ºÇÑ´Ù. (View->Preferences->Others¿¡¼­ Àû´çÇÑ ¹é¾÷±â´ÉÀ» ¼öÇàÇÏ°Ô ÇÒ ¼ö ÀÖ´Ù.)

  • ÇÁ·Î±×·¥¿¡ »õ·Î¿î Ŭ·¡½º¸¦ Ãß°¡ÇÒ ¶§ ¸¸¾à ÀÌÀü¿¡ »ý¼ºµÈ Äڵ尡 ÀÖ´Ù¸é, »õ Ŭ·¡½ºÀÇ ¼±¾ðºÎ´Â ÀÌÀü Äڵ忡 Ãß°¡µÇÁö´Â ¾ÊÀ» °ÍÀÌ´Ù. ÀÌ°ÍÀº ´ëüÀûÀ¸·Î ¹®Á¦´Â ¾ÈµÈ´Ù. ±×·¯³ª C++ Ãâ·Â¿¡¼­´Â ÄÄÆÄÀÏ µÇÁö ¾ÊÀ» ¼ö ÀÖ´Ù. "out of box", ±×·¯¹Ç·Î Á÷Á¢ ¸î°¡Áö ÄÚµå ¼öÁ¤À» ÇØ ÁÖ¾î¾ß ÇÑ´Ù. (e.g. »õ Ŭ·¡½º ÀÌÀü¿¡ ¸î°¡Áö ¼±¾ðÀ» ÇØÁØ´Ù.)
  • sizer¿¡ slotÀ» Ãß°¡ÇÒ¶§ »õ·Î¿î ½½·ÔÀÌ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ´Ù. ÀÌ°ÍÀº sizer¸¦ °®°í ÀÖ´Â windowÀÇ »çÀÌÁî°¡ ³Ê¹« ÀÛÀ»¶§ ÀϾ ¼ö ÀÖ´Ù. ±×·¯¹Ç·Î »çÀÌÁ ÀçÁ¶Á¤Çϸé ÇØ°áµÈ´Ù. layoutÀÌ ´Ù½Ã Á¶Á¤µÇ°í »õ·Î¿î slotÀÌ º¸¿©Áø´Ù.
  • XRC ÄÚµå »ý¼ºÀº PythonÀ̳ª C++°ú ¸î°¡Áö ´Ù¸¥ Á¡ÀÌ ÀÖ´Ù. section 8¿¡¼­ ´Ù·ç¾ú´ø°Í°ú ´Þ¸® Áß¿äÇÑ Á¡Àº..
    • ÀϺΠwidgetsÀÌ ÀüÇô Áö¿øµÇÁö ¾Ê´Â´Ù.(e.g. status bar ¿Í gird): ÀÌ ÄÚµåµéÀº »ý¼ºµÇÁö ¾Ê´Â´Ù. ´ë½Å¿¡ XRC output ÆÄÀÏÀº ´ÙÀ½°ú °°Àº comment¸¦ Æ÷ÇÔÇÏ°í ÀÖ´Ù.
      <!-- code generator for wxStatusBar objects not available -->
        

    • Output ÆÄÀϵéÀº Ç×»ó µ¤¾î¾º¿öÁø´Ù. ±×·¯¹Ç·Î Á÷Á¢ XRC ÆÄÀÏÀ» ¼öÁ¤Çϸé Äڵ带 Àç»ý¼ºÇÒ¶§ Á÷Á¢ ¼öÁ¤ÇÑ °ÍµéÀº ¸ðµÎ »ç¶óÁø´Ù.
    • 02.¹öÁ¯ ÀÌÈÄ·Î CustomWidget()À̶ó´Â Ưº°ÇÑ ÄÄÆ÷³ÍÆ®°¡ ÀÖ´Ù. ´Ù¸¥Á¡Àº wxg ÆÄÀϾÈÀÇ ¾î¶² widget¿¡¼­´Â ¾²Àϼö ÀÖ´Ù.wxGlade°¡ Áö¿øÇÏÁö Á÷Á¢ Áö¿øÇÏÁö ¾Ê´Â °Í¿¡¼­µµ ¾²ÀÏ ¼ö ÀÖ´Ù. °¡Àå Áß¿äÇÑ ±â´ÉÀº Argument ¼Ó¼ºÀÌ´Ù. ÀÌ°ÍÀº Python ¶Ç´Â C++ ¿¡ ´ëÇØ µÎ°¡Áö ´Ù¸¥ Àǹ̰¡ ÀÖ´Ù. °´Ã¼¿¡ ´ëÇØ »ý¼ºÀÚ parameter¸¦ Á¤ÀÇÇÒ¼ö ÀÖ´Ù. ÀÌ°æ¿ì µÎ°³ÀÇ Æ¯º°ÇÑ parameter´Â $parent °ú $id ÀÌ´Ù. ÀÌ°ÍÀº ±× °´Ã¼ÀÇ ½ÇÁ¦ id¿Í ºÎ¸ð·ÎºÎÅÍ ±×µéÀÇ À̸§°ú ÀúÀå¼Ò¸¦ ÃßÃøÇÒ ¼ö ÀÖ´Ù. XRC¿¡ ´ëÇؼ­´Â Ưº°ÇÑ Ãß°¡ ¼Ó¼ºÀÌ ÀÖ´Ù. ÀÌ°æ¿ì Æû¿¡¼­ ´ÙÀ½°ú °°´Ù.
  • name: value
     
    (invalid entries will be silently ignored): for each of these lines, the output will contain a
    <name>value</name>
     
    property of the XRC object.
  • 0.2 ¹öÁ¯ ºÎÅÍ´Â wxGlade´Â xrc2wxg.py¶ó´Â ½ºÅ©¸³Æ®¸¦ Á¦°øÇÑ´Ù. ÀÌ°ÍÀ¸·Î XRC ÆÄÀÏÀ» wxGlade ÆÄÀÏ·Î º¯È¯ÇÒ ¼ö ÀÖ´Ù. ±×·¯¸é wxGlade¿¡¼­ ¼öÁ¤ÇÒ ¼ö ÀÖ´Ù. »ç¿ë¹ýÀº ´ÙÀ½°ú °°´Ù.
    python xrc2wxg.py xrc_file.xrc wxg_file.wxg
     
    (¸¸¾à wxg_file.wxg°¡ »ý·«µÇ¸é ±âº»°ªÀ¸·Î xrc_file.wxg°¡ µÈ´Ù.), ±×·¯³ª ÀÌ°ÍÀº ¸î°¡Áö Á¦ÇÑÀ» µÎ°í ÀÖ´Ù.. ¾Ë¾Æº¸ÀÚ.
    • ¿ì¼±, ÀÌ°ÍÀº "wxGlade-friendly(wxGlade ȣȯ)" XRC ÆÄÀϵ鸸 ´Ù·ê ¼ö ÀÖ´Ù. ÀÌ°ÍÀº ±âº»ÀûÀ¸·Î ¸ðµç À©µµ¿ì ÃÖ»óÀ§ À©µµ¿ì »©°í, ¹Ýµå½Ã sizer¾È¿¡ Á¸ÀçÇÏ¿©¾ß ÇÑ´Ù´Â °ÍÀÌ´Ù. (¿¹¿Ü´Â ÀÖ´Ù.)
    • wxGlade°¡ ¸ð¸£´Â ¸ðµç widgetÀº ¹Ýµå½Ã Ưº°ÇÑ CustomWidget ÄÄÆ÷³ÍÆ®·Î ´ëüµÇ¾î¾ß ÇÑ´Ù.
    • ¸¶Áö¸·À¸·Î xrc2wxg´Â ±âº»ÀûÀ¸·Î ½ÃÇèÆÇÀÌ´Ù. ±×·¯¹Ç·Î ¹ö±×°¡ ÀÖÀ» ¼ö ÀÖ´Ù. ¸¸¾à¿¡ ¹ß°ßµÇ¸é º¸°íÇ϶ó(this is valid for wxGlade in general, BTW).
  • ÄÚµå »ý¼º±â´ÉÀ» GUI¸¦ ¶ç¿ìÁö ¾Ê°í command line¿¡¼­ ÇàÇÒ ¼ö ÀÖ´Ù. ½©»ó¿¡¼­ ´ÙÀ½°ú °°ÀÌ ÇÑ´Ù.
    python wxglade.py -h
     
    at your shell's prompt.

ÀÌ ³»¿ëÀÌ ¾Ë±â ½±±â¸¦ ¹Ù¶õ´Ù.. ³ªÀÇ ¿µ¾î´Â ´Ù¼Ò ¹ÌÈíÇÏ´Ù. ¾î°µç Áú¹®, comment, ºñÆòÀº e-mailÀ» ÅëÇÒ ¼ö ÀÖ´Ù. agriggio <at> users <dot> sf <dot> net.


Alberto Griggio


¹ø¿ª : ½É½ÂÁØ, dwYoon¾È


dwYoon´Ô Á¤¸®ÇØ Áּż­ °¨»çÇÕ´Ï´Ù.

ID
Password
Join
You are a bundle of energy always on the go.


sponsored by andamiro
sponsored by cdnetworks
sponsored by HP

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2006-06-04 22:23:21
Processing time 0.0106 sec