ApiDraw04 ÇÁ·ÎÁ§Æ®¿¡¼´Â ±âº»ÀûÀÎ µµÇüÀÇ ÆíÁý ±â´ÉÀ» ÀÛ¼ºÇØ º»´Ù. ApiDraw´Â ±×¸²À» ±×¸®±â¸¸ ÇÏ´Â ÆäÀÎÆÃ ÇÁ·Î±×·¥ÀÌ ¾Æ´Ï¶ó ±×·ÁÁø µµÇüÀ» ÀÚÀ¯·Ó°Ô À̵¿, Å©±â º¯°æ, Ãß°¡, »èÁ¦ÇÒ ¼ö ÀÖ´Â º¤ÅÍ µå·ÎÀ× ÅøÀÌ´Ù. µå·ÎÀ× Åø°ú ÆäÀÎÆÃ ÅøÀÇ Â÷ÀÌÁ¡Àº ÀÌ¹Ì ±×·ÁÁø ±×¸²À» ÆíÁýÇÒ ¼ö Àִ°¡ ¾Æ´Ñ°¡Àε¥ ±×¸²ÆÇÀº ±×·ÁÁø µµÇüÀ» ´Ù¸¥ ±×¸²¿¡ ¿µÇâÀ» ÁÖÁö ¾Ê°í ¿Å±â±â ¾î·Æ´Ù. ÀÌ¹Ì ±×·ÁÁ® ÀÖ´Â µµÇüÀ» ÆíÁýÇÏ·Á¸é ¸ÕÀú ´ë»ó µµÇüÀ» ¼±ÅÃÇÏ´Â ±â´ÉºÎÅÍ ÀÛ¼ºÇØ¾ß ÇÑ´Ù. ¼±ÅÃÀ» ÇÏ´Â ½ÃÁ¡Àº ÀǽÉÀÇ ¿©Áö¾øÀÌ ¸¶¿ì½º ¿ÞÂÊ ¹öưÀ» ´©¸¦ ¶§À̰í OnPaint¿¡¼´Â µµÇüÀÌ ¼±ÅõǾî ÀÖ´Ù´Â °ÍÀ» Ç¥½ÃÇØ¾ß ÇÑ´Ù. ÇϰíÀÚ ÇÏ´Â ÀÛ¾÷ÀÇ ÄÚµå´Â ¾Æ¸¶µµ ´ÙÀ½°ú °°À» °ÍÀÌ´Ù.
LRESULT OnLButtonDown(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
// Ŭ¸¯ÇÑ À§Ä¡ÀÇ µµÇüÀ» ¼±ÅÃÇÑ´Ù.
}
LRESULT OnPaint(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
// ¼±ÅÃµÈ µµÇüÀÇ »óŸ¦ ±×¸°´Ù.
}
OnLButtonDownÀº ¼±ÅûӸ¸ ¾Æ´Ï¶ó µµÇüÀ» ±×¸± ¶§µµ »ç¿ëµÇ¹Ç·Î ÇöÀç ¸ðµå°¡ ¼±Åà »óÅÂÀÎÁö ¾Æ´Ï¸é ±×¸®±â »óÅÂÀÎÁö¸¦ ±¸ºÐÇÒ ¼ö ÀÖ¾î¾ß ÇÑ´Ù. ¼±ÅÃÀ» ÇÏ´Â ¸ðµå´Â µµÇüÀ» ±×¸®´Â ¸ðµå¿Í ´Ù¸£¸ç ¸¶¿ì½º¸¦ Ŭ¸¯ÇÒ ¶§ÀÎ OnLButtonDownÀº ÀÌ ¸ðµå¿¡ µû¶ó ´Ù¸¥ µ¿ÀÛÀ» ÇØ¾ß ÇÒ °ÍÀÌ´Ù. ÀÌ·± ¸ðµå¸¦ ±â¾ïÇÏ´Â º¯¼ö´Â NowToolÀ̸ç WM_COMMAND¿¡¼ IDM_SHAPE_SELECT ¼±Åýà NowToolÀ» ¼±Åà ¸ðµå·Î º¯°æÇÑ´Ù.
LRESULT Main_OnCommand(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
switch(LOWORD(wParam)) {
case IDM_FILE_EXIT:
DestroyWindow(hWnd);
break;
case IDM_SHAPE_SELECT:
NowTool=DT_SELECT;
break;
....
OnLButtonDownÀº NowTool º¯¼ö°ªÀ» º¸°í Á÷¼±À» ±×¸± °ÍÀÎÁö, Ÿ¿øÀ» ±×¸± °ÍÀÎÁö ¾Æ´Ï¸é ¼±ÅÃÀ» ÇÒ °ÍÀÎÁö¸¦ °áÁ¤ÇÒ °ÍÀÌ´Ù. ¼±ÅÃÀ» ÇÏ´Â ½ÃÁ¡(OnLButtonDown)°ú ¼±ÅÃÀ» º¸¿© ÁÖ´Â ½ÃÁ¡(OnPaint)ÀÌ ´Ù¸£¹Ç·Î ¼±ÅÃµÈ µµÇüÀÌ ¾î¶² °ÍÀÎÁö¸¦ º°µµ·Î ±â¾ïÇØ¾ß ÇÑ´Ù. À©µµ¿ìÁî ÇÁ·Î±×·¥Àº ¾Æ¹«¸® »ç¼ÒÇÑ °ÍÀÌ¶óµµ ¸ðµç °ÍÀ» ±â¾ïÇØ¾ß ÇÑ´Ù. µµÇüÀ» ÀúÀåÇÏ´Â ÀÚ·á ±¸Á¶°¡ ¹è¿À̹ǷΠ¼±ÅÃµÈ µµÇüÀÇ Ã·ÀÚ¸¦ ±â¾ïÇÏ¸é µÉ °ÍÀÌ´Ù. ÷ÀÚ¸¸ ±â¾ïÇϸé ÀÌ Ã·ÀڷκÎÅÍ ¼±Åà µµÇüÀÇ Á¾·ù¿Í ¿µ¿ª µîÀ» ¸ðµÎ ±¸ÇÒ ¼ö ÀÖ´Ù. Á¤¼öÇüÀÇ Àü¿ª º¯¼ö NowSelÀ» ¼±¾ðÇϰí OnCreate¿¡¼ -1·Î ÃʱâÈÇÑ´Ù.
int NowSel;
LRESULT OnCreate(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
....
NowSel=-1;
return 0;
}
NowSelÀÌ -1ÀÇ Æ¯À̰ªÀ» °¡Áø´Ù´Â °ÍÀº ¼±ÅÃµÈ µµÇüÀÌ ¾ø´Ù´Â ¶æÀÌ´Ù. ÀÌ º¯¼ö°¡ ¹è¿ÀÇ Ã·ÀÚÀ̹ǷΠ-1ÀÌ Á¤»óÀûÀÎ °ª°ú ±¸ºÐµÇ´Â ƯÀ̰ªÀ¸·Î »ç¿ëµÉ ¼ö ÀÖ´Ù. ÀÌ »óÅ¿¡¼ 3¹ø µµÇüÀ» ¼±ÅÃÇϸé NowSelÀº 3ÀÌ µÉ °ÍÀÌ´Ù. ApiDraw´Â µµÇü Çϳª¸¸ ¼±ÅÃÇÒ ¼ö ÀÖÀ¸¹Ç·Î Á¤¼öÇü º¯¼ö Çϳª¸¸À¸·Î ¼±Åà »óŸ¦ ±â¾ïÇÒ ¼ö ÀÖ´Ù. ¸¸¾à º¹¼ö °³ÀÇ µµÇüÀ» ¼±ÅÃÇÒ ¼ö ÀÖ´Ù¸é ¼±ÅÃµÈ µµÇüµéÀÇ Ã·ÀÚ¸¦ ÀúÀåÇÒ Á¤¼öÇü ¹è¿À̳ª ¿¬°á ¸®½ºÆ®°¡ ÇÊ¿äÇÒ °ÍÀÌ´Ù. ¾Æ´Ï¸é DObject ±¸Á¶Ã¼¿¡ bSelect µîÀÇ ¸â¹ö¸¦ Ãß°¡Çϰí ÀÌ ¸â¹ö¿¡ °³º° µµÇüÀÇ ¼±Åà »óŸ¦ ±â¾ïÇϵµ·Ï ÇÒ ¼öµµ ÀÖ´Ù.
¼±Åà ¸ðµå°¡ Á¤ÀǵǾú°í ¼±Åà »óŸ¦ ±â¾ïÇÒ º¯¼ö°¡ ¸¸µé¾îÁ³À¸¹Ç·Î ÀÌÁ¦ ½ÇÁ¦ ¼±Åà Äڵ带 ÀÛ¼ºÇØ º¸ÀÚ. ¸¶¿ì½º ¿ÞÂÊ ¹öưÀ» ´©¸£¸é Ä¿¼ ¾Æ·¡ÀÇ µµÇüÀ» ¼±Åà »óÅ·Π¸¸µé¾î¾ß Çϴµ¥ ÀÌ ÀÛ¾÷À» ÇÏ·Á¸é ¸ÕÀú ƯÁ¤ ÁÂÇ¥ ¾Æ·¡¿¡ ÀÖ´Â µµÇüÀÌ ´©±¸Àΰ¡¸¦ Á¶»çÇØ¾ß ÇÑ´Ù. ´ÙÀ½ ÇÔ¼ö´Â ÁÖ¾îÁø ÁÂÇ¥·ÎºÎÅÍ µµÇüÀÇ Ã·ÀÚ¸¦ ã´Â´Ù.
int FindObject(int x, int y)
{
int idx;
POINT pt;
pt.x=x;
pt.y=y;
for (idx=arNum-1;idx>=0;idx--) {
if (PtInRect(&arObj[idx]->rt,pt)==TRUE) {
return idx;
}
}
return -1;
}
arObj ¹è¿À» ¼øÈ¸ÇÏ¸é¼ x, y°¡ µµÇü ³»ºÎ¿¡ Àִ ù ¹øÂ° µµÇüÀ» ã¾Æ ±× ÷ÀÚ¸¦ ¸®ÅÏÇÏ¸ç ¸¸¾à Á¶°Ç¿¡ ¸Â´Â µµÇüÀÌ ¹ß°ßµÇÁö ¾ÊÀ» °æ¿ì -1À» ¸®ÅÏÇÑ´Ù. ÁÖ¾îÁø ÁÂÇ¥°¡ µµÇü ³»ºÎÀÎÁö¸¦ Á¶»çÇϱâ À§ÇØ PtInRect ÇÔ¼ö¸¦ »ç¿ëÇß´Ù. ÀÌ ÇÔ¼öÀÇ µ¿ÀÛ¿¡¼ ´«¿©°Ü º¼ °ÍÀº arObj ¹è¿À» ¼øÈ¸ÇÒ ¶§ ³¡¿¡¼ºÎÅÍ ¾ÕÂÊÀ¸·Î ¼øÈ¸¸¦ ÇÑ´Ù´Â Á¡ÀÌ´Ù. ÃÖ±Ù¿¡ Ãß°¡µÈ µµÇüÀÌ È¸éÀÇ À§ÂÊ¿¡ ÀÖÀ¸¹Ç·Î °¡±ÞÀûÀÌ¸é »ç¿ëÀÚ ½Ã¼±ÂÊ¿¡ °¡±î¿î µµÇüÀÌ ¼±ÅõǾî¾ß Çϱ⠶§¹®ÀÌ´Ù. ½ÇÁ¦·Î µµÇüÀ» ¼±ÅÃÇÏ´Â OnLButtonDownÀÇ ÄÚµå´Â ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÑ´Ù.
LRESULT OnLButtonDown(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
int TempSel;
if (NowTool==DT_SELECT) {
TempSel=FindObject(LOWORD(lParam),HIWORD(lParam));
if (NowSel != TempSel) {
NowSel=TempSel;
InvalidateRect(hWnd,NULL,TRUE);
UpdateWindow(hWnd);
}
} else {
sx=LOWORD(lParam);
sy=HIWORD(lParam);
oldx=sx;
oldy=sy;
DragMode=DM_DRAW;
}
SetCapture(hWnd);
return 0;
}
ÇöÀç ¸ðµå°¡ DT_SELECTÀÏ ¶§ FindObject·Î Ŭ¸¯ÇÑ ÁöÁ¡ÀÇ µµÇüÀ» ã¾Æ º»´Ù. °Ë»öµÈ µµÇüÀÇ Ã·ÀÚ¸¦ NowSel¿¡ ¹Ù·Î ´ëÀÔÇÏÁö ¾Ê°í TempSelÀ̶ó´Â Áß°£ º¯¼ö¿¡ ´ëÀÔÇÑ ÈÄ ºñ±³ÇÏ´Â ÀÌÀ¯´Â ¶È°°Àº µµÇüÀ» µÎ ¹ø ¼±ÅÃÇÒ ¶§ ºÒÇÊ¿äÇÑ È¸é ±×¸®±â¸¦ ÇÏÁö ¾Êµµ·Ï Çϱâ À§ÇؼÀÌ´Ù. FindObject·Î °Ë»öÇÑ °á°ú°¡ ÇöÀç ¼±Åà µµÇüÀÎ NowSel°ú ´Ù¸¦ ¶§¸¸ ȸéÀ» ´Ù½Ã ±×¸®µµ·Ï Çß´Ù. ¸¸¾à ÀÌ Ã³¸®¸¦ ÇÏÁö ¾ÊÀ¸¸é µµÇü À§¿¡¼°Ç ºó ¿µ¿ª¿¡¼°Ç ¸¶¿ì½º¸¦ Ŭ¸¯ÇÒ ¶§¸¶´Ù Àüü ȸéÀÌ °è¼Ó ´Ù½Ã ±×·ÁÁú °ÍÀÌ´Ù.
ȸéÀ» ´Ù½Ã ±×¸± ¶§´Â ¹«È¿È¸¸ ½ÃŰ¸é µÈ´Ù. OnPaint¿¡¼ NowSelÀÇ °ªÀ» ÂüÁ¶ÇÏ¿© ¼±Åà µµÇüÀ» ÀûÀýÈ÷ ±×·ÁÁÙ °ÍÀÌ´Ù. ȸ鿡 ¾î¶² º¯È°¡ ¹ß»ýÇÒ ¶§ ȸéÀ» Á÷Á¢ °Çµå¸± Çʿ䰡 ¾øÀ¸¸ç OnPaint°¡ ÂüÁ¶ÇÏ´Â °ª Áß Çϳª¸¦ º¯°æÇÏ°í ¹«È¿ÈÇÑ´Ù. UpdateWindow È£ÃâÀº ¼±Åà »óŸ¦ Áï½Ã ±×¸®µµ·Ï Çϴµ¥ ¼±Åà ÈÄ °ð¹Ù·Î À̵¿Çϰųª Å©±â¸¦ º¯°æÇÒ ¼öµµ Àֱ⠶§¹®ÀÌ´Ù. À̵¿ÇÒ ¶§ ¾î¶² µµÇüÀÌ À̵¿ ´ë»óÀÎÁö ºÐ¸íÈ÷ Ç¥½ÃÇØ¾ß ÇϹǷΠ¼±Åà »óŰ¡ ¹Ù²ð ¶§´Â °ð¹Ù·Î ȸéÀ» °»½ÅÇϵµ·Ï Çß´Ù.
¿©±â±îÁö Äڵ带 ÀÛ¼ºÇÏ¸é ³»ºÎÀûÀ¸·Î ¼±ÅÃÀº ¿Ïº®ÇÏ°Ô ÀÌ·ç¾îÁö¸ç ¼±Åÿ¡ ÀÇÇØ NowSelÀÌ Àß °ü¸®µÇ°í ÀÖÁö¸¸ ¾ÆÁ÷ ¼±Åà »óŰ¡ ȸ鿡 º¸ÀÌÁö´Â ¾Ê´Â´Ù. ȸ鿡 ¼±Åà »óŸ¦ Ãâ·ÂÇϱâ Àü¿¡ ¼±ÅÃÀ» º¯°æÇÏ´Â ÄÚµåµéÀÌ Á¦´ë·Î µ¿ÀÛÇÏ´ÂÁöºÎÅÍ Å×½ºÆ®ÇØ º¸ÀÚ. ¼±ÅÃÀÌ º¯°æµÇ´Â ½ÃÁ¡¿¡ ´ÙÀ½ Å×½ºÆ® Äڵ带 ÀÛ¼ºÇÑ´Ù.
LRESULT OnLButtonDown(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
int TempSel;
if (NowTool==DT_SELECT) {
TempSel=FindObject(LOWORD(lParam),HIWORD(lParam));
if (NowSel != TempSel) {
NowSel=TempSel;
InvalidateRect(hWnd,NULL,TRUE);
UpdateWindow(hWnd);
TCHAR str[128];
wsprintf(str,"NowSel=%d",NowSel);
SetWindowText(GetParent(hWnd),str);
}
} else {
NowSel º¯¼ö°ªÀ» ¸ÞÀÎ À©µµ¿ìÀÇ Å¸ÀÌÆ² ¹Ù¿¡ Ãâ·ÂÇØ ºÃ´Âµ¥ ¾Õ¿¡¼ ¸¸µç ÄÚµåµéÀÌ ÀÌ»ó¾øÀÌ Àß µ¿ÀÛÇÑ´Ù¸é NowSel º¯¼ö°¡ Á¤È®ÇÑ ¼±Åà »óŸ¦ ±â¾ïÇÒ °ÍÀÌ´Ù. ÀÌ·± ½ÄÀ¸·Î »õ·Î ÀÛ¼ºÇÑ ÄÚµåµéÀº Áß°£ Å×½ºÆ®¸¦ ÇØ º¸°í ´ÙÀ½ ´Ü°è·Î ÁøÇàÇØ¾ß ½Å·Ú¼ºÀÖ´Â Äڵ带 ÀÛ¼ºÇÒ ¼ö ÀÖ´Ù. ±»ÀÌ µð¹ö°Å¸¦ µ¹·Á º¸Áö ¾Ê´õ¶óµµ ŸÀÌÆ²¹Ù¿¡ º¯¼ö°ª¸¸ Âï¾îº¸´Â °£´ÜÇÑ ¹æ¹ýÀ¸·Î È®ÀÎ °¡´ÉÇÏ´Ù. Å×½ºÆ® ÄÚµåÀ̹ǷΠÁ¡°ËÀÌ ³¡³ ÈÄ¿¡´Â ¹°·Ð »èÁ¦ÇØ¾ß ÇÑ´Ù.