¶ó. Å°º¸µå ½ºÅ©·Ñ

½ºÅ©·Ñ ¹Ù·ÎÀÇ ½ºÅ©·Ñ ÄÚµå´Â ´Ù ÀÛ¼ºÇß´Ù. ÇÏÁö¸¸ ¾ÆÁ÷ Å°º¸µå·Î´Â ½ºÅ©·ÑÀ» ÇÒ ¼ö ¾ø´Ù. Á¦ÀÏ ¾Æ·¡ÁÙ¿¡ ij·µÀ» µÎ°í ÇÑ Ä­ ¾Æ·¡·Î ³»·Á°¡¸é ij·µ¸¸ ³»·Á°¥ »Ó ½ºÅ©·ÑÀº µÇÁö ¾Ê´Â´Ù. ij·µÀÌ È­¸é ¾Æ·¡·Î ¼û¾î¹ö¸®´Â °ÍÀÌ´Ù.

 

±×·¡¼­ ij·µ À§Ä¡°¡ º¯°æµÇ¸é ÀÌ Ä³·µÀÌ º¸ÀÏ ¼ö ÀÖµµ·Ï È­¸éµµ °°ÀÌ ½ºÅ©·ÑÇØ¾ß ÇÑ´Ù. Å°º¸µå¿¡ ÀÇÇØ ½ºÅ©·ÑÀÌ ¹ß»ýÇϹǷΠOnKey ÇÔ¼ö¿¡¼­ ó¸®ÇØ¾ß ÇÒ °Í °°Áö¸¸ ±×·¸Áö ¾Ê´Ù. Å°º¸µå¿¡ ÀÇÇØ Ä³·µÀÌ À̵¿µÉ ¶§¸¶´Ù ½ºÅ©·ÑµÇ´Â °ÍÀÌ ¾Æ´Ï¶ó ij·µÀÌ È­¸éÀ» ¹þ¾î³¯ ¶§¸¸ ½ºÅ©·ÑµÇ¾î¾ß ÇϹǷΠÀÌ ÀÛ¾÷Àº ij·µ À§Ä¡¸¦ º¯°æÇÏ´Â SetCaret¿¡¼­ ÇÏ´Â °ÍÀÌ ÈξÀ ´õ È¿À²ÀûÀÌ´Ù. Äڵ带 º¸±â Àü¿¡ ÀÌ ÇÔ¼öÀÇ µ¿ÀÛÀ» ±×¸²À¸·Î ¸ÕÀú ¼³¸íÇغ¸¾Ò´Ù.

¸¸¾à ij·µÀÌ ¿À¸¥ÂÊ ¹Ù±ùÀ¸·Î ¹þ¾î³µ´Ù¸é ¿À¸¥ÂÊÀ¸·Î ¹®¼­¸¦ ½ºÅ©·Ñ½ÃÄÑ »õ À§Ä¡°¡ È­¸éÀÇ Áß¾ÓÀÌ µÇµµ·Ï ÇÑ´Ù. ¶ÇÇÑ Ä³·µÀÌ À§ÂÊÀ¸·Î ¹þ¾î³µÀ¸¸é À§·Î ½ºÅ©·ÑÇÏ¿© ij·µÀÌ Ã¹ ¹ø° ÁÙ¿¡ º¸À̵µ·Ï ÇØ¾ß ÇÏ¸ç ¹Ý´ë·Î ¾Æ·¡ÂÊÀ¸·Î ¹þ¾î³ª¸é ¸¶Áö¸· ÁÙ¿¡ ij·µÀÌ ÀÖµµ·Ï ÇØ¾ß ÇÑ´Ù. ÀÌ µ¿ÀÛÀ» ÄÚµå·Î ¿Å±ä °á°ú´Â ´ÙÀ½°ú °°´Ù. Å°º¸µå ½ºÅ©·ÑÀ» Áö¿øÇϱâ À§ÇØ SetCaret ÇÔ¼ö¿¡ Àμö°¡ Çϳª ´õ Ãß°¡µÇ¾ú´Ù.

 

void SetCaret(BOOL bUpdatePrevX/*=TRUE*/, BOOL bScrollToCaret/*=TRUE*/)

{

     HDC hdc;

     int toff;

     int caretwidth;

     int x,y;

    RECT crt;

    int ty;

    BOOL bScroll=FALSE;

 

     hdc=GetDC(hWndMain);

     if (bComp) {

          toff=off-2;

          caretwidth=GetCharWidth(hdc,buf+toff,2);

     } else {

          toff=off;

          caretwidth=2;

     }

     CreateCaret(hWndMain,NULL,caretwidth,FontHeight);

     ShowCaret(hWndMain);

 

     GetXYFromOff(toff,x,y);

    if (bScrollToCaret) {

        GetClientRect(hWndMain,&crt);

        if (nWrap==0) {

            if ((x+caretwidth > xPos+crt.right) || (x < xPos)) {

               xPos=max(0,x-crt.right/2);

               bScroll=TRUE;

            }

        }

 

        if (y < yPos) {

            yPos=y;

            bScroll=TRUE;

        }

 

        if (y+FontHeight > yPos+crt.bottom) {

            ty=(crt.bottom-FontHeight)/LineHeight*LineHeight;

            yPos=y-ty;

            bScroll=TRUE;

        }

 

        if (bScroll == TRUE) {

            SetScrollPos(hWndMain, SB_HORZ, xPos, TRUE);

            SetScrollPos(hWndMain, SB_VERT, yPos, TRUE);

            InvalidateRect(hWndMain,NULL,TRUE);

        }

    }

 

    SetCaretPos(x-xPos,y-yPos);

     ReleaseDC(hWndMain,hdc);

     if (bUpdatePrevX) {

          PrevX=x;

     }

}

 

