³ª. Á¿ì À̵¿

Ä¿¼­À̵¿Å° ¸Þ½ÃÁö ó¸® ºÎºÐÀÌ <Ctrl>, <Shift>Å°¿Í Á¶Çյʿ¡ µû¶ó Äڵ忡 ¸¹Àº º¯È­°¡ ÇÊ¿äÇÏ´Ù. <Ctrl>Å°¿Í <Shift>Å°¸¦ °¢°¢ ´©¸¦ ¼öµµ ÀÖ°í µÑ ´Ù ´©¸¥ ä·Î Ä¿¼­Å°¸¦ Á¶ÀÛÇÒ ¼öµµ ÀÖÀ¸¹Ç·Î ¹Ì¸® ÀÌ Á¡À» °í·ÁÇØ¾ß ÇÑ´Ù. °¢°¢ÀÇ Å° ·çƾ¿¡¼­ <Ctrl>Å°¿Í <Shift>Å°ÀÇ »óŸ¦ ¸Å¹ø Á¶»çÇÏ´Â °ÍÀº ¹«Ã´ ¹ø°Å·Î¿ì¹Ç·Î OnKey ÇÔ¼öÀÇ ¼±µÎ¿¡¼­ ÀÌ µÎ Å°ÀÇ »óŸ¦ ¹Ì¸® Á¶»çÇسõµµ·Ï ÇÏÀÚ.

 

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

