´Ù. ÅÇ °ü·Ã ÇÔ¼ö ¼öÁ¤

Åǹ®ÀÚ Ã³¸®Äڵ尡 Ãß°¡µÊÀ¸·Î½á ¿©·¯ °¡Áö ÇÔ¼öµéÀÌ ¿µÇâÀ» ¹Þ°Ô µÇ´Âµ¥ ±×¸® ¸¹Áö´Â ¾Ê´Ù. ÁÖ·Î È­¸é ÁÂÇ¥¸¦ ´Ù·ç´Â ÇÔ¼öµéÀÌ ¿µÇâÀ» ¹Þ´Âµ¥ Ưº°È÷ ¾î·Á¿î ÄÚµå´Â ¾ø´Ù. ¾Æ¹« »ý°¢¾øÀÌ °íÄ¡±â¸¸ ÇÏ¸é µÈ´Ù. ¸ÕÀú ÅÇÀ¸·Î ÀÎÇØ Á¤·ÄÀÌ ¿µÇâÀ» ¹Þ´Â´Ù. Á¤·ÄÀº GetLineSub¿¡¼­ ´ã´çÇÏ°í ÀÖÀ¸¹Ç·Î ÀÌ ÇÔ¼ö¸¦ ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇÑ´Ù.

 

int GetLineSub(TCHAR *&p)

