¸¶Áö¸·À¸·Î ÀÌ ÇÁ·Î±×·¥ÀÌ °¡Áø ¾à°£ÀÇ ¹ö±×¸¦ ¼öÁ¤ÇØ º¸ÀÚ. ApiDraw´Â µµÇüÀ» À̵¿, Å©±â º¯°æÇÒ ¶§ µµÇüÀÌ È¸é ¾È¿¡ Àß ÀÖ´ÂÁö, À߸øµÈ »óŰ¡ ¾Æ´ÑÁö¸¦ Á¡°ËÇÏ¿© µµÇüÀÌ °©Àڱ⠻ç¶óÁöÁö ¾Êµµ·Ï ÇÑ´Ù. ÀÌ·± ¿¡·¯ 󸮿¡ ÀÇÇØ ¶Ç ´Ù¸¥ ¿¡·¯°¡ ¹ß»ýÇÒ ¼ö Àִµ¥ Á÷¼±ÀÇ °æ¿ì ³¡ Á¡À» µå·¡±×ÇÏ¿© ¼öÆò, ¼öÁ÷¼±À¸·Î ¹Ù²Ù¾î ¹ö¸®¸é Æø, ³ôÀ̰¡ 0ÀÌ µÇ¾î ¹«È¿ÇÑ µµÇüÀ¸·Î À߸ø Á¡°ËµÈ´Ù. ±×·¡¼ Á÷¼±À» ±×¾î ¼öÆò, ¼öÁ÷¼±À» ¸¸µé ¼ö ÀÖÁö¸¸ ÀÌ¹Ì Á¸ÀçÇÏ´Â ¼±À» ¼öÆò, ¼öÁ÷¼±À¸·Î´Â ¹Ù²ÙÁö ¸øÇÑ´Ù.
¶ÇÇÑ Å¸¿øÀÇ °æ¿ì ¼±ÅÃÀÇ Á¤È®µµ¸¦ ³ôÀ̱â À§ÇØ ¸®Àü Å×½ºÆ®¸¦ Ç߱⠶§¹®¿¡ Ÿ¿øÀÌ À½¼ö ¿µ¿ªÀ¸·Î À̵¿ÇÏ¿© Ÿ¿ø ¿µ¿ªÀÇ ¹Ù±ùÂÊ ÀϺθ¸ º¸ÀÏ ¶§ ÀÌ Å¸¿øÀ» ´Ù½Ã ¼±ÅÃÇÒ ¹æ¹ýÀÌ ¾ø´Ù. PtInRect·Î ¼±Åà Á¡°ËÀ» ÇÒ ¶§´Â ¾Èº¸ÀÌ´Â ÀÏºÎ¶óµµ È¸é¾È¿¡ °ÉÄ¡±â¸¸ ÇÏ¸é ´Ù½Ã ²¨³¾ ¼ö ÀÖ¾úÁö¸¸ ¸®Àü Å×½ºÆ®¸¦ ÇÔÀ¸·Î½á Ÿ¿ø ³»ºÎ°¡ ¾Æ´Ñ Á¡Àº Ÿ¿øÀ¸·Î ÀÎÁ¤µÇÁö ¾Ê´Â ¹ö±×°¡ »ý±ä °ÍÀÌ´Ù.
ÀÌ µÎ ¹ö±×°¡ ¹ß»ýÇÑ ÀÌÀ¯´Â µµÇüÀÇ À̵¿°ú Å©±â º¯°æ½ÃÀÇ À¯È¿¼º Á¡°Ë ·çƾÀÌ Á¤±³ÇÏÁö ¸øÇϱ⠶§¹®ÀÌ´Ù. ±×·¡µµ ÀÌÀü ¹öÀü¿¡¼´Â ¹ö±×°¡ Àß ¸ñ°ÝµÇÁö ¾Ê¾ÒÀ¸³ª ±×¸®µå ±â´É¿¡ ÀÇÇØ ¼öÆò, ¼öÁ÷¼±À» ¸¸µé±â ½¬¿öÁ³°í ¸®Àü Å×½ºÆ®·Î ÀÎÇØ µµÇü ¼±ÅÃÀÌ Á¤È®ÇØÁ³±â ¶§¹®¿¡ ÀÌÁ¦´Â ÀÌ ¹ö±×°¡ ½±°Ô ÀçÇöµÉ ¼ö ÀÖ´Ù. °´Ã¼ÀÇ À¯È¿¼ºÀ» Á¡°ËÇÏ´Â ¹æ¹ýÀÌ °´Ã¼ÀÇ Å¸ÀÔ¿¡ µû¶ó Á» ´õ Á¤±³ÇØÁú Çʿ䰡 ÀÖ´Ù. °´Ã¼ÀÇ À¯È¿¼ºÀ» Á¡°ËÇÏ´Â ´ÙÀ½ ÇÔ¼ö¸¦ Ãß°¡ÇÑ´Ù.
BOOL IsValidObject(HWND hCanvas,int Type, RECT *ort)
{
RECT crt,irt;
HRGN hRgn;
BOOL bIn;
GetClientRect(hCanvas,&crt);
InflateRect(&crt,-10,-10);
switch (Type) {
case DT_LINE:
if (ort->left == ort->right && ort->top == ort->bottom)
return FALSE;
return (PtInRect(&crt,*((POINT *)ort)) || PtInRect(&crt,*((POINT *)&ort->right)));
case DT_ELLIPSE:
if (IsRectEmpty(ort))
return FALSE;
hRgn=CreateEllipticRgn(ort->left, ort->top, ort->right,ort->bottom);
bIn=RectInRegion(hRgn,&crt);
DeleteObject(hRgn);
return bIn;
default:
IntersectRect(&irt,&crt,ort);
return (!IsRectEmpty(&irt));
}
}
ÀÛ¾÷ ¿µ¿ª Å©±â¿¡¼ 10¸¸Å ¿©À¯ºÐÀ» ÁØ ¿µ¿ªÀ» »ý¼ºÇß´Ù. Á÷¼±ÀÎ °æ¿ì´Â µÎ Á¡ÀÌ ¸ðµÎ °°À» ¶§ ¹«È¿ÇÑ µµÇüÀÌ¸ç µÎ Á¡ Áß Çϳª¶óµµ ÀÛ¾÷ ¿µ¿ª ³»¿¡ ÀÖÀ¸¸é À¯È¿ÇÑ µµÇüÀ¸·Î ÀÎÁ¤Çß´Ù. µû¶ó¼ ¼öÆò, ¼öÁ÷¼±µµ À¯È¿ÇÑ »óŰ¡ µÇ¸ç µå·¡±×ÇØ¼ ¼öÆò, ¼öÁ÷¼±À» ¸¸µé ¼ö ÀÖ´Ù.
Ÿ¿øÀº ÀÏ´Ü ¿µ¿ªÀÌ ºñ¾î ÀÖÁö ¾Ê¾Æ¾ß Çϴµ¥ Æø, ³ôÀÌ µÑ Áß ¾î´À °Íµµ 0ÀÌ ¾Æ´Ï¾î¾ß ´«¿¡ º¸ÀÌ´Â °´Ã¼ÀÌ´Ù. ÀÌ Á¶°ÇÀ» ¸¸Á·ÇÒ °æ¿ì Ÿ¿ø ¸®ÀüÀ» ¸¸µé°í ÀÌ ¸®ÀüÀÌ ÀÛ¾÷ ¿µ¿ªÀÇ ÀϺο¡¶óµµ °ÉÃÄ ÀÖ´ÂÁö Á¡°ËÇß´Ù. ±×¿ÜÀÇ »ç°¢Çü °´Ã¼µéÀº ÀÛ¾÷ ¿µ¿ª°ú °´Ã¼ ¿µ¿ªÀÇ ÀÏºÎ¶óµµ °ãÃÄ ÀÖÀ¸¸é µÈ´Ù. ort°¡ ºñ¾î ÀÖ´Ù¸é ±³ÁýÇÕ ¿µ¿ªÀÌ ÀÖÀ» ¼ö ¾øÀ¸¹Ç·Î ort¿¡ ´ëÇØ IsRectEmpty¸¦ Á¡°ËÇÒ ÇÊ¿ä´Â ¾ø´Ù. À¯È¿¼ºÀ» Á¡°ËÇÒ Çʿ䰡 ÀÖ´Â °÷¿¡¼ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù. ´ÙÀ½ µÎ ±ºµ¥ÀÌ´Ù.
LRESULT OnLButtonUp(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
....
if (DragMode==DM_MOVE || DragMode==DM_SIZE) {
SwapResult=NormalizeRect(&dObj.rt);
if (IsValidObject(hWnd,arObj[NowSel]->Type,&dObj.rt)) {
LRESULT OnKeyDown(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
....
if (bAction) {
if (IsValidObject(hWnd,arObj[NowSel]->Type,&drt)) {
bModified=TRUE;
arObj[NowSel]->rt=drt;
InvalidateRect(hWnd,NULL,TRUE);
}
}
À¯È¿¼ºÀ» Á¡°ËÇÏ´Â º°µµÀÇ ÇÔ¼ö°¡ ¸¸µé¾îÁ³À¸¹Ç·Î ÀÌ ÇÔ¼ö¿¡¼ º°µµÀÇ Á¡°ËÀ» ÇÒ ÇÊ¿ä´Â ¾ø¾îÁ³À¸¸ç µÎ ÇÔ¼öÀÇ Áö¿ª º¯¼ö crt, irtµµ ÀÌÁ¦ ºÒÇÊ¿äÇÏ´Ù. ¸¶Áö¸·À¸·Î ¸±¸®Áî ÈÄ¿¡ ¹ß°ßµÈ ¹ö±× Çϳª¸¦ ¼öÁ¤Çϵµ·Ï ÇÏÀÚ. ¸¶¿ì½º·Î À̵¿À̳ª Å©±â º¯°æÀ» ÇÏ´Â Áß¿¡ ¿À¸¥ÂÊ ¸¶¿ì½º ¹öưÀ» ´·¯ ÆË¾÷ ¸Þ´º¸¦ ¿°Å³ª Űº¸µå·Î À̵¿Çصµ ÀÌ Äڵ尡 µ¿ÀÛÇϴµ¥ µå·¡±× Áß¿¡´Â ÆË¾÷ ¸Þ´º¸¦ ¿°Å³ª Űº¸µå Á¶ÀÛÀ» ¸øÇϵµ·Ï ÇØ¾ß ÇÑ´Ù. ´ÙÀ½ Äڵ带 Ãß°¡Çϵµ·Ï ÇÏÀÚ.
LRESULT OnKeyDown(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
BOOL bShift, bControl;
int dx,dy;
RECT drt;
BOOL bAction=TRUE;
if (DragMode != DM_NONE) {
return 0;
}
....
LRESULT OnContextMenu(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
HMENU hMenu, hPopup;
int TempSel;
POINT pt;
if (DragMode != DM_NONE) {
return 0;
}
....
µå·¡±× ÁßÀÏ ¶§´Â Űº¸µå ÀÔ·ÂÀ̳ª ÆË¾÷ ¸Þ´º Ãâ·ÂÀ» °ÅºÎÇϵµ·Ï Çß´Ù. À̸¦ ¸·Áö ¾ÊÀ¸¸é À̵¿Áß¿¡ ¼±ÅÃÀÌ ¹Ù²î¾î ¹ö¸®¹Ç·Î ÇÁ·Î±×·¥ÀÌ ´Ù¿îµÉ ¼öµµ ÀÖ´Ù. ÀÌ·± ¹ö±×´Â ¹Ì¸® ¿¹ÃøÇϱâ´Â ¾î·ÆÁö¸¸ ÀÏ´Ü Á¸Àç »ç½Ç¸¸ ¾Ë¸é ¼öÁ¤Çϱâ´Â ¾ÆÁÖ ½±´Ù. À̿ܿ¡ ¾ÆÁ÷ ãÁö ¸øÇÑ ¹ö±×°¡ 28°³ ´õ Àִµ¥ ÀÌ°Ç ´ÙÀ½¿¡ ¹ß°ßµÇ´Â´ë·Î ¼öÁ¤Çϱâ·Î ÇÑ´Ù.