{

     ....

     BOOL bShift, bControl;

     int OldOff;

 

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

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

 

Å°ÀÇ ´­¸² »óÅ´ GetKeyState ÇÔ¼ö·Î Á¶»çÇÒ ¼ö ÀÖ´Ù. <Ctrl>Å°ÀÇ ´­¸² ¿©ºÎ´Â bControlº¯¼ö¿¡ ÀúÀåÇßÀ¸¸ç <Shift>Å°ÀÇ ´­¸² ¿©ºÎ´Â bShift¿¡ ÀúÀåÇß´Ù. Å° ·çƾ¿¡¼­´Â ÀÌ µÎ º¯¼ö°ª¸¸ º¸¸é ¾î¶² Å°°¡ ´­·¯Á® ÀÖ´ÂÁö ½±°Ô ¾Ë ¼ö ÀÖ´Ù. OldOff º¯¼ö´Â ¼±Åÿµ¿ª È®Àå½Ã À̵¿ ÀüÀÇ À§Ä¡¸¦ ÀúÀåÇϱâ À§ÇÑ º¯¼öÀÌ´Ù. ¼±Åÿµ¿ª °ü¸®¸¦ À§ÇØ ´ÙÀ½ µÎ °³ÀÇ ÇÔ¼ö¸¦ ´õ ÁغñÇÑ´Ù.

 

void ClearSelection()

{

     if (SelStart != SelEnd) {

          SelStart=SelEnd=0;

          InvalidateRect(hWndMain,NULL,TRUE);

     }

}

 

void ExpandSelection(int Start, int End)

{

     if (SelStart==SelEnd) {

          SelStart=Start;

          SelEnd=End;

     } else {

          SelEnd=End;

     }

     InvalidateRect(hWndMain,NULL,TRUE);

}

 

ClearSelection ÇÔ¼ö´Â ¼±Åÿµ¿ªÀÌ ÀÖÀ» °æ¿ì SelStart¿Í SelEnd¸¦ ¸ðµÎ 0À¸·Î ¸¸µé¾î ¼±Åÿµ¿ªÀ» Á¦°ÅÇÑ´Ù. À̶§ È­¸é¿¡ ±×·ÁÁ® ÀÖ´Â ¹ÝÀü ºí·ÏÀ» Áö¿ö¾ß ÇϹǷΠÀÛ¾÷¿µ¿ª Àüü¸¦ ¹«È¿È­½ÃÄÑ ÁÖ¾ú´Ù. ÀÌ ÇÔ¼ö¿Í µ¿ÀÏÇÑ Äڵ尡 ÀÌ¹Ì OnLButtonDown¿¡ ÀÛ¼ºµÇ¾î Àִµ¥ Áߺ¹µÈ ÄÚµåÀ̹ǷΠClearSelection È£Ãâ·Î ¹Ù²Ùµµ·Ï ÇÏÀÚ.

 

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

{

     ClearSelection();

     ...

 

ExpandSelection ÇÔ¼ö´Â Àμö·Î Àü´ÞµÈ Start¿Í End»çÀÌ·Î ¼±Åÿµ¿ªÀ» È®ÀåÇϴµ¥ ¼±ÅõǾî ÀÖÁö ¾ÊÀ¸¸é »õ·Î ¼±Åÿµ¿ªÀ» ¸¸µé¾î ÁÖ°í ÀÌ¹Ì ¼±ÅÃµÈ »óŶó¸é SelStart´Â ±×´ë·Î µÎ°í SelEnd¸¸ ´Ã·ÁÁÜÀ¸·Î½á ¼±Åÿµ¿ªÀ» È®ÀåÇÑ´Ù. ÀÓÀÇÀÇ µÎ ¿ÀÇÁ¼Â Start~End»çÀ̸¦ Ãß°¡·Î ´õ ¼±ÅÃÇÏ°í ½Í´Ù¸é ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÏ¸é µÈ´Ù.

¿©·¯ °¡Áö À¯Æ¿¸®Æ¼ ÇÔ¼öµéÀ» ¸¸µé¾î µÎ¾ú´Âµ¥ ÀÌÁ¦ ÁøÂ¥ Å°º¸µå ¼±Åà Äڵ带 ÀÛ¼ºÇغ¸ÀÚ. ´ÙÀ½Àº ¿ÞÂÊ(VK_LEFT) À̵¿½ÃÀÇ Ã³¸®ÄÚµåÀÌ´Ù. ±ºµ¥±ºµ¥ Äڵ尡 ¸¹ÀÌ »ðÀԵǾú´Ù.

 

     case VK_LEFT:

          if (off > 0) {

               GetRCFromOff(off,r,c);

               GetLine(r,s,e);

 

            OldOff=off;

            if (bControl) {

               off=GetPrevWord(off);

            } else {

                   if (off==s) {

                        if (buf[GetPrevOff(off)]==¡®\r¡¯) {

                             off=GetPrevOff(off);

                             bLineEnd=FALSE;

                        } else {

                             bLineEnd=TRUE;

                        }

                   } else {

                        off=GetPrevOff(off);

                        bLineEnd=FALSE;

                   }

            }

 

            if (bShift) {

               ExpandSelection(OldOff,off);

            } else {

               if (SelStart != SelEnd) {

                   off=min(SelStart, SelEnd);

               }

            }

               SetCaret();

          }

 

        if (!bShift) {

            ClearSelection();

        }

          return;

 

¼±Åÿµ¿ª È®ÀåÀ» À§ÇØ OldOff º¯¼ö¿¡ À̵¿ ÀüÀÇ ¿ÀÇÁ¼ÂÀ» ¹Ì¸® ÀúÀåÇصξú´Ù. bControlÀ̸é ÀÌÀü ´Ü¾î·Î ij·µÀ» ¿Å±â°í ±×·¸Áö ¾ÊÀ¸¸é ¿ø·¡ ·çƾ´ë·Î ÀÌÀü ¹®ÀÚ¸¸ ã´Â´Ù. <Ctrl>Å°ÀÇ ´­¸² ¿©ºÎ¿¡ µû¶ó À̵¿ÇÒ À§Ä¡°¡ ´Þ¶óÁö±â´Â ÇÏÁö¸¸ ¾î·µç Àü¿ªº¯¼ö off´Â À̵¿ÇÒ À§Ä¡·Î ÀÌ¹Ì À̵¿µÇ¾ú´Ù.

´ÙÀ½Àº bShift »óÅ¿¡ µû¶ó ¼±Åÿµ¿ªÀ» È®ÀåÇÑ´Ù. ¸¸¾à <Shift>Å°°¡ ´­·¯Á® ÀÖ´Ù¸é ExpandSelection ÇÔ¼ö¸¦ È£ÃâÇÏ¿© OldOff~off »çÀÌ, Áï À̵¿ ÀüÀÇ À§Ä¡¿Í À̵¿ ÈÄÀÇ »õ À§Ä¡±îÁö¸¦ Ãß°¡·Î ´õ ¼±ÅÃÇÑ´Ù. ExpandSelection ÇÔ¼ö°¡ ¼±Åà Á¸Àç ¿©ºÎ¿¡ µû¶ó »õ·Î ¼±ÅÃÀ» ¸¸µéµçÁö ¾Æ´Ï¸é È®ÀåÇϹǷΠ±× Àü¿¡ ¼±Åÿµ¿ªÀÌ ÀÖ¾ú´Â°¡ ¾ø¾ú´Â°¡´Â ¿©±â¼­ ½Å°æ¾µ ÇÊ¿ä°¡ ¾ø´Ù.

¼±Åÿµ¿ªÀÌ ÀÖ¾ú´Âµ¥ <Shift>Å°°¡ ´­·¯ÁöÁö ¾Ê¾Ò´Ù¸é ¼±ÅÃÀ» ÇØÁ¦ÇÏ°í ij·µ¸¸ À̵¿ÇÑ´Ù. À̶§ ij·µÀÌ À̵¿ÇØ¾ß ÇÒ À§Ä¡´Â ÇöÀç À§Ä¡ off¸¦ ±âÁØÀ¸·Î ÇÏÁö ¾Ê°í ºí·ÏÀÇ ½ÃÀÛÁ¡À» ±âÁØÀ¸·Î ÇÑ´Ù. Áï ¼±Åÿµ¿ªÀÌ ÀÖ´Â »óÅ¿¡¼­ ¿ÞÂÊÀ¸·Î À̵¿ÇÒ ¶§´Â ÇöÀç À§Ä¡¸¦ ¿ÏÀüÈ÷ ¹«½ÃÇÏ°í ºí·ÏÀÇ ¿ÞÂÊÀ¸·Î ij·µÀ» º¸³»´Â °ÍÀÌ´Ù. ¿Ö ÀÌ·¸°Ô Çϴ°¡ ÇÏ¸é ¼±ÅÃÀÌ ÀÖ´Â »óÅ¿¡¼­ »ç¿ëÀÚ´Â ÇöÀç ij·µÀÌ ÀÖ´Â À§Ä¡¸¦ º¸Áö ¾Ê°í ºí·Ï Àüü¸¦ ij·µÃ³·³ Ãë±ÞÇϱ⠶§¹®ÀÌ´Ù.

±×·¸´Ù°í Çؼ­ ¼±ÅÃÀ» Ç® ¶§ ÇöÀç À§Ä¡ÀÇ ÀÌÀü ¹®ÀÚ·Î °¡´Â °ÍÀÌ ²À Ʋ¸° °ÍÀº ¾Æ´Ï´Ù. ¼±ÅÃÀ» ÇÏ°í ÀÖ´Â Áß¿¡µµ ij·µÀº °è¼Ó ±ô¹ÚÀ̴µ¥ À̶§ ij·µÀ» ¿©ÀüÈ÷ ÇöÀç À§Ä¡·Î Çؼ®ÇÑ´Ù¸é ÀÌÀü ¹®ÀÚ·Î °¡´Â °ÍÀÌ ¿Ç´Ù. ÇÏÁö¸¸ ÀÌ ¿¹Á¦Ã³·³ ¼±ÅÃÁßÀÇ Ä³·µÀ» ¼±ÅÃÀÇ ¹æÇâÀ» ¸í½ÃÇÏ´Â ¿ëµµ·Î Çؼ®ÇÑ´Ù¸é ²À ÀÌÀü ¹®ÀÚ·Î °¡Áö ¾Ê¾Æµµ ¹«¹æÇÏ´Ù.

ÀÌ·± ¹®Á¦´Â ³í¸®¸¦ µûÁö´Â °Íº¸´Ù »ç¿ëÀÚµéÀÌ ¾î¶² ½ÄÀ¸·Î ij·µÀ» Á¶ÀÛÇϴ°¡¿Í ¾î¶² ¹æ½ÄÀ» ´õ ÁÁ¾ÆÇϴ°¡¸¦ µûÁ® º¸´Â °ÍÀÌ ´õ ÇÕ¸®ÀûÀÌ´Ù. ÀÌ ¿¹Á¦´Â ºí·ÏÀÇ ¿ÞÂÊÀ¸·Î °¡´Â ¹æ½ÄÀ» Àû¿ëÇß´Ù. ¾î¶² ÆíÁý±âµéÀº ºí·ÏÀÇ Ã³À½À» ÇöÀç À§Ä¡·Î °¡Á¤ÇÏ°í ºí·ÏÀÇ ¿ÞÂÊÀ¸·Î °¡¸é¼­ µ¿½Ã¿¡ ´Ù½Ã ÇÑ Ä­ ´õ ¿ÞÂÊÀ¸·Î °¡±âµµ ÇÑ´Ù. ¾ÆÁÖ »ç¼ÒÇÑ Â÷ÀÌÀÌÁö¸¸ ÆíÁý±âÀÇ µ¿ÀÛµéÀÌ ÃµÂ÷¸¸º°·Î ´Þ¶óÁú ¼ö ÀÖ´Â ¿©Áö°¡ ¸¹À½À» ¾Ë ¼ö ÀÖ´Ù.

<Shift>Å°°¡ ´­·¯ÁöÁö ¾Ê¾ÒÀ¸¸é ´Ü¼øÇÑ Ä³·µÀ̵¿À̹ǷΠ¼±Åÿµ¿ªÀº ÇØÁ¦ÇØ¾ß ÇÑ´Ù. ÀÌ ¹®ÀåÀº if (off > 0) { } ºí·ÏÀÇ ¹Û¿¡¼­ µû·Î ó¸®ÇÏ°í Àִµ¥ ¿Ö³ÄÇϸé off°¡ 0ÀÎ »óÅÂ, Áï ¹®¼­ÀÇ Ã³À½¿¡¼­ ¿ÞÂÊÀ¸·Î À̵¿ÇÒ ¶§ À̵¿Àº ÇÏÁö ¸øÇÏ´õ¶óµµ ¼±Åÿµ¿ªÀº ÇØÁ¦ÇØ¾ß Çϱ⠶§¹®ÀÌ´Ù.

ÀÌ ÇÔ¼ö´Â Å©°Ô µÎ ºÎºÐÀ¸·Î ³ª´©¾îÁø´Ù. ù ºÎºÐÀº <Ctrl>Å°¸¦ ó¸®Çϴµ¥ <Ctrl>Å°ÀÇ »óÅ¿¡ µû¶ó ÀÌÀü ¹®ÀÚ³ª ¶Ç´Â ÀÌÀü ´Ü¾î·Î ¿ÀÇÁ¼ÂÀ» ¿Å°ÜÁØ´Ù. µÎ ¹ø° ºÎºÐÀº <Shift>Å°¸¦ ó¸®Çϸç ù ¹ø° ºÎºÐÀÌ ¿Å°Ü³õÀº À§Ä¡±îÁö ¼±ÅÃÀ» È®ÀåÇϰųª ¾Æ´Ï¸é ´Ü¼ø À̵¿ÇÑ´Ù. ÀÌ¹Ì ¼±ÅÃÀÌ µÇ¾î ÀÖÀ¸¸é ¼±ÅÃÀ» ÇØÁ¦ÇÏ´Â ÀϱîÁö ÇÑ´Ù. »õ ¿ÀÇÁ¼ÂÀ» °è»êÇÏ´Â ºÎºÐ°ú ¼±ÅÃÀ» È®ÀåÇÏ´Â ºÎºÐÀÌ ºÐ¸®µÇ¾î ÀÖÀ¸¹Ç·Î <Shift>Å°¿Í <Ctrl>Å°¸¦ µ¿½Ã¿¡ ´­·¯µµ »õ ¿ÀÇÁ¼Â±îÁö ¼±ÅÃÀÌ Àß È®ÀåµÈ´Ù. ¸¸¾à <Shift>Å°¸¦ <Ctrl>Å°º¸´Ù ¸ÕÀú ó¸®ÇÏ·Á°í ÇÑ´Ù¸é ±¸Á¶°¡ ¹«Ã´ º¹ÀâÇØÁú °ÍÀÌ´Ù. ¶Ç Ãʺ¸ÀÚµéÀº ÀÌ ÇÔ¼ö¸¦ ´ÙÀ½°ú °°ÀÌ ¼³°èÇÏ´Â ½Ç¼ö¸¦ Çϱ⵵ ÇÑ´Ù.

 

if (bShift) { }

if (bControl) { }

if (bShift && bControl) { }

if (!bShift && !bControl) { }

 

ÀÌ·¸°Ô °¢°¢ÀÇ °æ¿ì¸¦ ³ª´©¸é Áߺ¹µÇ´Â Äڵ尡 ¸¹¾ÆÁ® È¿À²ÀûÀÌÁö ¸øÇϸç Äڵ带 ¼öÁ¤Çϱ⵵ ¹«Ã´ ¹ø°Å·Î¿öÁø´Ù. ÇѸ¶µð·Î º°·Î ÁÁÀº ¼³°è°¡ ¾Æ´Ï´Ù. VK_LEFT´Â Ctrl, Shift 󸮻Ӹ¸ ¾Æ´Ï¶ó bLineEnd¶ó´Â ¾ÆÁÖ º¹ÀâÇÑ º¯¼ö¸¦ ´Ù·ç°í Àֱ⠶§¹®¿¡ ÀÚÄ© À߸ø ¼³°èÇÏ¸é ´çÀåÀÇ µ¿ÀÛÀº ¹°·ÐÀÌ°í ÀÌÈÄÀÇ È®Àå¿¡µµ Å« °É¸²µ¹ÀÌ µÈ´Ù. ´ÙÀ½Àº ¿À¸¥ÂÊ À̵¿À» ÀÛ¼ºÇغ¸ÀÚ.

 

     case VK_RIGHT:

          if (off < (int)lstrlen(buf)) {

               GetRCFromOff(off,r,c);

               GetLine(r,s,e);

 

            OldOff=off;

            if (bControl) {

               off=GetNextWord(off);

            } else {

                   if (off==e) {

                        if (buf[e]==¡®\r¡¯) {

                             off=GetNextOff(off);

                        }

                        bLineEnd=FALSE;

                   } else {

                        off=GetNextOff(off);

                        if (off==e && buf[off]!=¡®\r¡¯) {

                             bLineEnd=TRUE;

                        } else {

                             bLineEnd=FALSE;

                        }

                   }

            }

 

            if (bShift) {

               ExpandSelection(OldOff,off);

            } else {

               if (SelStart != SelEnd) {

                   off=max(SelStart, SelEnd);

               }

            }

               SetCaret();

          }

 

        if (!bShift) {

            ClearSelection();

        }

          return;

 

¿ÞÂÊ À̵¿°ú ¿ÏÀüÈ÷ µ¿ÀÏÇÑ ±¸Á¶ÀÌ¸ç »ç¿ëÇÏ´Â ³í¸®µµ ¿ª½Ã µ¿ÀÏÇÏ´Ù. ´Ù¸¸ ¼±ÅÃÀ» Ç® ¶§ ºí·ÏÀÇ Ã³À½À¸·Î °¡´Â °ÍÀÌ ¾Æ´Ï¶ó ºí·ÏÀÇ ³¡À¸·Î °£´Ù´Â Á¡°ú <Ctrl>Å°¸¦ ´©¸¦ ¶§ ´ÙÀ½ ´Ü¾î¸¦ ã´Â´Ù´Â Á¡ÀÌ Á» ´Ù¸¦ »ÓÀÌ´Ù. ´ÙÀ½Àº Home, EndÀÇ Äڵ带 ÀÛ¼ºÇغ¸ÀÚ.

 

     case VK_HOME:

          GetRCFromOff(off,r,c);

        OldOff=off;

        if (bControl) {

            off=0;

        } else {

            off=GetOffFromRC(r,0);

        }

          bLineEnd=FALSE;

        if (bShift) {

            ExpandSelection(OldOff,off);

        } else {

            ClearSelection();

        }

          SetCaret();

          return;

     case VK_END:

          GetRCFromOff(off,r,c);

        OldOff=off;

        if (bControl) {

            off=lstrlen(buf);

        } else {

            off=GetOffFromRC(r,1000000);

        }

          if (buf[off]!=¡®\r¡¯ && buf[off]!=0) {

               bLineEnd=TRUE;

          }

        if (bShift) {

            ExpandSelection(OldOff,off);

        } else {

            ClearSelection();

        }

          SetCaret();

          return;

 

<Shift>Å°¿¡ ´ëÇÑ Ã³¸®´Â Á¿ìÀ̵¿°ú µ¿ÀÏÇÏ´Ù. <Ctrl>Å°¿¡ ´ëÇÑ Ã³¸®µµ ºñ±³Àû °£´ÜÇѵ¥ <Ctrl+Home>Àº ¹®¼­ÀÇ Ã³À½À¸·Î °¡¶ó´Â ¸í·ÉÀ̹ǷΠoff¸¦ 0À¸·Î ¸¸µé¸é µÇ°í, <Ctrl+End>´Â ¹®¼­ÀÇ ³¡À¸·Î °¡¶ó´Â ¸í·ÉÀ̹ǷΠ¹öÆÛÀÇ ³¡À¸·Î À̵¿ÇÏ¸é µÈ´Ù.