¸¶. ¹®ÀÚ¿­ µå·¡±×

´ÙÀ½Àº ¼±Åÿµ¿ªÀ» µå·¡±×ÇÏ¿© ¹®ÀÚ¿­À» À̵¿ ¶Ç´Â º¹»çÇÏ´Â ±â´ÉÀ» ¸¸µé¾îº¸ÀÚ. ÀÌ ±â´ÉÀº Ŭ¸³º¸µå Á¶ÀÛ¾øÀÌ ¸¶¿ì½º¸¸À¸·Î ¹®ÀåÀ» Àç¹èÄ¡ÇÒ ¼ö ÀÖ¾î ¼Ò½º ÄÚµå ÆíÁý½Ã¿¡ ¾ÆÁÖ À¯¿ëÇÏ´Ù. ¼±Åÿµ¿ªÀ» µå·¡±×ÇÏ¸é ¹®ÀÚ¿­ÀÌ À̵¿µÇ°í <Ctrl>Å°¸¦ ´©¸¥ ä·Î µå·¡±×ÇÏ¸é º¹»çµÈ´Ù. ¹®ÀÚ¿­ µå·¡±× ±â´ÉÀº ºí·Ï¼±ÅÃÀ̳ª ÁÙ´ÜÀ§ ¼±Åðú´Â ¶Ç ´Ù¸¥ ¸ðµåÀ̹ǷΠ¸ðµå¸¦ ±¸ºÐÇϱâ À§ÇÑ Àü¿ªº¯¼ö°¡ ÇÊ¿äÇÏ´Ù. ´ÙÀ½ º¯¼ö¸¦ ¼±¾ðÇÑ´Ù.

 

BOOL bDragSel;

 

BOOL OnCreate(HWND hWnd, LPCREATESTRUCT lpCreateStruct)

