¸¶. Ŭ¸®ÇΠó¸®

±×·³ ÅDZîÁö ó¸®ÇßÀ¸¸é ¸¶Áø°ú °ü·ÃÇÑ ¸ðµç 󸮰¡ ´Ù ³¡³µÀ»±î? ±×·¸Áö ¾Ê´Ù. ¾ÆÁ÷µµ º¹ÀâÇÑ ¹®Á¦ Çϳª°¡ ³²¾Æ Àִµ¥ ÀÌ·± ¹®Á¦´Â ½±°Ô ¹ß°ßÇϱⰡ Âü ¾î·Æ´Ù. ÀÌ ¿¹Á¦´Â °è¼Ó ÀÚµ¿°³Çà »óÅ¿¡¼­ ÀÛ¼ºµÇ°í Àֱ⠶§¹®¿¡ ¼öÆò½ºÅ©·ÑÀÌ ¾øÁö¸¸ ¼öÆò ½ºÅ©·Ñ¹Ù°¡ ³ªÅ¸³ª¸é ¸¶Áø±îÁö °°ÀÌ ½ºÅ©·ÑµÈ´Ù´Â ¹®Á¦Á¡ÀÌ ÀÖ´Ù. F9Å°¿¡ ÀÚµ¿°³Çà »óŸ¦ ¹Ù²Ü ¼ö ÀÖ´Â Àӽà ±â´ÉÀÌ ÀÖÀ¸¹Ç·Î ÀÌ Å°¸¦ ´­·¯ ÀÚµ¿°³ÇàÀÌ ¾ø´Â »óÅ·Π¸¸µé¾î º¸°í ÀÌ »óÅ¿¡¼­ ¼öÆò ½ºÅ©·Ñ¹Ù¸¦ µå·¡±×Çغ¸¾Æ¶ó.

½ºÅ©·ÑÀ̶õ ¹®¼­¸¸À» ´ë»óÀ¸·Î ÇÏÁö¸¸ OnHScrollÀº ÀÛ¾÷¿µ¿ª Àüü¸¦ ½ºÅ©·Ñ Çϱ⠶§¹®¿¡ ¸¶Áø¿µ¿ªµµ ½ºÅ©·Ñ ´ë»óÀÌ µÇ¾î ¹ö·È°í ±×·¡¼­ ¼öÆòÀ¸·Î ½ºÅ©·ÑÇϸé È­¸éÀÌ ÇüÆí¾øÀÌ ±úÁ® ¹ö¸°´Ù. ½ºÅ©·Ñ ´ë»óÀº Àüü·Î Çصµ »ó°ü¾øÁö¸¸ Ŭ¸®Çοµ¿ªÀ» Æ÷¸ËÆÿµ¿ªÀ¸·Î ÁÖ¸é ÀÌ ¹®Á¦¸¦ ÇØ°áÇÒ ¼ö ÀÖ´Ù.

¶ÇÇÑ ¼öÆò½ºÅ©·Ñ½Ã¿¡ ij·µÀÌ ¸¶Áø¿µ¿ªÀ» ¾ÈÀ¸·Î µé¾î°¡ ±ô¹Ú°Å¸®°í ÀÖ´Â °ÍÀ» º¼ ¼ö Àִµ¥ ¸¶Áø¿¡¼­´Â ij·µÀ» ¼û°Ü¾ß ÇÑ´Ù. ÀÌ µÎ 󸮴 ¸ðµÎ OnHScroll¿¡¼­ ÇÑ´Ù.

 

void OnHScroll(HWND hWnd, HWND hwndCtl, UINT code, int pos)