{

          ....

          for (acwidth=0;;) {

            if (*p == ¡®\t¡¯) {

               len=1;

               acwidth =(acwidth/TabSize+1)*TabSize;

               EndPos=p;

            } else {

                   if (IsDBCS(p-buf)) {

                        len=2;

 

                        if (nWrap==2 || (nWrap==3 && IsPrevDBCS==FALSE)) {

                             EndPos=p;

                             if (*EndPos != ¡® ¡®) {

                                 EndPosNoSpace=EndPos;

                             }

                        }

                        IsPrevDBCS=TRUE;

                   } else {

                        len=1;

 

                        if (IsPrevDBCS==TRUE) {

                             EndPos=p;

                             if (*EndPos != ¡® ¡®) {

                                 EndPosNoSpace=EndPos;

                             }

                        }

                        IsPrevDBCS=FALSE;

                   }

                   acwidth+=GetCharWidth(hdc,p,len);

            }

 

               if (*p == ¡®\r¡¯) {

               ....

 

ÅÇÀÌ ¹ß°ßµÇ¸é ´©ÀûÆøÀ» ´ÙÀ½ ÅÇÀ§Ä¡·Î ¿Å°ÜÁØ´Ù. ÀÌ ÇÔ¼ö°¡ ´Ù·ç´Â x ÁÂÇ¥´Â ¹®¼­»óÀÇ ÁÂÇ¥À̹ǷΠ½ºÅ©·Ñ »óŸ¦ °í·ÁÇÏÁö ¾Ê°í °ð¹Ù·Î °ø½ÄÀ» Àû¿ëÇصµ »ó°ü¾ø´Ù. ¼öÇнÄÀ» ÀÌ¹Ì ÀÌÇØÇßÀ¸¹Ç·Î ¾ÆÁÖ ½±°Ô ÀÌÇØ°¡ µÉ °ÍÀÌ´Ù. Åǹ®ÀÚ´Â ¾Õ ¹®ÀÚ°¡ ÇѱÛÀΰ¡ ¿µ¹®Àΰ¡¿¡ »ó°ü¾øÀÌ ¹«Á¶°Ç ÀÚ¸¦ Èĺ¸ À§Ä¡°¡ µÈ´Ù. ±×·¡¼­ ÅÇÀÌ ¹ß°ßµÇ´Â Á·Á· EndPos¸¦ ÅÇÀ§Ä¡·Î ¿Å°Ü ³õ¾Ò´Ù.

µÎ ¹ø°·Î ij·µ À§Ä¡µµ ÅÇÀ» ÀνÄÇϵµ·Ï ÇØ¾ß ÇÑ´Ù. SetCaretÀ» °íÃľ߰ÚÁö¸¸ SetCaretÀº °Çµå¸± ÇÊ¿ä°¡ ¾ø°í ´ë½Å SetCaretÀÌ È£ÃâÇÏ´Â GetXYFromOff ÇÔ¼ö¸¦ ¼öÁ¤ÇÏ¸é µÈ´Ù.

 

void GetXYFromOff(int nPos, int &x, int &y)

{

     HDC hdc;

     int r,c,s,e;

    TCHAR *p;

 

     GetRCFromOff(nPos, r, c);

     y=r*LineHeight;

 

     GetLine(r, s, e);

     hdc=GetDC(hWndMain);

    x=0;

    for (p=buf+s;p!=buf+nPos;) {

        if (*p == ¡®\t¡¯) {

            x = (x/TabSize+1)*TabSize;

            p++;

        } else {

            if (IsDBCS(p-buf)) {

               x += GetCharWidth(hdc,p,2);

               p+=2;

            } else {

               x += GetCharWidth(hdc,p,1);

               p++;

            }

        }

    }

     ReleaseDC(hWndMain, hdc);

}

 

GetCharWidth ÇÔ¼ö Çϳª·Î °£´ÜÈ÷ x ÁÂÇ¥¸¦ ±¸ÇÒ ¼ö ÀÖ¾ú´Âµ¥ ÀÌÁ¦ ÅÇÀÌ µé¾î°¨À¸·Î½á ±×·¸°Ô ÇÒ ¼ö°¡ ¾ø´Ù. ÇÑ ¹®ÀÚ¾¿ ÆøÀ» ´©Àû½ÃÅ°°í ÅÇÀ» ¸¸³ª¸é ´ÙÀ½ ÅÇÀ§Ä¡·Î ¿Å±â¸é¼­ ´©ÀûÆøÀ» °è¼Ó ºñ±³ÇØ ºÁ¾ß ÇÑ´Ù. ÅÇÀ» ¿Å±â´Â °ø½ÄÀº ¿ª½Ã µ¿ÀÏÇÏ´Ù. ¸¶Áö¸·À¸·Î GetXPosOnLine ÇÔ¼öµµ È­¸é»óÀÇ ÁÂÇ¥¸¦ ´Ù·ç°í ÀÖÀ¸¹Ç·Î Åǹ®ÀÚ¸¦ ÀνÄÇϵµ·Ï ¼öÁ¤ÇÑ´Ù.

 

int GetXPosOnLine(int r,int DestX)

{

          ...

     for (p=buf+s, acwidth=0;;) {

          if (p-buf == e)

               break;

 

        if (*p == ¡®\t¡¯) {

            len=1;

            acwidth =(acwidth/TabSize+1)*TabSize;

        } else {

               if (IsDBCS(p-buf)) {

                   len=2;

               } else {

                   len=1;

               }

               acwidth+=GetCharWidth(hdc,p,len);

        }

          p+=len;

          ....

 

´õ ¼³¸íÀÌ ÇÊ¿ä¾øÀ» Á¤µµ·Î °£´ÜÇÏ´Ù. ±×·¡¼­ ¼³¸íÇÏÁö ¾Ê°Ú´Ù. Áö±Ý ÀÌ ´Ü°è¿¡¼­ ¡®µµ´ëü Äڵ尡 ¾î¶»°Ô ¹Ù²î°í ÀÖ´Â °ÅÁö?¡¯¶ó´Â Àǹ®ÀÌ µç´Ù¸é ¾Æ¸¶ DrawSegmentÀÇ Äڵ带 ´«À¸·Î¸¸ ÀÐ°í ¿Í¼­ ±×·² °ÍÀÌ´Ù. ¾Õ¿¡¼­ ÀÌ¹Ì ÀÌ·Ð Á¡°ËÀÌ ³¡³­ Äڵ带 °è¼Ó ¹Ýº¹ Àû¿ëÇÏ°í Àֱ⠶§¹®¿¡ Çѹø¸¸ ÀÌÇØÇÏ¸é ³ª¸ÓÁö´Â ¾ÆÁÖ ½±°Ô ÀÌÇصǹǷΠ´«À¸·Î¸¸ Äڵ带 º¸Áö ¸»°í Á÷Á¢ Äڵ带 ¼öÁ¤Çغ¸±â ¹Ù¶õ´Ù. ÀÌÁ¦ Åǹ®ÀÚ Áö¿øÀÌ ¿Ï¼ºµÇ¾ú´Ù. Àß µ¿ÀÛÇÏ´ÂÁö ¾Õ¿¡¼­ ¸Þ¸ðÀåÀ¸·Î ¸¸µé¾ú´ø ¼ºÀûÇ¥¸¦ ApiEdit·Î ´Ù½Ã ¸¸µé¾î º¸µµ·Ï ÇÏÀÚ.

°ú¿¬ Á¦´ë·Î Àß ÀԷµǰí Á¤·Ä°ú Ãâ·ÂÀÌ Á¤È®ÇÏ´Ù. ij·µÀ» À̵¿ÇØ ºÁµµ ÅÇÀ§Ä¡°¡ Àß ÀÎ½ÄµÉ °ÍÀÌ´Ù.