SoEnty03Àº À§Á¬°ú ƼÁ¬À» ¸¸µé±â¸¸ ÇÏ°í ¹èÄ¡´Â ´ëÃæÇØ µÎ¾ú´Ù. ¸ÞÀÎ À©µµ¿ì°¡ ÀϹÝÀûÀÎ À©µµ¿ì¶ó ¸ð¾çÀÌ ¿¹»ÚÁö ¾Ê´Ù. ÀÏ´Ü ¹èÄ¡ÇÒ
Àç·á°¡ ÀÖ¾î¾ß ÇÏ´Ï ¾î¿ ¼ö ¾ø¾ú´Ù. SoEnty04 ÇÁ·ÎÁ§Æ® »çº»À» ¶ß°í À§Á¬°ú ƼÁ¬À» ¹èÄ¡ÇØ º¸ÀÚ.
»ùÇ÷Π¸¸µç µÎ °³ÀÇ À§Á¬°ú µÎ °³Àº ¸ðµÎ Á¤ÀûÀ¸·Î ¼±¾ðÇß´Ù. ÀÌ
¼±¾ð¹®Àº ÀÌÁ¦ ÇÊ¿ä ¾ø´Ù. »èÁ¦Çϸé ÀϽÃÀûÀ¸·Î ¿¡·¯°¡ ¸¹ÀÌ ¹ß»ýÇϴµ¥ Áö±ÝÀº ¾î¿ ¼ö ¾ø´Ù.
CClock childClock;
CRadix childRadix;
CLCDTest childLCD;
CTextClip childTextClip;
¸¸µé¾îµÐ ¸ðµç À§Á¬À» ´Ù ¹èÄ¡ÇÏ´Â °Ô ¾Æ´Ï¶ó »ç¿ëÀÚ°¡ ¼±ÅÃÇÑ À§Á¬¸¸ º¸¿©¾ß ÇÑ´Ù. ¶ÇÇÑ °¢ À§Á¬ÀÇ ¼ø¼³ª Å©±â, »ö»ó µîµµ »ç¿ëÀÚ°¡ ÁöÁ¤ÇÑ´Ù. ¸ðµç °ÍÀÌ ½ÇÇàÁß¿¡ ¹Ù²ð ¼ö ÀÖÀ¸¹Ç·Î ÄÚµå´Â »ç¿ëÀÚÀÇ ¼±Åôë·Î ¹èÄ¡ÇÒ Áغñ¸¦ ÇØ µÎ¾î¾ß ÇÑ´Ù.
ÃÖÃÊ ¼³Ä¡½Ã¿¡´Â Àû´çÇÑ À§Á¬À» µðÆúÆ® ¿É¼ÇÀ¸·Î »ý¼ºÇØ¾ß ÇÑ´Ù. ¶ÇÇÑ
¼³Á¤À» ´Ù Áö¿ì°í óÀ½ »óÅ·Πµ¹¾Æ°¡´Â ¸®¼Â ±â´Éµµ ÇÊ¿äÇÏ´Ù. ÀÌ·² ¶§¸¦ À§ÇØ À§Á¬¿¡ ´ëÇÑ Ãʱâ Á¤º¸°¡
ÇÊ¿äÇÏ´Ù. À§Á¬ Á¤º¸¸¦ ÀúÀåÇÒ ±¸Á¶Ã¼¸¦ Widget.hÀÇ
Á¦ÀÏ ¾Õ ºÎºÐ¿¡ ¼±¾ðÇÑ´Ù. CWidget Ŭ·¡½ºº¸´Ùµµ ´õ ¾Õ¿¡ ¼±¾ðÇÑ´Ù.
// À§Á¬, ƼÁ¬ Çϳª¿¡ ´ëÇÑ Á¤º¸.
struct SWidgetInfo
{
wstring
name; //
¹®ÀÚ¿·Î µÈ À§Á¬ ¼³¸í. UI¿¡ »ç¿ë
wstring
desc; //
À§Á¬¿¡ ´ëÇÑ »ó¼¼ ¼³¸í
wstring
cls; //
À§Á¬ÀÇ ¼Ò¼Ó Ŭ·¡½º.¸ÖƼÀÎ °æ¿ì ÀÏ·Ã ¹øÈ£¸¦ ºÙ¿© id¸¦
¸¸µç´Ù.
bool
allowMulti; //
¸ÖƼ ÀνºÅϽº °¡´É ¿©ºÎ.
int
initHeight; //
¼öÁ÷ ¹èÄ¡ÀÏ ¶§ÀÇ Ãʱ⠳ôÀÌ.
int
initWidth; //
¼öÆò ¹èÄ¡ÀÏ ¶§ÀÇ Ãʱ⠳ʺñ
COLORREF
initColor; //
¹è°æ»ö
};
À̸§°ú ¼³¸íÀº »ç¿ëÀÚ¿¡°Ô º¸¿©ÁÙ ¹®ÀÚ¿ÀÌ¸ç ½ÇÇà°ú´Â ¾Æ¹« »ó°üÀÌ ¾ø´Ù. cls´Â
À§Á¬À» ±¸ÇöÇÑ Å¬·¡½ºÀÇ À̸§ÀÌ¸ç »ý¼º½Ã¿¡ »ç¿ëÇÑ´Ù. °¢ À§Á¬Àº ¿©·¯ ¹öÀüÀ» µ¿½Ã¿¡ ¶ç¿ö ³õÀ» ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î ½Ã°è´Â µðÁöÅÐ/¾Æ³¯·Î±× °¢°¢ ¶Ç´Â Çѱ¹/¹Ì±¹ ½Ã°£ µÎ ¹ú µîÀÌ °¡´ÉÇÏ´Ù.
»ç¿ëÀÚ°¡ ÇÊ¿ä¿¡ µû¶ó ¸ÖƼ¸¦ ¼±ÅÃÇÒ ¼ö ÀÖ°Ô À¢¸¸Çϸé Çã¿ëÇ쵂 ÇÖÅ° °°Àº Àü¿ª ÀÚ¿øÀ» µî·ÏÇϰųª ¸®¼Ò½º¸¦ °ú´ÙÇÏ°Ô
»ç¿ëÇÏ´Â À§Á¬Àº ¸ÖƼ¸¦ Á¦ÇÑÇÑ´Ù. °°Àº ÇÖÅ°¸¦ µÎ ¹ø µî·ÏÇϸé È¥¼±ÀÌ ¹ß»ýÇÒ ¼ö ÀÖ°í ¸®¼Ò½º¸¦ ºÒÇÊ¿äÇÏ°Ô
¸¹ÀÌ ¾²´Â °Íµµ ¹Ù¶÷Á÷ÇÏÁö ¾Ê´Ù.
SoEnty.cpp¿¡ ÇÁ·Î±×·¥ÀÌ º¸À¯ÇÑ À§Á¬ ¸ñ·ÏÀ» ÀÌ ±¸Á¶Ã¼ ¹è¿·Î
Á¤ÀÇÇÑ´Ù. À§Á¬ ¸ñ·ÏÀº ¸ÞÀÎÀÌ °ü¸®ÇϹǷΠ¸ÞÀο¡ ÀÖ¾î¾ß ÇÑ´Ù. ±×·¡¼
Widget.cpp°¡ ¾Æ´Ñ SoEnty.cpp¿¡ Á¤ÀÇÇÑ´Ù. ÇöÀç µÎ °³¹Û¿¡ ¾øÁö¸¸ ¾ÕÀ¸·Î °è¼Ó ´Ã¾î³¯ °ÍÀÌ´Ù.
// ÀÌ ÇÁ·Î±×·¥ÀÌ º¸À¯ÇÑ À§Á¬, ƼÁ¬
¸ñ·Ï. ÀÌ Áß »ç¿ëÀÚ°¡ ¼±ÅÃÇÑ °Í¸¸ »ç¿ëÇÑ´Ù.
SWidgetInfo arWidgetInfo[] = {
{L"½Ã°è", L"ÇöÀç ½Ã°£À» º¸¿© ÁÝ´Ï´Ù.",
L"Clock",
true, 80, 120, RGB(255, 255, 0)},
{L"Áø¹ýº¯È¯±â", L"2Áø¼ö, 10Áø¼ö, 16Áø¼ö¸¦ ÀÚµ¿ º¯È¯ÇÕ´Ï´Ù.",
L"Radix",
true, 50, 120, RGB(100, 100, 100)},
{L"",
L"", L"", false, 0, 0, RGB(0, 0, 0)},
};
ÀÌ Á¤º¸´Â ¾îµð±îÁö³ª À§Á¬ÀÇ ÃʱâÈ Á¤º¸ÀÏ »ÓÀÌ¸ç ½ÇÇàÁß¿¡´Â ÀÌ Á¤º¸¸¦ º¹»çÇÏ¿© »ý¼ºÇÏ°í ÀÌÈÄ¿¡´Â »ç¿ëÀÚ°¡ ÆíÁýÇÒ
¼ö ÀÖ´Ù. ½ÇÁ¦ »ç¿ëÇÏ´Â À§Á¬ÀÇ ¸ñ·ÏÀº º¤ÅÍ·Î Á¤ÀÇÇÑ´Ù.
// »ç¿ëÁßÀÎ À§Á¬ ¸ñ·Ï
vector<CWidget*> arWidget;
global.h ¿¡ ÃʱâÈ ¹è¿°ú À§Á¬ ¸ñ·ÏÀ» Àü¿ªÀ¸·Î ¼±¾ðÇÑ´Ù. À§Á¬, ƼÁ¬ Ãʱ⠸ñ·ÏÀº SoEnty.cpp¿¡¼
Á¤ÀÇÇÏ°í ÃʱâÈÇÏ´Â ¸Þ¼µå´Â Widget.cpp, Tidget.cpp¿¡ ÀÖ¾î Á¤º¸¸¦ °øÀ¯ÇØ¾ß ÇÑ´Ù.
extern SWidgetInfo arWidgetInfo[];
extern vector<CWidget*> arWidget;
¹è¿À» Àü¿ªÀ¸·Î ¼±¾ðÇÏ¸é ¿ÜºÎ¿¡¼ Å©±â¸¦ ¾Ë ¼ö ¾ø´Ù. ±×·¡¼ ÃʱâÈ
Á¤º¸ ¹è¿ ³¡¿¡ ³¡ Ç¥½ÄÀÌ ÇÊ¿äÇÏ´Ù.
nameÀÌ ºó ¹®ÀÚ¿ÀÌ¸é ³¡À̶ó´Â ¶æÀÌ´Ù. À§Á¬°ú ƼÁ¬ÀÇ °øÅë ¼Ó¼ºÀº °øµ¿
Á¶»óÀÎ CDget¿¡ Á¤ÀÇÇÑ´Ù. ºñ¾î Àִ Ŭ·¡½º¿¡ ÀÌÁ¦ ÇÊ¿äÇÑ
Á¤º¸¸¦ Çϳª¾¿ Ãß°¡ÇÑ´Ù. À©µµ¿ì ¼Ò¼Ó ¸â¹ö¿¡ win_ Á¢µÎ¸¦
ºÙ¿´µíÀÌ Á¬ ¼Ò¼Ó ¸â¹ö¿¡´Â dget_ Á¢µÎ¸¦ ºÙÀδÙ.
// À§Á¬, ƼÁ¬ÀÇ °øµ¿ Á¶»ó
class CDget : public CWindow
{
public:
wstring
dget_cls; //
Á¬ÀÇ ¼Ò¼Ó Ŭ·¡½º
wstring
dget_id; //
Á¬ÀÇ °íÀ¯ ¸íĪ. INI ÆÄÀÏÀÇ ¼½¼Ç¸í¿¡ »ç¿ë
bool
dget_visible; //
Á¤º¸´Â À¯ÁöÇÑä·Î Àá½Ã ¼û±è
};
ÃʱâÈ Á¤º¸¿Í´Â ¸ñ·ÏÀÌ Á¶±Ý ´Ù¸£´Ù. À̸§À̳ª ¼³¸í ¹®ÀÚ¿Àº ½ÇÇà°ú´Â
»ó°üÀÌ ¾ø¾î Á¦¿ÜÇÑ´Ù. cls´Â ÀÚ½ÅÀÇ Å¸ÀÔÀ̹ǷΠÆ÷ÇÔÇÑ´Ù. Á¤
ÇÊ¿äÇÏ´Ù¸é cls·ÎºÎÅÍ ÃʱâÈ ¹è¿À» µÚÁ® À̸§°ú ¼³¸íÀ» ¾Ë¾Æ³¾ ¼ö´Â ÀÖ´Ù. dget_id´Â ÀÌ Á¬ÀÇ °íÀ¯ÇÑ ½Äº°ÀÚÀÌ´Ù. ¸ÖƼ¸¦ Çã¿ëÇÏ´Â À§Á¬Àº
µÎ¹ø° ÀÌÈĺÎÅÍ´Â cls ´ÙÀ½¿¡ Á¢µÎ¸¦ ºÙ¿© À̸§À» ºÙÀδÙ.
¿¹¸¦ µé¾î ½Ã°è°¡ µÎ °³ ÀÖÀ¸¸é °¢°¢ Clock, Clock_2°¡
µÈ´Ù. ID´Â Á¤º¸¸¦ ÀúÀåÇÒ ¶§ ¼½¼Ç°ªÀ¸·Î »ç¿ëÇÏ¿© ´©±¸ÀÇ Á¤º¸ÀÎÁö ±¸ºÐÇÑ´Ù. µÎ ½Ã°è°¡ °¢°¢ÀÇ ¼³Á¤À» µ¶¸³ÀûÀ¸·Î º¸À¯ÇÒ ¼ö ÀÖ´Ù. ¸ðµç Á¬Àº
¼û±æ ¼ö ÀÖ¾î dget_visible ¸â¹ö¸¦ °¡Áø´Ù. ¹è°æ»ö
¼Ó¼ºÀº ´õ »óÀ§ÀÇ CWindow¿¡ Æ÷ÇԵǾî ÀÖ´Ù.
Å©±â Á¤º¸´Â ƼÁ¬¿¡´Â ¾ø°í À§Á¬¿¡¸¸ ÀÖ´Ù. CWidgetÀº Å©±â Á¤º¸¸¦
¸â¹ö·Î Æ÷ÇÔÇÏ°í ÃʱâÈ Á¤º¸·ÎºÎÅÍ À§Á¬ °´Ã¼¸¦ »ý¼ºÇÏ´Â µÎ °³ÀÇ Á¤Àû ÇÔ¼ö¸¦ ¼±¾ðÇÑ´Ù. À§Á¬ºÎÅÍ´Â ¸â¹ö¿¡
º°µµÀÇ Á¢µÎ¸¦ ºÙÀÌÁö ¾Ê±â·Î ÇÑ´Ù. º¯¼ö°¡ ±æ¸é Äڵ尡 ¹øÀâÇØÁø´Ù.
class CWidget : public CDget
{
public:
int
vertHeight; //
¼öÁ÷ÀÏ ¶§ÀÇ ³ôÀÌ
int
horzWidth; //
¼öÆòÀÏ ¶§ÀÇ ³Êºñ
static
CWidget* CreateObject(wstring cls);
static
CWidget* CreateDefaultObject(wstring cls);
};
ƯÁ¤ À§Á¬ ¼Ò¼ÓÀÌ ¾Æ´Ï¶ó Àüü À§Á¬À» °ü¸®ÇÏ´Â ÇÔ¼öÀ̹ǷΠÁ¤ÀûÀ̾î¾ß ÇÑ´Ù.
Widget.cppÀÇ ¾ÕºÎºÐ¿¡ ´ÙÀ½ µÎ ÇÔ¼öÀÇ ±¸Çö Äڵ带 ÀÛ¼ºÇÑ´Ù.
// Ŭ·¡½º¸íÀ¸·ÎºÎÅÍ À§Á¬ °´Ã¼ »ý¼º. ŸÀÔ¸í°ú
°´Ã¼¸¦ ¿¬°áÇÑ´Ù.
CWidget* CWidget::CreateObject(wstring cls)
{
if
(cls == L"Clock") return new CClock();
if
(cls == L"Radix") return new CRadix();
return
nullptr;
}
// µðÆúÆ® ¿ÀºêÁ§Æ®¸¦ »ý¼ºÇÏ°í Ãʱ⠼ӼºÀ» ´ëÀÔÇÑ´Ù.
CWidget* CWidget::CreateDefaultObject(wstring cls)
{
CWidget*
pWidget = CreateObject(cls);
int
wi;
for
(wi = 0;; wi++) {
if
(arWidgetInfo[wi].cls == L"") return nullptr;
if
(arWidgetInfo[wi].cls == cls) break;
}
pWidget->dget_cls
= cls;
//
¸ÖƼ¸¦ Çã¿ëÇÏÁö ¾ÊÀ¸¸é Ŭ·¡½º¸íÀ» ±×´ë·Î »ç¿ëÇÑ´Ù.
if
(arWidgetInfo[wi].allowMulti == false) {
pWidget->dget_id
= cls;
}
else {
bool
bFind;
wstring
id;
//
ÀÏ·Ã ¹øÈ£¸¦ Áõ°¡½ÃÄÑ °¡¸é ºó ¹øÈ£¸¦ ã´Â´Ù.
for
(int num = 1;; num++) {
//
ù À§Á¬À̸é Ŭ·¡½º¸íÀ» ±×´ë·Î »ç¿ëÇÑ´Ù.
if
(num == 1) {
id
= cls;
}
else {
TCHAR
tnum[10];
wsprintf(tnum,
L"%d", num);
id
= cls + L"_" + tnum;
}
//
ÀÌ¹Ì »ý¼ºÇÑ À§Á¬Áß¿¡ id¸¦ »ç¿ëÇÏ´Â À§Á¬ÀÌ ÀÖ´ÂÁö Á¶»çÇÑ´Ù.
bFind
= false;
for
(size_t wi = 0; wi < arWidget.size(); wi++) {
if
(arWidget[wi]->dget_id == id) {
bFind
= true;
break;
}
}
if
(bFind == false) break;
}
pWidget->dget_id
= id;
}
pWidget->dget_visible
= true;
pWidget->vertHeight
= arWidgetInfo[wi].initHeight;
pWidget->horzWidth
= arWidgetInfo[wi].initWidth;
pWidget->SetBackColor(arWidgetInfo[wi].initColor);
return
pWidget;
}
CreateObject ÇÔ¼ö´Â °´Ã¼ÀÇ Å¬·¡½º À̸§À¸·ÎºÎÅÍ °´Ã¼¸¦ »ý¼ºÇÏ´Â
¿ªÇÒÀ» ÇÑ´Ù. "Clock"¶ó´Â ¹®ÀÚ¿°ú CClock¶ó´Â
Ŭ·¡½º¸íÀ» Á÷Á¢ ¿¬°üÁöÀ» ¼ö ¾ø¾î ÀÏÀÏÀÌ ¹®ÀÚ¿ ºñ±³ÇÏ¿© new ¿¬»êÀÚ¸¦ È£ÃâÇÑ´Ù. C++µµ RTTI ±â´ÉÀ» ¾²¸é ÀÓÀÇÀÇ Å¬·¡½º °´Ã¼¸¦ »ý¼ºÇÒ ¼ö ÀÖÁö¸¸
ºñ¿ëÀÌ ºñ½Î Àß »ç¿ëÇÏÁö ¾Ê´Â ÆíÀÌ´Ù.
CreateDefaultObject ÇÔ¼ö´Â °´Ã¼¸¦ »ý¼ºÇÏ°í id¸¦ »ý¼ºÇÑ ÈÄ Ãʱâ Á¤º¸¸¦ º¹»çÇÏ´Â ¿ªÇÒÀ» ÇÑ´Ù. º¸ÅëÀº ÃʱâÈ
Á¤º¸¸¦ ±×´ë·Î º¹»çÇÏ¸é µÇÁö¸¸ id´Â °°Àº Á¾·ùÀÇ À§Á¬ÀÌ ÀÌ¹Ì ÀÖÀ» °æ¿ì ÀÏ·Ã ¹øÈ£¸¦ ºÙ¿©¾ß ÇÑ´Ù. ¾Õ¿¡ ÀÌ¹Ì »ý¼ºÇÑ °°Àº Á¾·ùÀÇ À§Á¬µµ »ìÆì ºÁ¾ß Çϱ⠶§¹®¿¡ Äڵ尡 Á¶±Ý ±æ´Ù.
¿¹¸¦ µé¾î ½Ã°è À§Á¬À» »ý¼ºÇϴµ¥ ÀÏ´Ü "Clock"À¸·Î
À̸§À» ºÙ¿© º¸°í ÀÌ À̸§ÀÌ ÀÌ¹Ì ÀÖÀ¸¸é "Clock_2"¸¦ »õ·Î ºÙÀδÙ. ÀÌ À̸§µµ ÀÖÀ¸¸é Clock_3, Clock_4 ½ÄÀ¸·Î ºó À̸§ÀÌ
¹ß°ßµÉ ¶§±îÁö ¹Ýº¹ÇÑ´Ù. À§Á¬ÀÇ ID°¡ Áߺ¹µÇÁö ¾Êµµ·Ï °ü¸®ÇÏ°í
ÀÖ´Ù. ¹è°æ»öÀº SetBackColor ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ¹è°æ
ºê·¯½Ã±îÁö ¸¸µé¾î µÐ´Ù.
ƼÁ¬µµ ºñ½ÁÇÏ´Ù. Å©±â Á¤º¸³ª ¹è°æ»öÀÌ ¾øÀ¸´Ï ÀÌ·± ¸â¹ö´Â Á¦¿ÜÇÏ°í
id¸¸ Àß °ü¸®ÇÏ¸é µÈ´Ù. Tidget.h ¼±µÎ¿¡ ´ÙÀ½ ±¸Á¶Ã¼¸¦ ¼±¾ðÇÑ´Ù.
// À§Á¬, ƼÁ¬ Çϳª¿¡ ´ëÇÑ Á¤º¸.
struct STidgetInfo
{
wstring
name; //
¹®ÀÚ¿·Î µÈ À§Á¬ ¼³¸í. UI¿¡ »ç¿ë
wstring
desc; //
À§Á¬¿¡ ´ëÇÑ »ó¼¼ ¼³¸í
wstring
cls; //
À§Á¬ÀÇ ¼Ò¼Ó Ŭ·¡½º.¸ÖƼÀÎ °æ¿ì ÀÏ·Ã ¹øÈ£¸¦ ºÙ¿© id¸¦
¸¸µç´Ù.
bool
allowMulti; //
¸ÖƼ ÀνºÅϽº °¡´É ¿©ºÎ.
};
SoEnty.cpp¿¡ ƼÁ¬ ¸ñ·Ï°ú »ç¿ëÁßÀΠƼÁ¬ ¸ñ·ÏÀ» ÀúÀåÇÒ º¤Å͸¦
¼±¾ðÇÑ´Ù.
STidgetInfo arTidgetInfo[] = {
{L"LCD
Å×½ºÆ®", L"LCD ¾×Á¤À» Á¡°ËÇÕ´Ï´Ù.",
L"LCDTest",
false},
{L"Ŭ¸³º¸µå
º¯È¯±â", L"Ŭ¸³º¸µå¿¡ ÅؽºÆ® Æ÷¸Ë¸¸ ³²±é´Ï´Ù.",
L"TextClip",
false},
{L"",
L"", L"", false},
};
// »ç¿ëÁßÀΠƼÁ¬ ¸ñ·Ï
vector<CTidget*> arTidget;
global.h ¿¡ °ü·Ã º¯¼ö¸¦ Àü¿ªÀ¸·Î ¼±¾ðÇÑ´Ù.
extern STidgetInfo arTidgetInfo[];
extern vector<CTidget*> arTidget;
CTidget Ŭ·¡½º¿¡ °´Ã¼¸¦ »ý¼ºÇÏ´Â µÎ °³ÀÇ Á¤Àû ÇÔ¼ö¸¦ ¼±¾ð. À§Á¬ÀÇ °æ¿ì¿Í °°´Ù.
class CTidget : public CDget
{
...
static
CTidget* CreateObject(wstring cls);
static
CTidget* CreateDefaultObject(wstring cls);
};
±¸Çö ÄÚµå´Â cpp¿¡ ÀÛ¼ºÇÑ´Ù. Å©±â¿Í
¹è°æ»öÀÌ ¾øÀ» »Ó ³í¸®´Â À§Á¬°ú ¶È°°´Ù.
CTidget* CTidget::CreateObject(wstring cls)
{
if
(cls == L"LCDTest") return new CLCDTest();
if
(cls == L"TextClip") return new CTextClip();
return
nullptr;
}
CTidget* CTidget::CreateDefaultObject(wstring cls)
{
CTidget*
pTidget = CreateObject(cls);
int
ti;
for
(ti = 0;; ti++) {
if
(arTidgetInfo[ti].cls == L"") return nullptr;
if
(arTidgetInfo[ti].cls == cls) break;
}
pTidget->dget_cls
= cls;
if
(arTidgetInfo[ti].allowMulti == false) {
pTidget->dget_id
= cls;
}
else {
bool
bFind;
wstring
id;
for
(int num = 1;; num++) {
if
(num == 1) {
id
= cls;
}
else {
TCHAR
tnum[10];
wsprintf(tnum,
L"%d", num);
id
= cls + L"_" + tnum;
}
bFind
= false;
for
(size_t ti = 0; ti < arTidget.size(); ti++) {
if
(arTidget[ti]->dget_id == id) {
bFind
= true;
break;
}
}
if
(bFind == false) break;
}
pTidget->dget_id
= id;
}
pTidget->dget_visible
= true;
return
pTidget;
}
¸ÞÀÎ À©µµ¿ìÀÇ OnCreate¿¡¼ À§Á¬, ƼÁ¬ º¤Å͸¦ ÃʱâÈÇÑ´Ù. ±âÁ¸ÀÇ Á¤Àû º¯¼ö »ý¼º¹®Àº ¸ðµÎ »èÁ¦ÇÏ°í
´ÙÀ½ Äڵ带 ÀÛ¼ºÇÑ´Ù. ¼³Á¤ ÀúÀå ±â´ÉÀÌ ¾ÆÁ÷ ¾øÀ¸¹Ç·Î ÀÏ´ÜÀº Ãʱâȸ¸¸ ÇÏ¸é µÈ´Ù.
LRESULT CMainWindow::OnCreate(WPARAM wParam,
LPARAM lParam)
{
....
if
(true/* ÃÖÃÊ ½ÇÇà½Ã */) {
//
À§Á¬ ¹è¿ ÃʱâÈ
CWidget*
pWidget;
pWidget
= CWidget::CreateDefaultObject(L"Clock");
arWidget.push_back(pWidget);
pWidget
= CWidget::CreateDefaultObject(L"Radix");
arWidget.push_back(pWidget);
//
ƼÁ¬ ¹è¿ ÃʱâÈ
CTidget*
pTidget;
pTidget
= CTidget::CreateDefaultObject(L"LCDTest");
arTidget.push_back(pTidget);
pTidget
= CTidget::CreateDefaultObject(L"TextClip"); arTidget.push_back(pTidget);
}
else {
//
ÀúÀåµÈ Á¤º¸¸¦ Àоî¿Â´Ù.
}
¿©±â±îÁö´Â À§Á¬, ƼÁ¬ ¹è¿¸¸ »ý¼ºÇÑ °ÍÀÌ´Ù. À§Á¬À» ¹èÄ¡ÇÒ ¸ÞÀÎ À©µµ¿ì°¡ ¹Ì¿Ï¼ºÀ̸ç ƼÁ¬À» ¹èÄ¡ÇÒ Æ®·¹À̵µ ¾ÆÁ÷ ¾ø´Ù. ÄÄÆÄÀÏÀº
µÇÁö¸¸ À§Á¬, ƼÁ¬À» »ý¼ºÇÏÁöµµ ¾Ê¾Ò°í ¹èÄ¡µµ ÇÏÁö ¾Ê¾Æ ¸ÞÀÎ À©µµ¿ì¸¸ ¶ã»Ó ¾Æ¹« °Íµµ º¸ÀÌÁö ¾Ê´Â´Ù.
¸ÞÀÎ À©µµ¿ì¿¡ À§Á¬, ƼÁ¬À» ¹èÄ¡ÇÏ·Á¸é Å©±â, »ö»ó µîÀÇ ¿©·¯ °¡Áö ¼Ó¼ºÀÌ ÇÊ¿äÇÏ´Ù. ´ÙÀ½ ¸â¹ö¸¦ ¼±¾ðÇÑ´Ù. ÀÌÈÄÀÇ ½Ç½À¿¡ ÇÊ¿äÇÑ ¸â¹ö¸¦ ¸ðµÎ ÇѲ¨¹ø¿¡ ¼±¾ðÇß´Ù.
class CMainWindow : public CWindow
{
public:
bool
bVertical; //
¹æÇâ
int
alwaysOnTop; //
Ç×»ó À§
int
capThick; //
ĸ¼Ç µÎ²²
COLORREF
capColor; //
ĸ¼Ç »ö»ó
int
bdThick; //
°æ°è¼± µÎ²²
COLORREF
bdColor; //
°æ°è¼± »ö»ó
int
splitThick; //
½ºÇø´ µÎ²²
COLORREF
splitColor; //
½ºÇø´ »ö»ó
int
vertThick, horzThick; //
°¢ ¹æÇ⺰ µÎ²². °æ°è¼± Æ÷ÇÔ. »ç¿ëÀÚ°¡ Á¶Á¤Çؾß
¹Ù²ñ
int
clientWidth, clientHeight; //
¹æÇâ¿¡ µû¶ó ¹Ù²î´Â ÇöÀç Æø°ú ³ôÀÌ. °æ°è¼± Æ÷ÇÔ
bool
magneticEffet; //
ÀÚ¼® È¿°ú »ç¿ë ¿©ºÎ
int
widgetMinThick; //
À§Á¬ ÃÖ¼Ò, ÃÖ´ë Å©±â
int
widgetMaxThick;
HCURSOR
cursorHorz, cursorVert;
int
dragWidget;
OnCreate¿¡¼ ¹«³ÇÑ °ªÀ¸·Î ÃʱâÈÇÑ´Ù. »ý¼ºÀÚ³ª Create¿¡¼ ÃʱâÈÇÏÁö ¾Ê°í OnCreate¿¡¼ ÃʱâÈÇÏ´Â ÀÌÀ¯´Â ¼³Á¤¿¡ ÀúÀåÇÏ°í º¹±¸ÇØ¾ß ÇÏ´Â Á¤º¸À̱⠶§¹®ÀÌ´Ù. ¼³Á¤À» °ü¸®ÇÏ´Â °´Ã¼¸¦ ÃʱâÈÇØ¾ß ÀÐÀ» ¼ö Àֱ⠶§¹®¿¡ À§Á¬ÀÇ »ý¼ºÀÚ¿¡¼ ¼³Á¤°ªÀ» Àб⿡´Â ³Ê¹« ºü¸£´Ù.
LRESULT CMainWindow::OnCreate(WPARAM wParam,
LPARAM lParam)
{
....
cursorHorz
= LoadCursor(g_hInst, MAKEINTRESOURCE(IDC_SIZEHORZ));
cursorVert
= LoadCursor(g_hInst, MAKEINTRESOURCE(IDC_SIZEVERT));
bVertical
= true;
alwaysOnTop
= true;
if
(alwaysOnTop) {
SetWindowPos(win_hWnd,
HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
}
capThick
= 24;
capColor
= RGB(30, 144, 255);
bdThick
= 4;
bdColor
= RGB(192, 192, 192);
splitThick
= 5;
splitColor
= RGB(0, 0, 255);
vertThick
= 200;
horzThick
= 120;
magneticEffet
= true;
widgetMinThick
= 30;
widgetMaxThick
= 300;
if
(true/* ÃÖÃÊ ½ÇÇà½Ã */) {
....
alwaysOnTop ¼Ó¼ºÀÌ ÄÑÁ® ÀÖÀ¸¸é ÀÌ ¼Ó¼º´ë·Î Ç×»ó À§ »óÅ·Î
¸¸µç´Ù. ÇöÀç´Â ÀÌ ¿É¼ÇÀÌ »ó¼öÁö¸¸ ¼³Á¤ ÀúÀå ±â´ÉÀÌ µé¾î°¡¸é ÃÖÁ¾ ¼±ÅÃÇÑ ¿É¼Ç¿¡ µû¶ó Ç×»ó À§ ¿©ºÎ°¡
´Þ¶óÁø´Ù.
ÇöÀç ¸ÞÀÎ À©µµ¿ì°¡ ¿À¹ö·¦µå·Î µÇ¾î Àִµ¥ ÀÌ ½ºÅ¸ÀϷδ ¿¹»Û À©µµ¿ì¸¦ ¸¸µé ¼ö ¾ø´Ù. Ä¿½ºÅÒ Å¸ÀÌƲ ¹Ù¸¦ ¸¸µé±â À§ÇØ WS_POPUP ½ºÅ¸ÀÏ·Î »ý¼ºÇÏ°í
À©µµ¿ì À§Ä¡¿Í Å©±â´Â Àû´çÈ÷ ÃʱâÈÇÑ´Ù.
void CMainWindow::Create()
{
RECT
wrt;
wrt.left
= 100;
wrt.top
= 100;
wrt.right
= 300;
wrt.bottom
= 600;
CreateWindow(TEXT("CWindow"),
L"SoEnty", WS_POPUP | WS_CLIPCHILDREN,
wrt.left,
wrt.top, wrt.right - wrt.left, wrt.bottom - wrt.top,
NULL,
(HMENU)NULL, g_hInst, this);
HICON
hIcon = LoadIcon(g_hInst, MAKEINTRESOURCE(IDI_SOENTY));
SetClassLong(win_hWnd,
GCL_HICON, (LONG)hIcon);
}
¿©±â±îÁö ÇÏ¸é ¸ÞÀÎ À©µµ¿ì°¡ Æ˾÷À¸·Î »ý¼ºµÈ´Ù. ±×³É »ç°¢Çü ÇüÅ·θ¸
º¸À̸ç ŸÀÌƲ ¹Ù°¡ ¾ø±â ¶§¹®¿¡ À̵¿µµ ¾ÈµÇ°í Alt+F4·Î Á¾·áÇØ¾ß ÇÑ´Ù.
ƼÁ¬Àº Å©±â°¡ ÀÛ¾Æ ¾Æ·¡ÂÊÀÇ Æ®·¹ÀÌ ¿µ¿ª¿¡ µû·Î ¹èÄ¡ÇÑ´Ù. À̸¦ À§ÇØ
SoEnty.h¿¡ Æ®·¹ÀÌ À©µµ¿ì¸¦ ¼±¾ðÇÑ´Ù. ¸ÞÀÎ À©µµ¿ìÀÇ
Â÷ÀϵåÀ̹ǷΠ¸ÞÀÎ ¸ðµâ¿¡ Äڵ带 ÀÛ¼ºÇÑ´Ù.
class CTrayWindow : public CWindow
{
public:
int
tidgetSize; //
ƼÁ¬ Å©±â
int
tidgetGap; //
ƼÁ¬°£ÀÇ °£°Ý
int
trayThick; //
Æ®·¹ÀÌÀÇ ³ôÀÌ ¶Ç´Â Æø
void
Create(HWND hParent);
LRESULT
OnCreate(WPARAM wParam, LPARAM lParam);
LRESULT
OnDestroy(WPARAM wParam, LPARAM lParam);
void
UpdateTrayThick(int widgetThick);
void
ArrangeTrayTidget(int widgetThick);
};
Window·ÎºÎÅÍ »ó¼Ó¹ÞÀ¸¸ç ƼÁ¬ÀÇ ¹èÄ¡¿¡ °üÇÑ ¸î °¡Áö ¼Ó¼ºÀ» °¡Áø´Ù. tidgetSize´Â ƼÁ¬ ÇѺ¯ÀÇ Å©±âÀÌµÇ ³ôÀÌ¿Í ³ÐÀÌ°¡ °°Àº Á¤»ç°¢ÇüÀÌ´Ù.
tidgetGapÀº ƼÁ¬ »çÀÌÀÇ °£°ÝÀÌ´Ù. OnCreate¿¡¼ ƼÁ¬ Å©±â¸¦ 24·Î, °£°ÝÀº 4·Î ÃʱâÈÇÑ´Ù.
trayThickÀº Æ®·¹ÀÌÀÇ ³ôÀÌÀε¥ ÀÌ º¯¼ö¿¡¼ ThickÀ̶ó´Â ¿ë¾î¿¡ ÁÖ¸ñÇÏÀÚ. ¼öÁ÷, ¼öÆò µÎ°¡Áö ¹æÇâÀÌ ÀÖ¾î Width³ª Height·Î À̸§À» ÁöÀ» ¼ö ¾ø´Ù. ±×·¡¼ ¹æÇâ¿¡ ¹«°üÇÑ µÎ²²·Î À̸§À»
Á¤Çß´Ù. ¸ÞÀÎ À©µµ¿ì¿¡¼ bdThick, capThick µîÀÇ
º¯¼ö°¡ ÀÖ¾ú°í ÀÌÈÄ¿¡ ³ª¿À´Â Thick º¯¼ö¸íÀÌ ´Ù ¸¶Âù°¡ÁöÀÌ´Ù.
µÎ²²´Â ÃÑ Æ¼Á¬ °³¼ö¿¡ µû¶ó ´Þ¶óÁö¸ç ¾Æ·¡ÂÊ¿¡ ¼±¾ðÇÑ µÎ ÇÔ¼ö¿¡¼ °è»êÇÑ´Ù. ÀÏ´Ü
´ÙÀ½°ú °°ÀÌ ±¸ÇöÇØ µÎ°í ºÐ¼®Àº ³ªÁß¿¡ ÇѲ¨¹ø¿¡ ÇØ º¸ÀÚ. SoEnty.cppÀÇ WinMain ¹Ù·Î À§¿¡ ÀÛ¼ºÇÑ´Ù.
void
CTrayWindow::Create(HWND hParent) {
CreateWindow(TEXT("CWindow"),
NULL, WS_CHILD | WS_VISIBLE,
0, 0,
0, 0, hParent, (HMENU)2, g_hInst, this);
}
LRESULT CTrayWindow::OnCreate(WPARAM wParam,
LPARAM lParam)
{
tidgetSize
= 24;
tidgetGap
= 4;
return
0;
}
LRESULT CTrayWindow::OnDestroy(WPARAM wParam,
LPARAM lParam)
{
return
0;
}
// Æ®·¹ÀÌÀÇ µÎ²²¸¦ °áÁ¤ÇÑ´Ù. Àμö·Î
°æ°è¼±À» Á¦¿ÜÇÑ À§Á¬ µÎ²²¸¦ Àü´ÞÇÑ´Ù.
// ¼öÆò, ¼öÁ÷¿¡ »ó°ü ¾øÀÌ ³í¸®´Â
°°µÇ ThickÀÌ ÆøÀÌ³Ä ³ôÀ̳ĸ¸ ´Ù¸£´Ù.
void CTrayWindow::UpdateTrayThick(int widgetThick)
{
//
ÇÑÁÙ¿¡ µé¾î°¡´Â ƼÁ¬ °³¼ö. À§Á¬Æø¿¡¼ ¿ÞÂÊÀÇ °¸ »©°í Æø+°¸À¸·Î ³ª´« ¼ö.
//
¿¹¸¦ µé¾î À§Á¬ÆøÀÌ 100ÀÏ ¶§ ù °¸ÀÎ 4¸¦
»« 96¿¡ Æø+°¸ÀÎ 28ÀÌ
¸î °³³ª µé¾î°¡´ÂÁö º»´Ù. ÀÌ °æ¿ì´Â 3°³ÀÌ´Ù.
int
perLine = (widgetThick - tidgetGap) / (tidgetSize + tidgetGap);
//
º¸À̴ ƼÁ¬ÀÇ °³¼ö¸¦ ¼¾´Ù.
int
num = 0;
for
(size_t ti = 0; ti < arTidget.size(); ti++) {
if
(arTidget[ti]->dget_visible == false) continue;
num++;
}
//
°³¼ö¿¡ µû¸¥ ÁÙ ¼ö. 1, 2, 3°³±îÁö´Â 1ÁÙÀÌ°í 4, 5, 6Àº µÎ ÁÙÀÌ´Ù. °Ô½Ã¹° ÆäÀÌ¡ÇÏ´Â ¼ö½Ä°ú °°´Ù.
int
trayLine = (num - 1) / perLine + 1;
//
Æ®·¹ÀÌÀÇ µÎ²² = À§ÂÊ °¸¿¡¼ Æø+°¸ ³ôÀÌ¿Í
ÁÙ ¼ö¸¦ °öÇÑ °ªÀÌ´Ù.
trayThick
= tidgetGap + (tidgetSize + tidgetGap) * trayLine;
}
// Æ®·¹ÀÌÀÇ Æ¼Á¬À» ¹èÄ¡ÇÑ´Ù. ¼öÁ÷Àº
Á¿쿡¼ ¿ì·Î, À§¿¡¼ ¾Æ·¡·Î ¹èÄ¡ÇÏ°í ¼öÆòÀº À§¿¡¼ ¾Æ·¡·Î, Á¿¡¼
¿ì·Î ¹èÄ¡ÇÑ´Ù.
// ¹æÇ⸸ ´Ù¸¦ »Ó ¹èÄ¡ ³í¸®´Â µ¿ÀÏÇÏ´Ù.
void
CTrayWindow::ArrangeTrayTidget(int widgetThick)
{
int x, y;
x = tidgetGap;
y = tidgetGap;
for (size_t ti = 0; ti <
arTidget.size(); ti++) {
if
(arTidget[ti]->dget_visible == false) continue;
if
(mainWindow.bVertical) {
//
ƼÁ¬ ¿À¸¥ÂÊÀÌ Æ®·¹ÀÌ ¿À¸¥ÂÊ¿¡ ´ê¾ÒÀ¸¸é °³ÇàÇÑ´Ù. Á¦ÀÏ ³¡ ¾ÆÀÌÄÜÀÇ °¸±îÁöµµ Æ÷ÇÔÇØ¾ß ÇÑ´Ù.
if
(x + tidgetSize + tidgetGap > widgetThick) {
x
= tidgetGap;
y
+= (tidgetSize + tidgetGap);
}
MoveWindow(arTidget[ti]->win_hWnd,
x, y, tidgetSize, tidgetSize, TRUE);
UpdateWindow(arTidget[ti]->win_hWnd);
x
+= (tidgetSize + tidgetGap);
}
else {
if
(y + tidgetSize + tidgetGap > widgetThick) {
y
= tidgetGap;
x
+= (tidgetSize + tidgetGap);
}
MoveWindow(arTidget[ti]->win_hWnd,
x, y, tidgetSize, tidgetSize, TRUE);
UpdateWindow(arTidget[ti]->win_hWnd);
y
+= (tidgetSize + tidgetGap);
}
}
}
SoEnty.cpp¿¡ Æ®·¹À̸¦ Àü¿ªÀ¸·Î ¼±¾ðÇÑ´Ù. global.h¿¡µµ ¹°·Ð ¼±¾ðÇØ ÁÖ¾î¾ß ÇÑ´Ù.
CTrayWindow trayWindow;
À§Á¬, ƼÁ¬ ¹è¿°ú ¸ÞÀÎ À©µµ¿ì, Æ®·¹À̱îÁö
¿Ï·áÇß´Ù. ¸ÞÀÎ À©µµ¿ìÀÇ OnCreate¿¡¼ À§Á¬, ƼÁ¬À» »ý¼ºÇÑ´Ù. À§Á¬Àº ºÎ¸ð°¡ ¸ÞÀÎÀε¥ ºñÇØ Æ¼Á¬Àº ºÎ¸ð°¡ Æ®·¹ÀÌÀÓÀ»
À¯ÀÇÇÏÀÚ.
LRESULT CMainWindow::OnCreate(WPARAM wParam,
LPARAM lParam)
{
....
//
À§Á¬ »ý¼º
for
(CWidget *pWidget : arWidget) {
pWidget->Create(win_hWnd);
}
//
Æ®·¹ÀÌ¿Í Æ¼Á¬ »ý¼º
trayWindow.Create(win_hWnd);
trayWindow.SetBackColor(RGB(128,
128, 128));
for
(CTidget* pTidget : arTidget) {
pTidget->Create(trayWindow.win_hWnd);
}
return
0;
}
¿©±â±îÁö ÀÛ¾÷Çϸé À§Á¬, ƼÁ¬ÀÌ »ý¼ºÀº µÈ´Ù. ±×·¯³ª Å©±â°¡ ¸ðµÎ 0ÀÌ¾î¼ ¾ÆÁ÷ º¸ÀÌÁö´Â ¾Ê´Â´Ù. ¸ÞÀÎ À©µµ¿ìÀÇ ¹æÇâ°ú °¢ À§Á¬ÀÇ Å©±â¿¡ µû¶ó ¹è¿ÇØ¾ß ÇÑ´Ù.
·¹À̾ƿô°ú ±×¸®±â, Å©±â º¯°æÀ» À§ÇØ ¿©·¯ °¡Áö ¸Þ½ÃÁö¸¦ ó¸®Çؾß
ÇÏ°í ÇÊ¿äÇÑ ÇÔ¼öµµ ¸¹´Ù. ´ÙÀ½ ¸â¹ö ÇÔ¼ö¸¦ ¹Ì¸® ¼±¾ðÇØ µÐ´Ù.
class CMainWindow : public CWindow
....
LRESULT
OnPaint(WPARAM wParam, LPARAM lParam);
LRESULT
OnSize(WPARAM wParam, LPARAM lParam);
LRESULT
OnLButtonDown(WPARAM wParam, LPARAM lParam);
LRESULT
OnMouseMove(WPARAM wParam, LPARAM lParam);
LRESULT
OnLButtonUp(WPARAM wParam, LPARAM lParam);
void
Relayout();
bool
IsInCaption(int cx, int cy);
int
FindSplitVirt(int cy);
int
FindSplitHorz(int cx);
};
À§Á¬, ƼÁ¬À» ¹èÄ¡ÇÏ´Â °ÍÀº ´ÙÀ½ ÇÔ¼ö°¡ ´ã´çÇÑ´Ù. ¸ðµç ¹èÄ¡¸¦ ´Ù½Ã Àâ´Â ÇÙ½ÉÀûÀÎ ÇÔ¼öÀÌ¸ç ¾ÕÀ¸·Îµµ ÀÌ ÇÔ¼öÀÇ ´Ù·®ÀÇ Äڵ带 °è¼Ó ÀÛ¼ºÇÏ¸ç °ü¸®ÇØ¾ß ÇÑ´Ù. SoEnty Àüü¸¦ ÅëƲ¾î Á¦ÀÏ Áß¿äÇÑ ÇÔ¼öÀÌ´Ù.
void CMainWindow::Relayout()
{
if
(bVertical) {
//
¿µ¿ªÀÇ Æø. °æ°è¼± Æ÷ÇÔ
clientWidth
= vertThick;
//
°æ°è¼±À» Á¦¿ÜÇÑ À§Á¬Æø
int
widgetWidth = clientWidth - bdThick * 2;
//
¸ðµç À§Á¬ÀÇ À§Ä¡¸¦ ´Ù½Ã Àâ´Â´Ù.
int
y = bdThick + capThick;
for
(size_t wi = 0; wi < arWidget.size(); wi++) {
//
ÀÏ´Ü ´ëÀÔ¹ÞÀº ÈÄ »ç¿ëÇÑ´Ù. Ä÷º¼ÇÀÇ [ ] ¿¬»êÀÚ¸¦
¾²¸é µð¹ö±ëÁß¿¡ °ªÀ» º¼ ¼ö ¾ø´Ù.
CWidget*
pWidget = arWidget[wi];
//
¼û°ÜÁø À§Á¬Àº °Ç³Ê ¶Ú´Ù.
if
(pWidget->dget_visible == false) continue;
MoveWindow(pWidget->win_hWnd,
bdThick, y, widgetWidth, pWidget->vertHeight, TRUE);
//
À̵¿ ÈÄ Áï½Ã ±×·Á¾ß ±ô¹ÚÀÓÀÌ ¾ø´Ù. ¾Æ·¡, À§·Î
¼ø¼¸¦ ¹Ù²Ü ¶§´Â ¹«È¿Èµµ ÇØ¾ß ¹Ù·Î ±×·ÁÁø´Ù.
InvalidateRect(pWidget->win_hWnd,
NULL, TRUE);
UpdateWindow(pWidget->win_hWnd);
y
+= pWidget->vertHeight + splitThick;
}
//
Æ®·¹ÀÌ À©µµ¿ìÀÇ À§Ä¡ ÁöÁ¤ ¹× ƼÁ¬ Á¤·Ä
trayWindow.UpdateTrayThick(widgetWidth);
SetWindowPos(trayWindow.win_hWnd,
NULL, bdThick, y, widgetWidth,
trayWindow.trayThick,
SWP_NOZORDER);
InvalidateRect(trayWindow.win_hWnd,
NULL, FALSE);
UpdateWindow(trayWindow.win_hWnd);
trayWindow.ArrangeTrayTidget(widgetWidth);
//
¿µ¿ªÀÇ ³ôÀÌ °áÁ¤. ¸ðµç À§Á¬ÀÇ ³ôÀÌ + Æ®·¹ÀÌ + ¾Æ·¡ °æ°è¼± µÎ²²
clientHeight
= y + trayWindow.trayThick + bdThick;
}
else {
//
¼öÁ÷ ¹è¿°ú ¸ðµç ³í¸®´Â °°µÇ ¹æÇ⸸ ´Ù¸£´Ù.
clientHeight
= horzThick;
int
widgetHeight = clientHeight - bdThick * 2;
int
x = bdThick + capThick;
for
(size_t wi = 0; wi < arWidget.size(); wi++) {
CWidget*
pWidget = arWidget[wi];
if
(pWidget->dget_visible == false) continue;
MoveWindow(pWidget->win_hWnd,
x, bdThick, pWidget->horzWidth, widgetHeight, TRUE);
InvalidateRect(pWidget->win_hWnd,
NULL, TRUE);
UpdateWindow(pWidget->win_hWnd);
x
+= pWidget->horzWidth + splitThick;
}
trayWindow.UpdateTrayThick(widgetHeight);
SetWindowPos(trayWindow.win_hWnd,
NULL, x, bdThick, trayWindow.trayThick,
widgetHeight,
SWP_NOZORDER);
InvalidateRect(trayWindow.win_hWnd,
NULL, FALSE);
UpdateWindow(trayWindow.win_hWnd);
trayWindow.ArrangeTrayTidget(widgetHeight);
clientWidth
= x + trayWindow.trayThick + bdThick;
}
//
¸ÞÀÎ À©µµ¿ìÀÇ Å©±â¸¦ º¯°æÇÑ´Ù. Æ®·¹ÀÌÀÇ ³ôÀÌ°¡ ¹Ù²ð ¼ö ÀÖ¾î ¸ÞÀεµ Å©±â°¡ ¹Ù²ð ¼ö ÀÖ´Ù.
SetWindowPos(mainWindow.win_hWnd,
NULL, 0, 0, clientWidth, clientHeight,
SWP_NOMOVE
| SWP_NOZORDER | SWP_NOACTIVATE);
InvalidateRect(mainWindow.win_hWnd,
NULL, FALSE);
}
¼öÆò, ¼öÁ÷ ¾ç¹æÇâÀ¸·Î ³ª´©¾îÁö´Âµ¥ ¼öÁ÷Âʸ¸ ºÐ¼®ÇØ º¸¸é ¼öÆòµµ ¸¶Âù°¡ÁöÀÌ´Ù. OnCreate¿¡¼ À§Á¬, ƼÁ¬À» ¸ðµÎ »ý¼ºÇÑ ÈÄ ·¹À̾ƿôÀ» Àâ´Â´Ù.
LRESULT CMainWindow::OnCreate(WPARAM wParam,
LPARAM lParam)
{
....
Relayout();
return
0;
}
OnPaint¿¡¼ ŸÀÌƲ ¿µ¿ª°ú °æ°è¼±, À§Á¬ »çÀÌÀÇ °¸ µîÀ» ±×¸°´Ù.
// ¸ÞÀÎ À©µµ¿ì´Â Â÷ÀÏµå »çÀÌ »çÀÌ¿¡ ±×·Á¾ß Çϱ⠶§¹®¿¡ ´õºí¹öÆÛ¸µÇÏÁö ¾Ê´Â´Ù.
LRESULT CMainWindow::OnPaint(WPARAM wParam, LPARAM
lParam)
{
HDC
hdc;
PAINTSTRUCT
ps;
HBRUSH
capBrush, bdBrush, splitBrush;
HFONT
font, oldFont;
RECT
crt;
LPCTSTR
caption = L"SoEnty";
GetClientRect(win_hWnd,
&crt);
hdc
= BeginPaint(win_hWnd, &ps);
bdBrush
= CreateSolidBrush(bdColor);
FillRect(hdc,
0, 0, clientWidth, bdThick, bdBrush);
FillRect(hdc,
0, 0, bdThick, clientHeight, bdBrush);
FillRect(hdc,
0, clientHeight - bdThick, clientWidth, clientHeight, bdBrush);
FillRect(hdc,
clientWidth - bdThick, 0, clientWidth, clientHeight, bdBrush);
capBrush
= CreateSolidBrush(capColor);
splitBrush
= CreateSolidBrush(splitColor);
SetBkMode(hdc,
TRANSPARENT);
if
(bVertical) {
//
ŸÀÌƲ ¿µ¿ª ±×¸²
FillRect(hdc,
bdThick, bdThick, clientWidth - bdThick, bdThick + capThick,
capBrush);
font
= CreateFont(15, 0, 0, 0, 0, 0, 0, 0, HANGUL_CHARSET, 3, 2, 1,
VARIABLE_PITCH
| FF_MODERN, TEXT("¸¼Àº °íµñ"));
oldFont
= (HFONT)SelectObject(hdc, font);
//
¼öÁ÷ Áß¾Ó À§Ä¡¿¡ ŸÀÌƲ Ãâ·Â
TextOutVCenter(hdc,
bdThick + 4, bdThick + capThick / 2, caption);
FillRect(hdc,
bdThick, bdThick + capThick, clientWidth - bdThick,
clientHeight
- bdThick, splitBrush);
}
else {
FillRect(hdc,
bdThick, bdThick, bdThick + capThick, clientHeight - bdThick,
capBrush);
font
= CreateFont(15, 0, 900, 0, 0, 0, 0, 0, HANGUL_CHARSET, 3, 2, 1,
VARIABLE_PITCH
| FF_MODERN, TEXT("¸¼Àº °íµñ"));
oldFont
= (HFONT)SelectObject(hdc, font);
SIZE
sz;
GetTextExtentPoint32(hdc,
caption, lstrlen(caption), &sz);
TextOutSz(hdc,
bdThick + capThick / 2 - sz.cy / 2, clientHeight - bdThick - 50, caption);
FillRect(hdc,
bdThick + capThick, bdThick, clientWidth - bdThick,
clientHeight
- bdThick, splitBrush);
}
DeleteObject(capBrush);
DeleteObject(bdBrush);
DeleteObject(splitBrush);
SelectObject(hdc,
oldFont);
DeleteObject(font);
EndPaint(win_hWnd,
&ps);
return
0;
}
¿©±â±îÁö ÇÑ ÈÄ ½ÇÇàÇϸé À§Á¬Àº À§, ¾Æ·¡·Î ³ª¿ÇÏ°í ƼÁ¬Àº Æ®·¹ÀÌ¿¡
¼öÆòÀ¸·Î ³ª¿ÇÑ´Ù. ¾ÆÁ÷ ±¸ÇöÇÏÁö ¾ÊÀº ÇÔ¼öÀÇ ¿øÇüÀº Àá½Ã ÁÖ¼® ó¸®ÇØ ³õÀÚ. ¹æÇâÀ» º¯°æÇÏ´Â UI°¡ ¾ø¾î OnCreate¿¡¼ bVerticalÀ» false·Î ¹Ù²Û ÈÄ ½ÇÇàÇØ ºÁ¾ß ¼öÆòÀ¸·Î ¹è¿ÇÑ
°ÍÀ» º¼ ¼ö ÀÖ´Ù.
½Ã°è°¡ Àß µ¿ÀÛÇÏ¸ç °è»ê±âµµ µ¿ÀÛÇÏ°í LCDTest¸¦ Ŭ¸¯Çϸé Àß
¶á´Ù. ¾ÆÁ÷ À̵¿Àº ¾ÈµÇ¸ç Á¾·á UI°¡ ¾ø´Ù. Alt+F4 ´ÜÃàÅ°¸¦ ´·¯¼ Á¾·áÇÑ´Ù.
¾ÆÁ÷ ¸ÞÀÎ À©µµ¿ì¸¦ À̵¿ÇÒ ¼ö ¾ø´Ù. À§ÂÊÀÇ SoEnty¶ó°í
Ãâ·ÂÇÑ ºÎºÐÀº Á÷Á¢ ±×¸° Ä¿½ºÅÒ Å¸ÀÌºí ¹ÙÀÏ »Ó ÁøÂ¥ ŸÀÌƲ ¹Ù¾Æ°¡ ¾Æ´Ï¾î¼ µå·¡±×ÇÒ ¼ö ¾ø´Ù. Á÷Á¢
ŸÀÌƲ ¹Ù¸¦ ±×¸®°í À̵¿±îÁö ó¸®ÇØ¾ß ÇÑ´Ù. ÀÌ Ã³¸®¸¦ À§ÇØ Ä¿¼°¡ ¾îµðÂë ÀÖ´ÂÁö À§Ä¡¸¦ ÆľÇÇØ¾ß ÇÑ´Ù. ´ÙÀ½ ¼¼ ¸Þ¼µå¸¦ Ãß°¡ÇÑ´Ù.
bool CMainWindow::IsInCaption(int cx, int cy)
{
if
(bVertical) {
if
(cy > bdThick && cy <= bdThick + capThick) return true;
}
else {
if
(cx > bdThick && cx <= bdThick + capThick) return true;
}
return
false;
}
// ¸î¹ø° À§Á¬ ½ºÇø´ÅÍ ¾Æ·¡¿¡ ÀÖ´ÂÁö Á¶»çÇÑ´Ù. ¾Æ´Ï¸é -1 ¸®ÅÏ
int CMainWindow::FindSplitVirt(int cy)
{
int
y = bdThick + capThick;
for
(size_t wi = 0; wi < arWidget.size(); wi++) {
if
(arWidget[wi]->dget_visible == false) continue;
y
+= arWidget[wi]->vertHeight;
if
(cy < y) return -1;
//
½ºÇø´ÅÍ »çÀÌ¿¡ ÀÖÀ¸¸é ¼öÁ÷ Á¶Á¤ Ä¿¼
if
(cy >= y && cy <= y + splitThick) {
return
wi;
}
y
+= splitThick;
}
return
-1;
}
int CMainWindow::FindSplitHorz(int cx)
{
int
x = bdThick + capThick;
for
(size_t wi = 0; wi < arWidget.size(); wi++) {
if
(arWidget[wi]->dget_visible == false) continue;
x
+= arWidget[wi]->horzWidth;
if
(cx < x) return -1;
if
(cx >= x && cx <= x + splitThick) {
return
wi;
}
x
+= splitThick;
}
return
-1;
}
IsInCaption ÇÔ¼ö´Â ŸÀÌƲ ¹Ù ¿µ¿ªÀÎÁö Á¶»çÇÑ´Ù. °æ°è¼±ÀÇ µÎ²²µµ °í·ÁÇØ¾ß ÇÔÀ» ÀØÁö ¸»ÀÚ. Áö±ÝÀº °æ°è¼±ÀÌ ¾ãÁö¸¸
¿É¼Ç Á¶Á¤ ±â´ÉÀÌ µé¾î°¡¸é °æ°è¼±µµ µÎ²¨¿öÁú ¼ö ÀÖ¾î Á¤È®È÷ °è»êÇØ¾ß ÇÑ´Ù.
OnMessage ÇÔ¼ö¿¡¼ Ä¿¼ °ü·Ã ¸Þ½ÃÁö¸¦ ó¸®ÇÑ´Ù. ´Ù¸¥ ¸Þ½ÃÁö¸¦ ó¸®ÇÒ ¼öµµ ÀÖ´Ù´Â °ÍÀ» º¸À̱â À§ÇØ WM_RBUTTONDOWN
Çڵ鷯°¡ Àִµ¥ ÀÌÁ¦ Á¦°ÅÇÏ°í ¿ÏÀüÈ÷ ´Ù½Ã ÀÛ¼ºÇÑ´Ù.
LRESULT CMainWindow::OnMessage(UINT iMessage,
WPARAM wParam, LPARAM lParam) {
POINT
pt;
RECT
crt;
switch
(iMessage)
{
case
WM_NCHITTEST:
int
nHit;
nHit
= (int)DefWindowProc(win_hWnd, WM_NCHITTEST, wParam, lParam);
//
À½¼ö ÁÂÇ¥°¡ Àü´ÞµÉ ¼öµµ ÀÖ¾î ºÎÈ£ º¯È¯ ij½ºÆÃÀÌ ¹Ýµå½Ã ÇÊ¿äÇÏ´Ù.
pt.x
= (int)(short)LOWORD(lParam);
pt.y
= (int)(short)HIWORD(lParam);
ScreenToClient(win_hWnd,
&pt);
GetClientRect(win_hWnd,
&crt);
if
(nHit == HTCLIENT) {
if
(bVertical) {
if
(pt.x < bdThick)
return
HTLEFT;
if
(pt.x > crt.right - 1 - bdThick)
return
HTRIGHT;
}
else {
if
(pt.y < bdThick)
return
HTTOP;
if
(pt.y > crt.bottom - 1 - bdThick)
return
HTBOTTOM;
}
if
(IsInCaption(pt.x, pt.y)) {
return
HTCAPTION;
}
}
return
nHit;
case
WM_SETCURSOR:
GetCursorPos(&pt);
ScreenToClient(win_hWnd,
&pt);
if
(LOWORD(lParam) == HTCLIENT) {
if
(bVertical) {
if
(FindSplitVirt(pt.y) != -1) {
SetCursor(cursorVert);
return
0;
}
}
else {
if
(FindSplitHorz(pt.x) != -1) {
SetCursor(cursorHorz);
return
0;
}
}
}
break;
//
µÎ²²´Â ÃÖ¼Ò 100 ~ 640±îÁö
case
WM_GETMINMAXINFO:
LPMINMAXINFO
pmmi;
pmmi
= (LPMINMAXINFO)lParam;
if
(bVertical) {
pmmi->ptMinTrackSize.x
= 100;
pmmi->ptMaxTrackSize.x
= 640;
}
else {
pmmi->ptMinTrackSize.y
= 100;
pmmi->ptMaxTrackSize.y
= 640;
}
return
0;
case
WM_WINDOWPOSCHANGING:
if
(magneticEffet) {
LPWINDOWPOS
wp = (LPWINDOWPOS)lParam;
RECT
mrt;
//
ÇöÀç ¸ð´ÏÅÍÀÇ È¸é ¿µ¿ªÀÌ ¾Æ´Ñ ÀÛ¾÷ ¿µ¿ªÀ» ±âÁØÀ¸·Î ÇÑ´Ù.
CopyRect(&mrt,
&arMonitor[GetMonitorOfWindow(win_hWnd)].rcWork);
//
¸ð´ÏÅÍÀÇ º®¿¡ ´Þ¶ó ºÙ´Â´Ù.
if
(ABS(wp->x - mrt.left) < 30) wp->x = mrt.left;
if
(ABS(wp->x + wp->cx - mrt.right) < 30) wp->x = mrt.right -
wp->cx;
if
(ABS(wp->y - mrt.top) < 30) wp->y = mrt.top;
if
(ABS(wp->y + wp->cy - mrt.bottom) < 30) wp->y = mrt.bottom -
wp->cy;
}
return
0;
}
return
CWindow::OnMessage(iMessage, wParam, lParam);
}
WM_NCHITTEST ¸Þ½ÃÁö¿¡¼ Ä¿¼ÀÇ ÇöÀç À§Ä¡¸¦ ±âÁØÀ¸·Î »óÇÏÁ¿ì
°æ°è¼±¿¡ ÀÖ´ÂÁö, ŸÀÌƲ ¹Ù¿¡ ÀÖ´ÂÁö ÆÇ´ÜÇÑ´Ù. °æ°è¼±¿¡
ÀÖ´Ù°í º¸°íÇÏ¸é ¿î¿µÃ¼Á¦°¡ Ä¿¼µµ ÀûÀýÈ÷ ¹Ù²ã ÁØ´Ù. ÀÌ ¸Þ½ÃÁö¸¸ ó¸®Çصµ ŸÀÌƲ¹Ù¸¦ µå·¡±×ÇÏ¿© À̵¿ÇÒ
¼ö ÀÖ´Ù.
À§Á¬ »çÀÌÀÇ ½ºÇø´¹Ù¿¡ ÀÖ´Â Á¶°ÇÀº Á÷Á¢ ÆÇ´ÜÇؼ Ä¿¼¸¦ ¹Ù²ã ÁÖ¾î¾ß ÇÑ´Ù.
WM_SETCURSOR¿¡¼ ¹æÇâ¿¡ µû¶ó ¾î´À À§Ä¡¿¡ ÀÖ´ÂÁö º¸°í Ä¿¼¸¦ º¯°æÇÑ´Ù. Ä¿¼´Â
´ÙÀ½ µÎ °³¸¦ ¹Ì¸® ¸¸µé¾î µÎ¾ú°í OnCreate¿¡¼ ÀÐ¾î µÎ¾ú´Ù.
WM_GETMINMAXINFO´Â À©µµ¿ìÀÇ Å©±â¸¦ Á¦ÇÑÇÑ´Ù. ÃÖ¼Ò 100¿¡¼ ÃÖ´ë 640±îÁö¸¸
´Ã¸± ¼ö ÀÖ´Ù. ¸ð´ÏÅͺ® ±Ùó·Î À̵¿Çϸé ö½â ´Þ¶ó ºÙ´Â ÀÚ¼® È¿°úµµ ±¸ÇöÇß´Ù. ¸ÖƼ ¸ð´ÏÅͱîÁö °í·ÁÇϸç Àüü ¸ð´ÏÅÍ ±âÁØÀÌ ¾Æ´Ñ ÀÛ¾÷¿µ¿ª º®¿¡ ºÙµµ·Ï ÇÏ¿© Ÿ½ºÅ©¹Ù¸¦ ħ¹üÇÏÁö ¾Êµµ·Ï Çß´Ù.
OnSize¿¡¼ À©µµ¿ì Å©±â º¯°æÀ» ó¸®ÇÑ´Ù. ½ÇÁ¦·Î ¹Ù²î¾úÀ» ¶§¸¸ ·¹À̾ƿôÀ» ´Ù½Ã ¼³Á¤ÇÑ´Ù. ½ºÇø´¹Ù µå·¡±×½Ã À§Á¬ÀÇ Å©±â¸¦ Á¶Á¤ÇÏ·Á¸é ¸¶¿ì½º ¸Þ½ÃÁö¸¦ Á÷Á¢
ó¸®ÇØ¾ß ÇÑ´Ù. ´ÙÀ½ ¼¼ ¸Þ½ÃÁöÀÇ Çڵ鷯¸¦ ÀÛ¼ºÇÑ´Ù.
LRESULT CMainWindow::OnSize(WPARAM wParam, LPARAM
lParam)
{
RECT
crt;
GetClientRect(win_hWnd,
&crt);
if
(bVertical) {
//
½ÇÁ¦·Î ¹Ù²ï °æ¿ì¿¡¸¸ ·¹À̾ƿôÀ» ´Ù½Ã Àâ´Â´Ù. Relayout¿¡¼ Å©±â º¯°æ½Ã¿¡µµ WM_SIZE°¡ ¿À´Âµ¥
//
À̶§´Â Å©±â°¡ ÀÌ¹Ì °áÁ¤µÈ »óÅ¿©¼ ´Ù½Ã RelayoutÀ» È£ÃâÇÒ ÇÊ¿ä ¾ø´Ù.
if
(vertThick != crt.right) {
vertThick
= crt.right;
Relayout();
}
}
else {
if
(horzThick != crt.bottom) {
horzThick
= crt.bottom;
Relayout();
}
}
return
0;
}
LRESULT CMainWindow::OnLButtonDown(WPARAM wParam,
LPARAM lParam)
{
POINT
pt;
pt.x
= (int)(short)LOWORD(lParam);
pt.y
= (int)(short)HIWORD(lParam);
if
(bVertical) {
dragWidget
= FindSplitVirt(pt.y);
if
(dragWidget == -1) return 0;
SetCapture(win_hWnd);
}
else {
dragWidget
= FindSplitHorz(pt.x);
if
(dragWidget == -1) return 0;
SetCapture(win_hWnd);
}
return
0;
}
LRESULT CMainWindow::OnMouseMove(WPARAM wParam,
LPARAM lParam)
{
RECT
wrt;
POINT
pt;
if
(GetCapture() != win_hWnd) {
return
0;
}
pt.x
= (int)(short)LOWORD(lParam);
pt.y
= (int)(short)HIWORD(lParam);
if
(bVertical) {
//
ÃÖ¼Ò, ÃÖ´ë ³ôÀÌ Àû¿ë
GetWindowRect(arWidget[dragWidget]->win_hWnd,
&wrt);
ScreenToClient(mainWindow.win_hWnd,
(LPPOINT)&wrt.left);
int
newHeight = min(max(pt.y - wrt.top, widgetMinThick), widgetMaxThick);
//
µå·¡±×ÁßÀÎ À§Á¬ÀÇ ³ôÀÌ Á¶Á¤. ÇöÀç ³ôÀÌ¿Í ¼³Á¤»óÀÇ ³ôÀÌ °°ÀÌ Á¶Á¤ÇÑ´Ù.
arWidget[dragWidget]->vertHeight
= newHeight;
}
else {
//
ÃÖ¼Ò, ÃÖ´ë Æø Àû¿ë
GetWindowRect(arWidget[dragWidget]->win_hWnd,
&wrt);
ScreenToClient(mainWindow.win_hWnd,
(LPPOINT)&wrt.left);
int
newWidth = min(max(pt.x - wrt.left, widgetMinThick), widgetMaxThick);
//
µå·¡±×ÁßÀÎ À§Á¬ÀÇ ³ôÀÌ Á¶Á¤
//arWidget[dragWidget].pWidget->win_w
= newWidth;
arWidget[dragWidget]->horzWidth
= newWidth;
}
//
·¹À̾ƿô ´Ù½Ã °è»ê
Relayout();
//
¸ÞÀÎ À©µµ¿ì Áï½Ã ´Ù½Ã ±×¸²
InvalidateRect(win_hWnd,
NULL, FALSE);
UpdateWindow(win_hWnd);
return
0;
}
LRESULT CMainWindow::OnLButtonUp(WPARAM wParam,
LPARAM lParam)
{
dragWidget
= -1;
ReleaseCapture();
return
0;
}
ÀÌÁ¦ ŸÀÌƲ ¹Ù¸¦ ²ø¸é À̵¿ÇÑ´Ù. ¸ÞÀÎ À©µµ¿ìÀÇ Å©±âµµ ¹Ù²Ü ¼ö ÀÖµÇ
¹æÇ⠹ݴëÂʸ¸ °¡´ÉÇÏ´Ù. Áï ¼öÁ÷ ¹è¿ÀÏ ¶§´Â ¼öÆò Æø¸¸ Á¶Á¤ÇÒ ¼ö ÀÖ°í ¼öÆò ¹è¿ÀÏ ¶§´Â ¼öÁ÷ ³ôÀ̸¸
Á¶Á¤ÇÒ ¼ö ÀÖ´Ù.
ÆøÀ» ÁÙÀÌ¸é °è»ê±âÀÇ ÄÁÆ®·Ñ ¹èÄ¡°¡ ´Þ¶óÁø´Ù. À§Á¬Àº ÁÖ¾îÁø ÆøÀ»
ÃÖ´ëÇÑ È°¿ëÇϵµ·Ï µðÀÚÀεǾî ÀÖ´Ù. À§Á¬ »çÀÌÀÇ ½ºÇø´¹Ù¸¦ µå·¡±×Çϸé À§Á¬ÀÇ Å©±â°¡ Á¶Á¤µÈ´Ù. ³»ºÎÀÇ À§Á¬ Å©±â°¡ ¹Ù²î¸é ¸ÞÀÎ À©µµ¿ì Å©±âµµ ¿µÇâÀ» ¹Þ´Â´Ù.
¿©±â±îÁö ¸ÞÀÎ À©µµ¿ì ¹èÄ¡´Â ¿Ï·áÇßÁö¸¸ ÀÛ¾÷ ¼ø¼»ó ¾Õ¿¡¼ ¹Ì¸® ¸¸µéÁö ¸øÇß´ø ±â´ÉÀ» Áö±Ý ¿Ï¼ºÇØ ³ÖÀ»°Ô ÀÖ´Ù. µÎ ƼÁ¬ÀÇ OnDraw¿¡¼ ƼÁ¬ Å©±â¸¦ 24·Î °¡Á¤Çß¾ú´Âµ¥ ÀÌÁ¦ ÀÌ Å©±â°¡ tidgetSize º¯¼ö°¡ µÇ¾úÀ¸´Ï
º¯¼ö¸¦ Àоî Àû¿ëÇÑ´Ù.
void CLCDTest::OnDraw(HDC hdc, int width, int
height) {
int
wh = trayWindow.tidgetSize;
StretchBitmap(hdc,
0, 0, wh, wh, icon);
}
void CTextClip::OnDraw(HDC hdc, int width, int
height)
{
int
wh = trayWindow.tidgetSize;
if
(clipToText) {
StretchBitmap(hdc,
0, 0, wh, wh, bitOn);
}
else {
StretchBitmap(hdc,
0, 0, wh, wh, bitOff);
}
}
ƼÁ¬À» ¸¸µé ¶§´Â ÀÌ º¯¼ö°¡ ¾ø¾ú°í ±×·¸´Ù°í Çؼ Æ®·¹ÀÌ ¸ÕÀú ¸¸µé¾î ³õ°í ±× ¾È¿¡ ä¿ï ƼÁ¬À» ¸¸µå´Â °Íµµ
¼ø¼°¡ ¸ÂÁö ¾Ê¾Æ ¾î¿ ¼ö ¾ø´Ù. ÀÌ·± Ãß°¡ ÀÛ¾÷ÀÌ ¾øµµ·Ï ½Ç½À ¼ø¼¸¦ ÃÖ´ëÇÑ Á¤¹ÐÇÏ°Ô Á¶Á¤Çصµ ºÒ°¡ÇÇÇÑ
»óȲÀÌ °¡²û ¹ß»ýÇÑ´Ù.