¿©±â±îÁö À̵¿°ú Å©±â º¯°æ 󸮸¦ ÇØ º¸¾Ò´Âµ¥ ±×·° Àú·° Àß µ¿ÀÛÇÏ´Â °Í °°Áö¸¸ Å×½ºÆ®ÇØ º¸¸é ¸¹Àº ¹®Á¦Á¡ÀÌ ÀÖ´Ù´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù. ¿ì¼± À̵¿À» ½ÃÀÛÇÒ ¶§ Ä¿¼¸¦ ĸóÇϱ⠶§¹®¿¡ ĵ¹ö½º ¹Ù±ùÀÇ º¸ÀÌÁö ¾Ê´Â ¿µ¿ªÀ¸·Î ¿Å°Ü¹ö¸± ¼ö ÀÖ´Â ¹®Á¦Á¡ÀÌ ÀÖ´Ù. ĵ¹ö½ºÀÇ ¿À¸¥ÂÊÀ̳ª ¾Æ·¡ÂÊÀ¸·Î »ç¶óÁø µµÇüÀº À©µµ¿ìÀÇ Å©±â¸¦ Ű¿ö ´Ù½Ã º¼ ¼ö ÀÖÁö¸¸ À½¼ö ¿µ¿ªÀ¸·Î »ç¶óÁ® ¹ö¸° µµÇüÀº º¸ÀÌÁöµµ ¾ÊÀ» »Ó¸¸ ¾Æ´Ï¶ó ´Ù½Ã ²¨³»¿Ã ¹æ¹ýÀÌ ¾ø¾î ÀÖÀ¸³ª ¸¶³ªÇÑ µµÇüÀÌ µÈ´Ù. ĵ¹ö½º ¹Ù±ùÀ¸·Î´Â µµÇüÀ» À̵¿½ÃŰÁö ¸øÇϵµ·Ï ÇÒ Çʿ䰡 ÀÖ´Ù.
Å©±â º¯°æÀÇ °æ¿ì´Â ¹®Á¦°¡ ´õ ½É°¢ÇÏ´Ù. °¢ º¯ÀÇ ÁÂÇ¥°¡ º¯°æµÊÀ¸·Î½á Á¤±ÔÈ ¿øÄ¢ÀÌ À§¹ÝµÉ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î ¿ìÇÏÇâÀ¸·Î ±×·ÁÁø Á÷¼±ÀÇ 8¹ø Æ®·¡Ä¿¸¦ Àâ°í 1¹ø Æ®·¡Ä¿º¸´Ù ´õ ¿ÞÂÊ À§·Î ¿Ã·Á ¹ö¸®¸é ÀÌ Á÷¼±Àº Á¤±ÔȵǾî ÀÖÁö ¾ÊÀ¸¹Ç·Î ´Ù½Ã ¼±ÅÃÇÒ ¼ö ¾øÀ» °ÍÀÌ´Ù. µµÇüÀÇ Å©±â°¡ º¯°æµÉ ¶§´Â »õ·Î ¹Ù²ï µµÇüÀÇ ¿µ¿ªµµ Á¤±ÔÈ Á¶°ÇÀ» ¸¸Á·Çϵµ·Ï ÇØ¾ß ÇÑ´Ù. À̵¿°ú Å©±â º¯°æ½ÃÀÇ ¹®Á¦Á¡À» ÇØ°áÇÏ´Â ½ÃÁ¡Àº µµÇüÀÇ ¿µ¿ªÀÌ »õ·Î °áÁ¤µÇ´Â OnLButtonUpÀÌ´Ù.
LRESULT OnLButtonUp(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
RECT crt,irt;
....
if (DragMode==DM_MOVE || DragMode==DM_SIZE) {
GetClientRect(hWnd,&crt);
InflateRect(&crt,-10,-10);
IntersectRect(&irt,&crt,&dObj.rt);
if (!IsRectEmpty(&irt)) {
arObj[NowSel]->rt=dObj.rt;
}
InvalidateRect(hWnd,NULL,TRUE);
}
DragMode=DM_NONE;
ReleaseCapture();
return 0;
}
ĵ¹ö½ºÀÇ ÀÛ¾÷ ¿µ¿ªÀ» ¾ÈÂÊÀ¸·Î 10Çȼ¿¸¸Å Ãà¼Ò½ÃŲ ÈÄ Àӽà °´Ã¼ÀÇ ¿µ¿ªÀÌ ÀÌ ¾È¿¡ ÀÖÀ» ¶§¸¸ À̵¿ ¹× Å©±â Á¶Á¤À» Çã°¡ÇÏ¸ç ±×·¸Áö ¾ÊÀ» °æ¿ì ¼±Åà °´Ã¼ÀÇ rt ´ëÀÔ¹®À» ½ÇÇàÇÏÁö ¾Êµµ·Ï ÇÏ¿© µ¿ÀÛÀ» Ãë¼ÒÇØ ¹ö¸°´Ù. ¿©±â¼ 10Çȼ¿À̶ó´Â »ó¼ö°ªÀº µµÇüÀ» ÃæºÐÈ÷ ¼±ÅÃÇÒ ¼ö ÀÖ´Â ¿©À¯ºÐÀ¸·Î ¼³Á¤ÇÑ ÀÓÀǰªÀε¥ Á» ´õ Å« °ªÀ» Áְųª ¾Æ´Ï¸é µµÇüÀÇ Å©±â¿¡ ºñ·ÊÀûÀÎ °ªÀ¸·Î ¹Ù²Ü ¼öµµ ÀÖ´Ù.
ÀÌ Äڵ忡 ÀÇÇØ Á¤±ÔÈ ¿øÄ¢µµ Ç×»ó ÁöÄÑÁö´Âµ¥ IntersectRect, IsRectEmpty ÇÔ¼ö´Â Á¤±ÔȵÇÁö ¾ÊÀº »ç°¢ÇüÀº ºó ¿µ¿ªÀ¸·Î °£ÁÖÇϱ⠶§¹®ÀÌ´Ù. ÀÌ·± ¿¹¿Ü 󸮸¦ ¼³°èÇÒ ´ç½ÃºÎÅÍ ¹Ì¸® »ý°¢Çϱâ´Â ¹«Ã´ ¾î·Æ°í ´ë°³ÀÇ °æ¿ì Å×½ºÆ®¸¦ ÇÏ´Â Áß¿¡ ¹®Á¦Á¡À» ¹ß°ßÇÏ°Ô µÈ´Ù. ¹°·Ð °æÇèÀÌ ¸¹Àº »ç¶÷Àº ¼³°èÇÒ ¶§ºÎÅÍ ¹®Á¦¸¦ ¿¹ÃøÇÒ ¼öµµ ÀÖÀ» °ÍÀÌ´Ù. ¿¹¿Ü 󸮿¡ »ç°¢Çü °ü·Ã ÇÔ¼ö¸¦ ¿©·¯ °³ »ç¿ëÇߴµ¥ °£´ÜÇÑ ÇÔ¼öµéÀ̶ó C ÄÚµå·Î Ç®¾î¾µ ¼öµµ ÀÖ´Ù.
if (DragMode==DM_MOVE || DragMode==DM_SIZE) {
SwapResult=NormalizeRect(&dObj.rt);
GetClientRect(hWnd,&crt);
// InflateRect(&crt,-10,-10);
crt.left-=-10;
crt.top-=-10;
crt.right+=-10;
crt.bottom+=-10;
// IntersectRect(&irt,&crt,&dObj.rt);
irt.left=max(crt.left,dObj.rt.left);
irt.top=max(crt.top,dObj.rt.top);
irt.right=min(crt.right,dObj.rt.right);
irt.bottom=min(crt.bottom,dObj.rt.bottom);
// if (!IsRectEmpty(&irt)) {
if (!(irt.left >= irt.right || irt.top >= irt.bottom)) {
±×·¯³ª ÀÌ·¸°Ô Äڵ带 ÀÛ¼ºÇÏ¸é ¼Ò½º°¡ ±æ¾îÁú »Ó¸¸ ¾Æ´Ï¶ó °¢ ÁÙÀÌ ¾î¶² ÀÛ¾÷À» ÇÏ´ÂÁö ¾ó¸¥ ¾Ë¾Æ º¸±â Èûµé¾î °¡µ¶¼ºÀÌ ¶³¾îÁö´Â ´ÜÁ¡ÀÌ ÀÖ´Ù. SetRect, PtInRect, IsRectEmpty °°Àº °£´ÜÇÑ µ¿ÀÛÀÌ¶óµµ °¡±ÞÀûÀÌ¸é ¿î¿µÃ¼Á¦°¡ Á¦°øÇÏ´Â API ÇÔ¼ö¸¦ »ç¿ëÇÏ´Â °ÍÀÌ ÄÚµå ÀÛ¼ºµµ ½±°í ÀÌÈÄ Äڵ带 °ü¸®Çϱ⵵ ½±´Ù.
¿¹¿Ü 󸮿¡ ÀÇÇØ ĵ¹ö½º ¹Ù±ùÀ¸·Î ³ª°¡°Å³ª Á¤±ÔȵÇÁö ¾Ê´Â »óŰ¡ µÉ ¶§ µ¿ÀÛÀ» Ãë¼ÒÇÏ´Â ½ÄÀ¸·Î 1Â÷ÀûÀÎ ¿¡·¯ 󸮸¦ Çß´Ù. ÀÌ Ã³¸®¿¡ ÀÇÇØ ÇÁ·Î±×·¥ÀÌ À߸ø µ¿ÀÛÇѴٰųª µµÇüÀÌ »ç¶óÁö´Â Å« ¹®Á¦Á¡Àº ÇØ°áÇßÁö¸¸ ÇÁ·Î±×·¥ÀÇ °ú´Ù ¹æ¾î·Î ÀÎÇØ »ç¿ëÀÚ´Â ´Ù¼Ò ºÒÆíÇÔÀ» ´À³¥ ¼öµµ ÀÖ´Ù. »ç¿ëÀÚ´Â ¿ìÇÏ´ÜÀ» ²ø¾î Á»ó´ÜÀ¸·Î À̵¿½Ãų ¶§ ±ÝÁö½ÃŰ´Â °Íº¸´Ù ÇÁ·Î±×·¥ÀÌ ¾Ë¾Æ¼ Á¤±ÔÈÇÏ´Â °ÍÀ» ´õ ÁÁ¾ÆÇÒ °ÍÀÌ´Ù. ÇÁ·Î±×·¥ÀÇ ¿ä±¸ Á¶°Ç¿¡ »ç¿ëÀÚ°¡ ¸ÂÃß´Â °Íº¸´Ù´Â »ç¿ëÀÚÀÇ ÆíÁý µ¿ÀÛÀ» ÃÖ´ëÇÑ ÀÎÁ¤ÇÏ¿© ÇÁ·Î±×·¥ÀÌ ÀÚ·áÀÇ ÇüŸ¦ ¹Ù²Ù´Â °ÍÀÌ ÈξÀ ´õ ÁÁÀº Á¤Ã¥ÀÌ´Ù. ÀÌ Á¤Ã¥À» ±¸ÇöÇϱâ À§ÇØ ´ÙÀ½ ÇÔ¼ö¸¦ Ãß°¡ÇÏÀÚ. ¿î¿µÃ¼Á¦°¡ ÀÌ·± ÇÔ¼ö¸¦ Á¦°øÇÏÁö ¾ÊÀ¸¹Ç·Î Á÷Á¢ ¸¸µé¾î ½á¾ß ÇÑ´Ù.
void NormalizeRect(RECT *prt)
{
int t;
if (prt->left > prt->right) {
t=prt->left;
prt->left=prt->right;
prt->right=t;
}
if (prt->top > prt->bottom) {
t=prt->top;
prt->top=prt->bottom;
prt->bottom=t;
}
}
ÀÌ ÇÔ¼ö´Â Àü´ÞµÈ RECT ±¸Á¶Ã¼¸¦ °Á¦·Î Á¤±ÔÈÇϴµ¥ ¹æ¹ýÀº °£´ÜÇÏ´Ù. left¿Í right¸¦ ºñ±³ÇØ º¸°í ¸¸¾à left°¡ rightº¸´Ù ´õ ¿À¸¥ÂÊ¿¡ ÀÖ´Ù¸é µÎ °ªÀ» ±³È¯ÇÏ¿© Á¤±ÔÈÇÏ´Â °ÍÀÌ´Ù. ¼öÁ÷ ¹æÇâµµ ¸¶Âù°¡Áö·Î top°ú bottomÀÇ °ªÀ» ±³È¯ÇÏ¿© Á¤±ÔÈÇÑ´Ù. OnLButtonUp¿¡¼ ÆíÁýµÈ °á°ú¸¦ °´Ã¼¿¡ ´ëÀÔÇϱâ Àü¿¡ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÏ¿© Àӽà °´Ã¼ÀÇ ¿µ¿ªÀ» Á¤±ÔÈÇÏ¸é °á°ú¸¦ ´ëÀÔ¹Þ´Â µµÇüµµ Ç×»ó Á¤±ÔÈ Á¶°ÇÀ» ¸¸Á·ÇÑ´Ù.
LRESULT OnLButtonUp(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
....
if (DragMode==DM_MOVE || DragMode==DM_SIZE) {
NormalizeRect(&dObj.rt);
ÀÌ »óÅ·ΠÅ×½ºÆ®ÇØ º¸¸é Ÿ¿ø, »ç°¢ÇüÀº ¹æÇâÀ» ¹Ù²Ù¾î µå·¡±×ÇØµµ Á¤±ÔȰ¡ Àß µÇÁö¸¸ Á÷¼±ÀÇ °æ¿ì Á¤±ÔÈµÇ¸é¼ ¹æÇâÀÌ ¹Ù²î´Â ºÎÀÛ¿ëÀÌ ÀÖ´Ù. °Á¦ Á¤±Ôȸ¦ ÇßÀ» °æ¿ì Á¤±ÔÈ °á°ú¿¡ µû¶ó Á÷¼±ÀÇ Flagµµ °°ÀÌ Á¶Á¤ÇØ¾ß ÇÏ¸ç ±×·¯±â À§Çؼ´Â Á¤±ÔȽÿ¡ ¼öÆò, ¼öÁ÷ ÂÊÀ¸·Î ±³È¯µÈ °ªÀ» ¾Ë¾Æ¾ß ÇÑ´Ù. NormalizeRect ÇÔ¼ö¸¦ ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇÑ´Ù.
int NormalizeRect(RECT *prt)
{
int t;
int SwapResult=0;
if (prt->left > prt->right) {
t=prt->left;
prt->left=prt->right;
prt->right=t;
SwapResult|=1;
}
if (prt->top > prt->bottom) {
t=prt->top;
prt->top=prt->bottom;
prt->bottom=t;
SwapResult|=2;
}
return SwapResult;
}
SwapResultÀÇ ºñÆ® 0¿¡ ¼öÆò ±³È¯ ¿©ºÎ, ºñÆ® 1¿¡ ¼öÁ÷ ±³È¯ ¿©ºÎ¸¦ ¸®ÅÏÇÑ´Ù. µÎ °³ÀÇ ¸®ÅϰªÀ» ³Ñ±æ ¼ö ¾ø±â ¶§¹®¿¡ Á¤¼ö°ªÀÇ °¢ ºñÆ®¿¡ ±³È¯ ¿©ºÎ¸¦ ±â·ÏÇØ¼ ³Ñ±â´Â °ÍÀÌ´Ù. µµÇüÀÇ ¿ø·¡ Ç÷¡±×¿Í ¼öÆò, ¼öÁ÷ ±³È¯ ¿©ºÎ¿¡ µû¶ó ¹Ù²î¾î¾ß ÇÒ °ªÀ» Ç¥·Î ±×·Á º¸¸é ´ÙÀ½°ú °°´Ù.
¿ø·¡ Ç÷¡±× |
¼öÆò ±³È¯½Ã |
¼öÁ÷ ±³È¯½Ã |
LT |
RT |
LB |
RT |
LT |
RB |
LB |
RB |
LT |
RB |
LB |
RT |
ÀÌ Ç¥¸¦ ±×´ë·Î ÄÚµå·Î ±¸ÇöÇÏ¸é ´ÙÀ½°ú °°¾ÆÁø´Ù. ¼öÆò, ¼öÁ÷ °¢°¢¿¡ ´ëÇØ Ç÷¡±×¸¦ Á¶Á¤Çϸé Á¤±ÔÈ¿¡ ¸Â°Ô ¹æÇâµµ ¹Ù²î°Ô µÈ´Ù.
LRESULT OnLButtonUp(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
int SwapResult;
....
if (DragMode==DM_MOVE || DragMode==DM_SIZE) {
SwapResult=NormalizeRect(&dObj.rt);
GetClientRect(hWnd,&crt);
InflateRect(&crt,-10,-10);
IntersectRect(&irt,&crt,&dObj.rt);
if (!IsRectEmpty(&irt)) {
arObj[NowSel]->rt=dObj.rt;
if (SwapResult & 1) {
switch (arObj[NowSel]->Flag) {
case DS_LT:arObj[NowSel]->Flag=DS_RT;break;
case DS_RT:arObj[NowSel]->Flag=DS_LT;break;
case DS_LB:arObj[NowSel]->Flag=DS_RB;break;
case DS_RB:arObj[NowSel]->Flag=DS_LB;break;
}
}
if (SwapResult & 2) {
switch (arObj[NowSel]->Flag) {
case DS_LT:arObj[NowSel]->Flag=DS_LB;break;
case DS_RT:arObj[NowSel]->Flag=DS_RB;break;
case DS_LB:arObj[NowSel]->Flag=DS_LT;break;
case DS_RB:arObj[NowSel]->Flag=DS_RT;break;
}
}
}
InvalidateRect(hWnd,NULL,TRUE);
}
ÀÌÁ¦ Å×½ºÆ®ÇØ º¸¸é Á÷¼±ÀÌ °Á¦ Á¤±Ô鵃 ¶§ ¹æÇâµµ Àß ¹Ù²ð °ÍÀÌ´Ù. ±×·±µ¥ Äڵ尡 ³Ê¹« ±æ¾îÁ®¼ Á¶±Ý ºÒ¸¸Àε¥ ±³È¯µÈ ¹æÇâ°ú Ç÷¡±×ÀÇ º¯°æµÈ ºÎºÐ°úÀÇ ¿¬°ü °ü°è¸¦ Àß °üÂûÇØ º¸¸é Äڵ带 Á» ´õ ¾ÐÃàÇÒ ¼ö ÀÖ´Ù. DS_LT, DS_RT, DS_LB, DS_RB Ç÷¡±×µéÀÌ ºñÆ® 0¿¡ ¼öÆò ¹æÇâ, ºñÆ® 1¿¡ ¼öÁ÷ ¹æÇâÀ» ±â·ÏÇϵµ·Ï µÇ¾î ÀÖÀ¸¹Ç·Î ±³È¯µÈ ¹æÇâ¿¡ µû¶ó ÀÌ ºñÆ®µé¸¸ ¹ÝÀü½ÃÄÑ ÁÖ¸é µÈ´Ù. Á» ´õ °£´ÜÇÑ ¿¬»ê½ÄÀº ´ÙÀ½°ú °°´Ù.
if (SwapResult & 1) arObj[NowSel]->Flag ^= 1;
if (SwapResult & 2) arObj[NowSel]->Flag ^= 2;
Å×½ºÆ®ÇØ º¸¸é Á¤È®ÇÏ°Ô µ¿ÀÛÇÔÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù. ÄÚµåÀÇ ±æÀ̵µ ª¾ÆÁ³°í ½ÇÇà ¼Óµµµµ ÈξÀ ´õ »¡¶óÁ³À¸¹Ç·Î ¸ðµç ¸é¿¡¼ ¾ÐÃàµÈ Äڵ尡 ´õ ÁÁ´Ù°í ÇÒ ¼ö ÀÖ´Ù. ´õ ¾ÐÃàÇÑ´Ù¸é ´ÙÀ½ ÇÑ Áٷεµ ¾ÐÃàÇÒ ¼ö ÀÖ´Ù.
arObj[NowSel]->Flag ^= SwapResult;
SwapResultÀÇ 1ÀÎ ºñÆ® ºÎºÐ¸¸ ¼±ÅÃÀûÀ¸·Î ¹ÝÀü½ÃŰ´Â °ÍÀÌ¸ç ´Ü ÇϳªÀÇ ºñÆ® ¿¬»ê¹®À¸·Î ÀÌ ¿¬»êÀ» ÇÒ ¼ö ÀÖ´Ù. ÀÌ Äڵ尡 ¾ÕÀÇ µÎ ÁÙÂ¥¸®Äڵ庸´Ù ´õ ºü¸£°í À۾Ƽ Á¡¼ö¸¦ ¸Å±ä´Ù¸é °¡Àå ³ô´Ù. ±×·¯³ª ÀÌ·± ÀÌÁø ¿¬»ê ÄÚµå´Â ¾î¼Àºí¸® ÄÚµùÀÇ °æÇèÀÌ ¾ø´Ù¸é ½±°Ô »ý°¢ÇÏ±â ¾î·Æ´Ù. Àú¼öÁØ ÇÁ·Î±×·¡¹Ö °æÇèÀÇ À¯¿ë¼ºÀÌ ÀÌ·± ½ÄÀ¸·Î °¡²û µå·¯³ª´Â °æ¿ì°¡ Àִµ¥ ÀÌ·± °ÍÀ» ³»°øÀÇ Â÷À̶ó°í ÇÑ´Ù.