{

     int xInc;

     SCROLLINFO si;

    POINT pt;

    static BOOL bHideCaret=FALSE;

 

     xInc=0;

     switch (code) {

     case SB_LINEUP:

          xInc=-FontHeight;

          break;

     case SB_LINEDOWN:

          xInc=FontHeight;

          break;

     case SB_PAGEUP:

          xInc=-(frt.right-frt.left);

          break;

     case SB_PAGEDOWN:

          xInc=frt.right-frt.left;

          break;

     case SB_THUMBTRACK:

          si.cbSize=sizeof(SCROLLINFO);

          si.fMask=SIF_TRACKPOS;

          GetScrollInfo(hWnd,SB_HORZ,&si);

          xInc=si.nTrackPos-xPos;

          break;

     default:

          break;

     }

 

     xInc=max(-xPos, min(xInc, xMax-xPos));

     xPos=xPos+xInc;

    ScrollWindow(hWnd, -xInc, 0, NULL, &frt);

     SetScrollPos(hWnd, SB_HORZ, xPos, TRUE);

 

    GetCaretPos(&pt);

    if (pt.x < MarginWidth) {

        if (bHideCaret==FALSE) {

           HideCaret(hWnd);

           bHideCaret=TRUE;

        }

    } else {

        ShowCaret(hWnd);

        bHideCaret=FALSE;

    }

}

 

½ºÅ©·Ñ ¿µ¿ªµµ frt·Î ÁÙ ¼ö ÀÖÁö¸¸ ÀÌ·¸°Ô µÇ¸é ScrollWindow°¡ ij·µÀ» ¿Å°ÜÁÖÁö ¾Ê±â ¶§¹®¿¡ Ŭ¸®Çοµ¿ª¸¸ frt·Î ÁÖ¾î ¸¶ÁøÀ» °Çµå¸®Áö ¾Êµµ·Ï ÇÏ¿´´Ù. ½ºÅ©·ÑÀ» ÇÑ ÈÄ Ä³·µÀÇ À§Ä¡¸¦ Á¶»çÇغ¸°í ij·µÀÌ ¸¶Áø ¾È¿¡ ÀÖÀ¸¸é HideCaret ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ij·µÀ» ¼û±âµµ·Ï ÇßÀ¸¸ç ´Ù½Ã ¸¶Áø ¹ÛÀ¸·Î ³ª¿À¸é ShowCaret ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ij·µÀÌ ´Ù½Ã º¸À̵µ·Ï Çß´Ù. ´Ü, HideCaret ÇÔ¼ö´Â ij·µÀ» ¼û±ä Ƚ¼ö¸¦ ±â¾ïÇϴµ¥ HideCaretÀ» È£ÃâÇÑ ¸¸Å­ ShowCaretÀ» È£ÃâÇØ¾ß Ä³·µÀÌ ´Ù½Ã º¸ÀδÙ. ±×·¡¼­ µü ÇÑ ¹ø¸¸ HideCaretÀ» È£ÃâÇϱâ À§ÇØ bHideCaret Á¤Àû º¯¼ö¸¦ »ç¿ëÇÏ¿´´Ù. ÀÌ º¯¼ö°¡ TRUEÀÏ ¶§´Â ÀÌ¹Ì Ä³·µÀÌ ¼û°ÜÁ® ÀÖ´Â »óÅÂÀ̹ǷΠHideCaretÀ» È£ÃâÇÒ ÇÊ¿ä°¡ ¾ø°í È£ÃâÇؼ­µµ ¾ÈµÈ´Ù.

SetCaret ÇÔ¼ö´Â ij·µÀÌ ÀÛ¾÷¿µ¿ªÀ» ¹þ¾î³ª¸é ÀÚµ¿À¸·Î ½ºÅ©·ÑÀ» ÇÏ´Â ±â´ÉÀÌ Àִµ¥ ÀÌÁ¦ ÀÛ¾÷¿µ¿ªÀÌ ¾Æ´Ï¶ó Æ÷¸ËÆÿµ¿ªÀ» ¹þ¾î³ª´ÂÁö °¨½ÃÇØ¾ß ÇÑ´Ù. x¿Í ¿ÞÂÊ ÁÂÇ¥¸¦ ºñ±³ÇÏ´Â ½Ä¿¡ MarginWidth¸¦ ³Ö¾î ÁÖµµ·Ï ÇÏÀÚ.

 

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

{

     ....

     if (bScrollToCaret) {

          if (nWrap==0) {

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

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

                    bScroll=TRUE;

               }

          }

     ....

 

ÀÌÁ¦ ¼öÆò½ºÅ©·Ñ½Ã Ŭ¸®Çεµ Àß Ã³¸®ÇÏ°í SetCaret ÇÔ¼öµµ ¸¶ÁøÀ¸·Î ij·µÀÌ µé¾î°¡´Â °ÍÀ» ¹æÁöÇÑ´Ù.