{

     ....

     bDragSel=FALSE;

 

ÀÌ º¯¼ö°¡ TRUEÀÌ¸é ¹®ÀÚ¿­ µå·¡±× ¸ðµå°¡ µÇ¸ç ¸¶¿ì½º ¸Þ½ÃÁö ó¸® ÇÔ¼ö(±¸Ã¼ÀûÀ¸·Î OnMouseMove)µéÀº ÀÌ º¯¼ö°ª¿¡ µû¶ó µ¿ÀÛÀÌ ´Þ¶óÁø´Ù. OnCreate¿¡¼­ ÀÌ º¯¼ö¸¦ FALSE·Î ÃʱâÈ­ÇÑ´Ù. ¹®ÀÚ¿­ µå·¡±×ÀÇ ½ÃÀÛÀº ¸¶¿ì½º ¿ÞÂÊ ¹öÆ°À» Ŭ¸¯ÇÑ ½ÃÁ¡ÀÎ OnLButtonDown¿¡¼­ ó¸®ÇÑ´Ù.

 

void OnLButtonDown(HWND hWnd, BOOL fDoubleClick, int x, int y, UINT keyFlags)

{

     int toff;

     BOOL bShift, bControl;

     int r,c;

     int nr;

     int SelFirst, SelSecond;

 

     bShift=((GetKeyState(VK_SHIFT) & 0x8000) != 0);

     bControl=((GetKeyState(VK_CONTROL) & 0x8000) != 0);

 

    if (IsInSelection(x+xPos, y+yPos)) {

        bDragSel=TRUE;

        SetCapture(hWnd);

        bCapture=TRUE;

        return;

    }

 

     if (x < MarginWidth) {

     ....

 

ÇöÀç Ä¿¼­ À§Ä¡°¡ ¼±Åÿµ¿ª ¾ÈÀ̸é Áï, ¼±Åÿµ¿ª¿¡¼­ ¸¶¿ì½º ¹öÆ°À» Ŭ¸¯ÇßÀ¸¸é bDragSelÀ» TRUE·Î º¯°æÇÏ¿© ¹®ÀÚ¿­ µå·¡±×°¡ ½ÃÀ۵ǾúÀ½À» ±â·ÏÇسõ´Â´Ù. µå·¡±×Áß¿¡ ¸¶¿ì½º ¸Þ½ÃÁö¸¦ °è¼Ó ¹Þ¾Æ¾ß ÇϹǷΠĿ¼­´Â ĸóÇØ¾ß ÇÑ´Ù. µå·¡±×ÁßÀÇ µ¿ÀÛÀº OnMouseMove¿¡¼­ ó¸®ÇÑ´Ù.

 

void OnMouseMove(HWND hWnd, int x, int y, UINT keyFlags)

{

     ....

    BOOL bControl;

    int sx,sy;

 

     if (bCapture == FALSE) {

          return;

     }

 

    bControl=((GetKeyState(VK_CONTROL) & 0x8000) != 0);

 

    if (bDragSel) {

        if (x > frt.left && x < frt.right && y > frt.top && y < frt.bottom) {

           toff=GetOffFromXY(x+xPos,y+yPos);

           GetXYFromOff(toff,sx,sy);

           SetCaretPos(sx-xPos,sy-yPos);

           if (bControl) {

               SetCursor(hCCopy);

           } else {

               SetCursor(hCMove);

           }

        } else {

           SetCursor(hCNoDrop);

        }

    } else {

          OldOff=off;

          ....

     }

 

     bInstTimer=FALSE;

     ....

 

¹®ÀÚ¿­ µå·¡±×ÁßÀÌ°í Æ÷¸ËÆÿµ¿ª ¾ÈÀ̸é ij·µÀÇ À§Ä¡¸¦ ¸¶¿ì½º Ä¿¼­ À§Ä¡·Î ¿Å°Ü µå·ÓÇÒ ÀÚ¸®¸¦ º¸¿©ÁØ´Ù. À̶§ SetCaretÀ» È£ÃâÇÒ ¼ö´Â ¾øÀ¸¸ç ¹Ýµå½Ã SetCaretPos ÇÔ¼ö·Î Á÷Á¢ ij·µÀ» ¿Å°Ü¾ß ÇÑ´Ù. ¿Ö³ÄÇϸé SetCaretÀº Àü¿ªº¯¼ö off °ªÀ» ±âÁØÀ¸·Î ij·µÀ» ¿Å°ÜÁִµ¥´Ù ij·µÀ» ¿Å°ÜÁÖ´Â ÀÛ¾÷ ¿Ü¿¡ °­Á¦ ½ºÅ©·Ñ ±â´É µî ¿©·¯ °¡Áö 󸮸¦ °°ÀÌ ÇÏ°í Àֱ⠶§¹®ÀÌ´Ù. bDragSelÀÏ ¶§ÀÇ Ä³·µÀ̵¿Àº µå·Ó À§Ä¡¸¦ º¸¿©ÁÖ´Â ÀÓ½ÃÀûÀÎ À̵¿¿¡ ºÒ°úÇÏ´Ù.

Ä¿¼­À̵¿Áß¿¡ Ä¿¼­ÀÇ ¸ð¾çµµ ¹Ù²ãÁִµ¥ <Ctrl>Å°°¡ ´­·¯Á® ÀÖÀ¸¸é º¹»çÄ¿¼­¸¦ º¸¿©ÁÖ°í ±×·¸Áö ¾ÊÀ¸¸é À̵¿Ä¿¼­¸¦ º¸¿©ÁØ´Ù. ¸¸¾à Æ÷¸ËÆÿµ¿ª ¹ÛÀ¸·Î Ä¿¼­°¡ ³ª°¬À¸¸é ÀÌ »óÅ¿¡¼­´Â µå·ÓÇÒ ¼ö ¾øÀ¸¹Ç·Î µå·Ó ±ÝÁö Ä¿¼­¸¦ º¸¿©ÁÖ¾î¾ß ÇÑ´Ù.

OnMouseMove´Â µå·ÓµÉ ÀÚ¸®¸¦ º¸¿©ÁÖ°í <Ctrl>Å°ÀÇ »óÅ¿¡ µû¶ó ÀûÀýÈ÷ Ä¿¼­¸¸ ¹Ù²Ù¸é µÈ´Ù. ¹®ÀÚ¿­ º¹»ç³ª À̵¿Ã³¸®´Â ¹öÆ°À» ³õÀ» ¶§ÀÎ OnLButtonUp¿¡¼­ ¸ðµÎ ó¸®ÇÑ´Ù. Áö±Ý±îÁö º°·Î ÇÏ´Â ÀÏÀÌ ¾ø¾ú´ø OnLButtonUp¿¡ ´ë·®ÀÇ Äڵ尡 Ãß°¡µÇ¾ú´Ù.

 

 

void OnLButtonUp(HWND hWnd, int x, int y, UINT keyFlags)

{

     BOOL bControl;

     int SelLen;

     int toff;

 

     bCapture=FALSE;

     bSelLine=FALSE;

     ReleaseCapture();

     KillTimer(hWnd,1);

 

     bControl=((GetKeyState(VK_CONTROL) & 0x8000) != 0);

 

     if (bDragSel) {

          bDragSel=FALSE;

          if (IsInSelection(x+xPos, y+yPos)==TRUE) {

              off=GetOffFromXY(x+xPos,y+yPos);

              SetCaret();

              SelStart=SelEnd=0;

              Invalidate(-1);

          } else {

              if (x > frt.left && x < frt.right && y > frt.top && y < frt.bottom) {

                   SelLen=abs(SelStart-SelEnd);

                   toff=GetOffFromXY(x+xPos,y+yPos);

                   CopyString(bControl,min(SelStart,SelEnd),toff,SelLen);

 

                   SelStart=toff;

                   SelEnd=SelStart+SelLen;

                   off=SelEnd;

                   SetCaret();

                   Invalidate(-1);

              } else {

                   SetCaret();

              }

          }

     }

}

 

ÀÌ ÇÔ¼ö°¡ µå·ÓÀ» ó¸®ÇÏ·Á¸é ¹®ÀÚ¿­ µå·¡±× »óÅ¿©¾ß ÇϹǷΠ¸ðµç ÄÚµå´Â if (bDragSel) { ºí·Ï¿¡ ÀÛ¼ºµÇ¾î ÀÖ´Ù. µå·ÓµÈ À§Ä¡°¡ ¾îµðÂëÀΰ¡¿¡ µû¶ó ÀÌ ÇÔ¼öÀÇ µ¿ÀÛÀÌ °áÁ¤µÇ´Âµ¥ ¼±Åÿµ¿ª ¾ÈÀ̶ó¸é ¹®ÀÚ¿­ À̵¿Àº Ãë¼ÒµÈ´Ù. µå·¡±×¸¦ ½ÃÀÛÇÑ °÷¿¡ ´Ù½Ã µå·ÓÇßÀ¸¹Ç·Î À̵¿ÇÒ ¹®ÀÚ¿­°ú ´ë»ó À§Ä¡°¡ µ¿ÀÏÇÏ¿© ¿Å±æ ÇÊ¿ä°¡ ¾ø°Ô µÈ ¼ÀÀÌ´Ù. À̶§´Â ij·µÀ» µå·ÓÇÑ ÀÚ¸®·Î ¿Å°Ü ÁÖ°í ¼±Åÿµ¿ªÀº ÇØÁ¦ÇÑ´Ù. ±»ÀÌ ¼±Åÿµ¿ªÀ» ÇØÁ¦ÇÒ ÇÊ¿ä±îÁö¾ß Àְڴ°¡ »ý°¢µÉÁöµµ ¸ð¸£°ÚÁö¸¸ ¿©±â¼­ ¼±ÅÃÀ» ÇØÁ¦ÇÏÁö ¾ÊÀ¸¸é ¼±Åÿµ¿ªÀ» ´Ü¼ø Ŭ¸¯ÇßÀ» ¶§µµ ¼±ÅÃÀÌ ±×´ë·Î ³²¾ÆÀÖ°Ô µÈ´Ù.

¼±Åÿµ¿ª ¾ÈÀÌ ¾Æ´Ï¶ó¸é Æ÷¸ËÆÿµ¿ª ¾ÈÀÎÁö¸¦ °Ë»çÇØ º»´Ù. ¸¸¾à Æ÷¸ËÆÿµ¿ªÀÌ ¾Æ´Ï¶ó¸é µå·ÓÇÒ ¼ö ¾ø´Â °÷¿¡, ¿¹¸¦ µé¾î À©µµ¿ì ¹Ù±ù¿¡¼­ ¸¶¿ì½º ¹öÆ°À» ³õÀº °ÍÀ̹ǷΠÀ̶§µµ µå·ÓÀ» Ãë¼ÒÇØ¾ß ÇÑ´Ù. ´Ü, ÀÌ °æ¿ì´Â ¼±ÅÃÀ» Ç® ÇÊ¿äµµ ¾ø°í ij·µÀ» µå·ÓÇÑ °÷À¸·Î ¿Å±âÁöµµ ¾ÊÀ¸¸ç ´Ü¼øÈ÷ SetCaret¸¸ È£ÃâÇÏ¿© ij·µÀ» ¿ø·¡ ÀÖ´ø ÀÚ¸®(SelEnd)·Î ´Ù½Ã º¸³» Áֱ⸸ ÇÏ¸é µÈ´Ù. ¹®ÀÚ¿­ µå·¡±× ÀÚü¸¦ ¿ÏÀüÈ÷ Ãë¼ÒÇÏ°í µå·¡±×¸¦ ½ÃÀÛÇϱâ ÀüÀÇ »óÅ·Πµ¹¾Æ°¡´Â °ÍÀÌ´Ù.

Æ÷¸ËÆÿµ¿ª ¾ÈÀÌ°í ¼±Åÿµ¿ª ¿ÜºÎ¿¡ µå·ÓµÇ¾ú´Ù¸é ¿©±â¼­ µå·Ó 󸮸¦ ÇÑ´Ù. <Ctrl>Å°ÀÇ »óÅ¿¡ µû¶ó ¹®ÀÚ¿­ À̵¿ ¶Ç´Â º¹»ç¸¦ Çϴµ¥ ¿©±â¼­ Á÷Á¢ ÇÏÁö ¾Ê°í CopyStringÀ̶ó´Â ¹®ÀÚ¿­ À̵¿ ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù. ÀÌ ÇÔ¼ö´Â ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÑ´Ù.

 

void CopyString(BOOL bCopy, int from, int &to, int len)

{

     TCHAR *t;

     int orito=to;

 

     t=(TCHAR *)malloc(len+1);

     lstrcpyn(t,buf+from,len+1);

     Insert(to,t);

 

     if (bCopy==FALSE) {

          if (to > from) {

              Delete(from,len);

               to-=len;

          } else {

              Delete(from+len,len);

          }

     }

     free(t);

}

 

ù ¹ø° Àμö·Î À̵¿ÀÎÁö º¹»çÀÎÁö¸¦ Àü´Þ¹Þ´Âµ¥ ÀÌ Àμö°¡ TRUEÀÌ¸é º¹»çÀÌ´Ù. µÎ ¹ø° Àμö´Â ´ë»ó ¹®ÀÚ¿­ÀÇ ½ÃÀÛ ¿ÀÇÁ¼Â, ¼¼ ¹ø° Àμö´Â À̵¿ ¶Ç´Â º¹»çÇÒ ¿ÀÇÁ¼ÂÀ̸ç 4¹ø° Àμö´Â ´ë»ó ¹®ÀÚ¿­ÀÇ ±æÀÌÀÌ´Ù. À̵¿À̶ó´Â µ¿ÀÛÀº º¹»ç ÈÄ »èÁ¦¿Í °°À¸¹Ç·Î º¹»ç µ¿ÀÛÀ» ¸ÕÀú ó¸®ÇÑ´Ù. ÀӽùöÆÛ t¿¡ µå·¡±×µÈ ¹®ÀÚ¿­ ±æÀ̸¸Å­ ¸Þ¸ð¸®¸¦ ÇÒ´çÇÑ ÈÄ ¹®ÀÚ¿­À» º¹»çÇÏ°í Insert ÇÔ¼ö¸¦ È£ÃâÇÏ¿© µå·ÓµÈ À§Ä¡¿¡ ¹®ÀÚ¿­À» »ðÀÔÇϱ⸸ ÇÏ¸é º¹»ç´Â ¾ÆÁÖ °£´ÜÇÏ°Ô ÀÌ·ç¾îÁø´Ù.

ÀÏ´Ü º¹»ç¸¦ ¸ÕÀú Çسõ°í bCopyÀμö°ªÀ» Á¡°ËÇÏ¿© À̵¿ÀÎÁö È®ÀÎÇØ º»´Ù. ¸¸¾à ÀÌ Àμö°¡ FALSEÀÌ¸é º¹»çµÈ ¿øº» ¹®ÀÚ¿­À» »èÁ¦ÇÏ¸é µÈ´Ù. »èÁ¦ µ¿ÀÛÀº µå·ÓµÈ À§Ä¡¿¡ µû¶ó ´Þ¶óÁö´Âµ¥ ¿ø·¡ ¹®ÀÚ¿­ÀÌ ÀÖ´ø ÀÚ¸®º¸´Ù ´õ µÚÂÊ¿¡ µå·ÓµÇ¾ú´Ù¸é SelStart~SelEnd »çÀ̸¦ »èÁ¦ÇÏ¸é µÈ´Ù. ¹Ý´ë·Î ¿ø·¡ ¹®ÀÚ¿­º¸´Ù ´õ ¾ÕÂÊ¿¡ µå·ÓµÇ¾ú´Ù¸é »èÁ¦ÇÒ ´ë»ó ¹®ÀÚ¿­ÀÇ ÀÚ¸®°¡ À̵¿µÇ¾úÀ¸¹Ç·Î ¿ÀÇÁ¼ÂÀ» Àß Á¶Á¤ÇØ¾ß ÇÑ´Ù.

À§ ±×¸²¿¡¼­ ¡®À̵¿ ¡¯ ´Ü¾î¸¦ µå·¡±×ÇÏ¿© ¡®µå·¡±×¡¯ ¾Õ¿¡ µå·ÓÇß´Ù°í Çغ¸ÀÚ. ¡®À̵¿ ¡¯ÀÌ µå·ÓµÈ °÷À¸·Î º¹»çµÇ¸é¼­ µ¿½Ã¿¡ µå·ÓµÈ À§Ä¡ ÀÌÈÄÀÇ ¹®ÀÚµéÀº »ðÀÔµÈ ±æÀ̸¸Å­ µÚ·Î ¹Ð¸°´Ù. À̶§ µå·¡±×µÇ±â ÀüÀÇ ¹®ÀÚ¿­ À§Ä¡¸¦ °¡Áö°í ÀÖ´Â SelStart¿Í SelEndµµ ±×¸¸Å­ µÚ·Î À̵¿ÇÒ °ÍÀÌ´Ù. ±×·¡¼­ ¿ø·¡ ¼±ÅÃµÈ ¹®ÀÚ¿­À» Á¦´ë·Î »èÁ¦ÇÏ·Á¸é ¼±ÅÃÀÇ ½ÃÀÛÁ¡¿¡¼­ ¼±Åÿµ¿ªÀÇ ±æÀ̸¸Å­ ´õÇØ¾ß ÇÑ´Ù.

À̵¿, º¹»ç°¡ ¿Ï·áµÈ ÈÄ¿¡´Â µå·ÓµÈ ¹®ÀÚ¿­À» ¼±ÅÃÇÑ »óÅ·Π¸¸µé¾î µå·ÓµÈ ¹®ÀÚ¿­ÀÓÀ» È®½ÇÇÏ°Ô º¸¿©ÁÖ°í ´ÙÀ½ ÀÛ¾÷À» ½±°Ô Çϵµ·Ï ÇÑ´Ù. µå·ÓµÈ ÀÚ¸® toff°¡ »õ·Î¿î ¼±ÅÃÀÇ ½ÃÀÛÁ¡Àε¥ µÚÂÊÀ¸·Î µå·ÓµÈ °æ¿ì´Â toffµµ ¼±Åÿµ¿ªÀÇ ±æÀ̸¸Å­ Á¶Á¤µÉ ¼ö ÀÖ´Ù. ±×·¡¼­ CopyString ÇÔ¼öÀÇ ¼¼ ¹ø° Àμö´Â ·¹ÆÛ·±½ºÇüÀ¸·Î Àü´ÞµÇ¾î Á¶Á¤µÈ ÈÄÀÇ ¿ÀÇÁ¼Â °ªÀ» ´Ù½Ã µ¹·Á ÁÖµµ·Ï ÇÏ¿´´Ù. µå·Ó °ü·Ã Äڵ尡 Á» º¹ÀâÇغ¸ÀÌÁö¸¸ Çϳª¾¿ ÄÉÀ̽º¸¦ µûÁ® °¡¸ç Á¡°ËÇغ¸¸é ¾î·ÆÁö ¾Ê°Ô ÀÌÇØ°¡ µÉ °ÍÀÌ´Ù.

ÀÌ ½Ç½ÀÀ» Çϸ鼭 ¹®ÀÚ¿­ º¹»ç¿Í À̵¿Ã³¸®¿¡ Ŭ¸³º¸µå¸¦ »ç¿ëÇÏ¸é µÇÁö ¾ÊÀ»±î ÇÏ´Â »ý°¢À» ÇÑ »ç¶÷µµ ºÐ¸íÈ÷ ÀÖÀ» °ÍÀÌ´Ù. µå·¡±×ÇÑ ¹®ÀÚ¿­À» Ŭ¸³º¸µå¿¡ º¹»çÇϰųª Àß¶ó³½ ÈÄ µå·ÓÇÑ °÷¿¡ ºÙ¿©³Ö±â¸¦ ÇÏ¸é ¾ÆÁÖ ±ò²ûÇÏ´Ù. Ŭ¸³º¸µå °ü·Ã ÄÚµå´Â ÀÌ¹Ì ´Ù ÀÛ¼ºµÇ¾î ÀÖÀ¸¹Ç·Î ÄÚµå´Â ´õ ÀÛ¼ºÇÒ ÇÊ¿äµµ ¾ø°í ¸Þ½ÃÁö¸¸ ¼ø¼­´ë·Î º¸³»ÁÖ¸é µÉ °Í °°´Ù. ±â¼úÀûÀ¸·Î ÃæºÐÈ÷ °¡´ÉÇÏ°í Äڵ嵵 ´õ ½±´Ù.

ÇÏÁö¸¸ ÀÌ·± ¹ß»óÀº °¡´ÉÇÏ´Ù°í´Â Çصµ Àý´ë·Î ¹Ù¶÷Á÷ÇÏÁö ¾Ê´Ù. ¿Ö³ÄÇϸé Ŭ¸³º¸µå´Â ½Ã½ºÅÛ Àüü¸¦ ÅëƲ¾î ´Ü Çϳª¹Û¿¡ ¾ø´Â ¼ÒÁßÇÑ ½Ã½ºÅÛ ÀÚ¿øÀÌ°í ÀÌ Å¬¸³º¸µå¿¡ ´ëÇÑ ¼ÒÀ¯±ÇÀº ÀüÀûÀ¸·Î »ç¿ëÀÚ¿¡°Ô Àֱ⠶§¹®ÀÌ´Ù. »ç¿ëÀÚÀÇ ¸í½ÃÀûÀÎ ¸í·ÉÀÌ ¾ø´Â ÇÑ ¾î¶°ÇÑ ÇÁ·Î±×·¥µµ Ŭ¸³º¸µå¸¦ °Çµå·Á¼­´Â ¾ÈµÈ´Ù.

ÀÌ·± ½Ã³ª¸®¿À¸¦ »ý°¢Çغ¸ÀÚ. »ç¿ëÀÚ´Â ÀÛ¾÷Áß¿¡ Áß¿äÇÑ SQL¹®À» Ŭ¸³º¸µå¿¡ À߶ó ³Ö¾ú´Ù. ±×¸®°í ÀÌ SQL¹®À» ºÙ¿©³ÖÀ» ÀÚ¸®·Î À̵¿ÇÑ ÈÄ º¸´Ï ±× ÀÚ¸®¿¡ ¾µµ¥ ¾ø´Â ¹®ÀåÀÌ ÀÖ¾î ¹ØÀ¸·Î µå·¡±×Çؼ­ À̵¿Çß´Ù. ±×¸®°í SQL¹®À» ºÙ¿©³Ö¾ú´Âµ¥ À̶§ »ðÀԵǴ ¹®ÀåÀº SQL¹®ÀÌ ¾Æ´Ï¶ó ¹æ±Ý µå·¡±×ÇÑ ¾µµ¥ ¾ø´Â ¹®ÀåÀ̶ó¸é ¾î¶»°Ô µÇ°Ú´Â°¡? ¾Æ¸¶ ApiEdit´Â ´çÀå Çϵåµð½ºÅ©¿¡¼­ °¨ÂÊ°°ÀÌ »ç¶óÁú °ÍÀÌ´Ù.

Ŭ¸³º¸µå´Â ¿ÂÀüÈ÷ »ç¿ëÀÚÀÇ °ÍÀÌ¸ç »ç¿ëÀÚ¸¸ »ç¿ëÇÒ ±ÇÇÑÀÌ ÀÖ´Ù. ÇÁ·Î±×·¥ÀÌ ³»ºÎÀûÀÎ ÀÚ·á À̵¿À̳ª ´Ù¸¥ ÇÁ·Î±×·¥°ú Åë½ÅÇϱâ À§ÇÑ IPC ¹æ¹ýÀ¸·Î Ŭ¸³º¸µå¸¦ »ç¿ëÇß´Ù¸é ±×°ÍÀº Á¤¸»·Î ÁÖÁ¦³ÑÀº ÁþÀ» ÇÑ °ÍÀÌ´Ù. ¹®ÀÚ¿­ µå·¡±×°¡ Á¤¸» À¯¿ëÇÑ ±â´ÉÀÎ °¡Àå Å« ÀÌÀ¯´Â Ŭ¸³º¸µå¸¦ °æÀ¯ÇÏÁö ¾Ê°í ÆíÁýÀ» ÇÒ ¼ö ÀÖ´Ù´Â Á¡ÀÌ¸ç »ç¿ëÀÚµéÀº ÀÌ »ç½ÇÀ» ÀÌ¹Ì ¾Ë°í ÀÖ´Ù. ±× ±â´ë¿¡ ºÎÀÀÇϱâ À§ÇØ CopyStringÀ̶ó´Â ÇÔ¼ö¸¦ ¾Ö½á ¸¸µç °ÍÀÌ´Ù. ¿©±â¼­ ¸¸µç CopyString ÇÔ¼ö´Â ¹®¼­¸¦ º¯°æÇÏ´Â ÁÖ¿ä ÇÔ¼ö Áß Çϳª·Î¼­ Insert, Delete ¸¸Å­À̳ª Áß¿äÇÑ ¿ªÇÒÀ» ÇÏ°Ô µÈ´Ù.

¹®ÀÚ¿­ µå·¡±×¸¦ À§ÇÑ ¸¶Áö¸· 󸮴 Ŀ¼­¸¦ Á¦´ë·Î °ü¸®ÇÏ´Â °ÍÀÌ´Ù. <Ctrl>Å°¸¦ ´©¸£¸é ¹®ÀÚ¿­ÀÌ º¹»çµÈ´Ù´Â °ÍÀ» È®½ÇÇÏ°Ô º¸¿©ÁÖ¾î¾ß ÇÏ¸ç ±×·¡¼­ OnMouseMove¿¡¼­ <Ctrl>Å°ÀÇ »óŸ¦ ÀÏÀÏÀÌ Ã¼Å©ÇÏ¿© Ä¿¼­¸¦ º¯°æÇÏ°í ÀÖ´Ù. ÇÏÁö¸¸ ÀÌ Ã³¸®¸¸À¸·Î´Â Ä¿¼­ °ü¸®°¡ ÃæºÐÇÏÁö ¾ÊÀºµ¥ Ä¿¼­°¡ ¿òÁ÷ÀÌÁö ¾Ê´Â µ¿¾È¿¡µµ <Ctrl>Å°ÀÇ »óÅ°¡ º¯ÇÒ ¼ö Àֱ⠶§¹®ÀÌ´Ù. ¾î¶² °æ¿ì¶óµµ Ä¿¼­ÀÇ ¸ð¾çÀ» Á¦´ë·Î º¸¿©ÁÖ°í ½ÍÀ¸¸é OnKey¿¡¼­ <Ctrl>Å°ÀÇ ´©¸§°ú ³õÀ½À» Á¡°ËÇؼ­ Ä¿¼­¸¦ ¹Ù²ã¾ß ÇÑ´Ù.

 

void OnKey(HWND hWnd, UINT vk, BOOL fDown, int cRepeat, UINT flags)

{

     ....

    if (bDragSel) {

        if (vk==VK_CONTROL) {

           if (fDown) {

               SetCursor(hCCopy);

           } else {

               SetCursor(hCMove);

           }

        }

        return;

    }

 

     if (fDown==FALSE)

          return;

 

VK_CONTROLÅ°°¡ ´­·¯Á³À¸¸é º¹»ç ¸ð¾çÀÇ Ä¿¼­·Î º¯°æÇÏ°í ±×·¸Áö ¾ÊÀ¸¸é À̵¿ ¸ð¾çÀÇ Ä¿¼­·Î º¯°æÇÏ¿´´Ù. ¸Þ½ÃÁöÅ©·¡Ä¿°¡ WM_KEYDOWN, WM_KEYUPÀ» °°Àº ÇÔ¼ö·Î º¸³» Áֱ⠶§¹®¿¡ fDown °ªÀ» ÇÑ °÷¿¡¼­ Á¡°ËÇÏ¿© Ä¿¼­ »óŸ¦ º¯°æÇÒ ¼ö ÀÖ°Ô µÇ¾ú´Ù. Å°¸¦ ³õÀ» ¶§ÀÇ ¸Þ½ÃÁöµµ ¹Þ¾Æ¾ß ÇϹǷΠÀÌ ÄÚµå´Â ¹Ýµå½Ã if (fDown == FALSE) Á¶°Ç¹® ÀÌÀü¿¡ ÀÖ¾î¾ß ÇÑ´Ù. ÀÌÁ¦ Ä¿¼­°¡ Á¤ÁöµÈ »óÅ¿¡¼­µµ <Ctrl>Å°¸¦ ´©¸£¸é Ä¿¼­¸ð¾çÀÌ ¹Ù²ð °ÍÀÌ´Ù.

OnKey¿¡¼­ <Ctrl>Å°¸¦ ´©¸£°Å³ª ¶¿ ¶§¸¶´Ù Ä¿¼­¸ð¾çÀ» ¹Ù²ã Áشٰí Çؼ­ OnMouseMoveÀÇ Ä¿¼­ º¯°æ Äڵ带 »èÁ¦Çؼ­´Â ¾ÈµÈ´Ù. ¿Ö ¾ÈµÇ´ÂÁö´Â Äڵ带 »èÁ¦Çغ¸¸é ¾Ë ¼ö ÀÖ´Ù.