if (bScrollToCaret) ºí·Ï ¾Æ·¡ÀÇ Á¶°Ç¹®µéÀÌ ÀÌ·± 󸮸¦ ÇÏ°í Àִµ¥ ´Ù ºñ½ÁÇÑ ÄÚµåÀ̹ǷΠ´ëÇ¥ÀûÀ¸·Î ¾Æ·¡ÂÊÀ¸·Î ¹þ¾î³­ °æ¿ìÀÎ ¼¼ ¹ø° Á¶°Ç¹®¸¸ ºÐ¼®Çغ¸µµ·Ï ÇÏÀÚ. ÀÌ Á¶°Ç¹®¿¡¼­ y´Â SetCaretÀÌ Á¶»çÇÑ Ä³·µÀÇ »õ À§Ä¡À̸ç ÀÌ °ª¿¡ FontHeight¸¦ ´õÇϸé ij·µÀÇ ¹ß°¡¶ô ÁÂÇ¥°¡ °è»êµÈ´Ù. ÀÌ ÁÂÇ¥°¡ ÇöÀç ½ºÅ©·ÑµÈ »óÅ¿¡¼­ ÀÛ¾÷¿µ¿ªÀÇ ¹Ù´Ú(yPos+crt.bottom)º¸´Ù ´õ ¾Æ·¡ÂÊ¿¡ ÀÖ´Ù¸é °­Á¦·Î ÀÌ ÁÙÀ» À§·Î ¿Ã·ÁÁØ´Ù.

À̶§ ½ºÅ©·ÑµÈ ÈÄÀÇ À§Ä¡´Â ÀÛ¾÷¿µ¿ªÀÇ ¹Ù´Ú¿¡¼­ ÆùÆ®ÀÇ ³ôÀ̸¸Å­ À§ÂÊÀÌµÇ ´Ü ù ÁÙÀÌ À߸®Áö ¾Êµµ·Ï Çϱâ À§ÇØ ÁÙ°£ÀÇ ¹è¼ö°¡ µÇµµ·Ï Á¶Á¤ÇØ¾ß ÇÑ´Ù.

³ª¸ÓÁö Á¶°Ç¹®µéµµ ´Ù ºñ½ÁÇϹǷΠÁ÷Á¢ ºÐ¼®Çغ¸±â ¹Ù¶õ´Ù. ¼öÆòÁÂÇ¥¸¦ ºñ±³ÇÒ ¶§´Â nWrapÀÌ 0ÀÎ °æ¿ì¸¸ ºñ±³Çغ¸¸é µÇ´Âµ¥ ÀÚµ¿°³Çà »óÅ¿¡¼­´Â ¾î¶² °æ¿ì¶óµµ ¼öÆòÀ¸·Î ½ºÅ©·ÑµÇÁö ¸»¾Æ¾ß ÇÑ´Ù.

ij·µÀÌ ¹®¼­ ¹ÛÀ» ¹þ¾î³µ´ÂÁö´Â ij·µÀ» ¿Å±æ ¶§¸¶´Ù Á¡°ËÇØ¾ß ÇÑ´Ù. ´Ü, ¿¹¿Ü°¡ Àִµ¥ OnSetFocus¿¡¼­´Â ÀÌ Ã³¸®¸¦ ÇÒ ÇÊ¿ä°¡ ¾ø´Ù. ½ºÅ©·Ñ¹Ù·Î ¹®¼­ÀÇ ¾Æ·¡ÂÊ ºÎºÐÀ» ½ºÅ©·ÑÇؼ­ Àдٰ¡ ´Ù¸¥ ÇÁ·Î±×·¥À» Àá½Ã »ç¿ëÇÑ ÈÄ ´Ù½Ã ÆíÁý±â·Î µ¹¾Æ¿Ô´Âµ¥ ij·µ À§Ä¡·Î ½ºÅ©·ÑÀ» ÇÏ¸é ¾ÈµÈ´Ù. »ç¿ëÀÚ°¡ Àаí ÀÖ´ø À§Ä¡´Â ÀϺη¯ ij·µÀ» ¿Å±âÁö ¾Ê´Â ÇÑÀº À¯ÁöÇÏ´Â °ÍÀÌ ¿Ç´Ù. ±×·¡¼­ SetCaretÀÇ ¿øÇü¿¡ »õ·Î¿î µðÆúÆ® Àμö bScrollToCaretÀÌ Çϳª ´õ Ãß°¡µÇ¾úÀ¸¸ç OnSetFocus¿¡¼­´Â ´ÙÀ½°ú °°ÀÌ SetCaretÀÇ Àμö¸¦ ¹Ù²ã¾ß ÇÑ´Ù.

 

void OnSetFocus(HWND hWnd, HWND hwndOldFocus)

{

    SetCaret(FALSE,FALSE);

}

 

Ãß°¡µÈ ÀμöÀÇ µðÆúÆ®°ªÀ» ÁÖ¾úÀ¸¹Ç·Î ±× ¿Ü ³ª¸ÓÁö SetCaretÀ» È£ÃâÇÏ´Â ºÎºÐÀº ÀüÇô °Çµå¸®Áö ¾Ê¾Æµµ µÈ´Ù. ÀÌÁ¦ ½ÇÇàÇغ¸¸é ij·µÀÌ È­¸éÀ» ¹þ¾î³¯ ¶§ ÀÚ¿¬½º·´°Ô ½ºÅ©·ÑµÉ °ÍÀÌ´Ù. Å°º¸µå ½ºÅ©·ÑÀº »ç½Ç ¡®Ä³·µ ½ºÅ©·Ñ¡¯À̶ó°í À̸§À» ºÙÀÌ´Â °ÍÀÌ ´õ ÀûÀýÇÑ °Í °°´Ù.