³ª. ¹®ÀÚÆø ¹è¿­

ÀÌ ÇÁ·Î±×·¥À» ´À¸®°Ô ¸¸µå´Â ù ¹ø° ÁÖ¹üÀº ¹Ù·Î GetCharWidth ÇÔ¼ö°¡ ¼ö½Ã·Î È£ÃâÇØ ´ë´Â GetTextExtentPoint32 ÇÔ¼öÀÌ´Ù. ÀÌ ÇÔ¼ö´Â ¹®ÀÚ¿­ÀÇ Æø°ú ³ôÀ̸¦ °è»êÇϴµ¥ ³»ºÎÀûÀ¸·Î ¾ÆÁÖ º¹ÀâÇÑ Ã³¸®¸¦ ÇÑ´Ù. DC¿¡ ¾î¶² ÆùÆ®°¡ ¼±ÅõǾî ÀÖ´ÂÁö º¸°í ÆùÆ®·ÎºÎÅÍ ±ÛÀÚ¸¦ Àоî¿Í °¢ ¹®ÀÚÀÇ ÆøÀ» ÇÕ»êÇÑ ÈÄ ±× °á°ú¸¦ ¸®ÅÏÇÑ´Ù. Á¤È®ÇÑ °è»êÀ» À§Çؼ­ ±Û²ÃÀÇ Å©±â³ª ¼Ó¼º µîÀ» ÀÏÀÏÀÌ Âü°íÇØ¾ß ÇϹǷΠ´À¸± ¼ö¹Û¿¡ ¾ø´Ù. °Ô´Ù°¡ ÀÌ ÇÔ¼ö´Â Á¤·Ä, À̵¿½Ã¸¶´Ù Ç×»ó È£ÃâµÇ±â ¶§¹®¿¡ È£Ãâ ºóµµµµ ¾ÆÁÖ ³ô´Ù.

±×·¸´Ù°í Çؼ­ ¹®ÀÚÀÇ ÆøÀ» ±¸ÇÏÁö ¾Ê°í¼­´Â ÆíÁý±â¸¦ ¸¸µé ¼ö°¡ ¾ø´Ù. °¡º¯Æø ÆùÆ®´Â °¢ ±ÛÀÚ¸¶´Ù ÆøÀÌ ´Ù¸£±â ¶§¹®¿¡ °íÁ¤µÈ °ªÀ» »ç¿ëÇÒ ¼öµµ ¾ø°í ¸»ÀÌ´Ù. ÇÏÁö¸¸ ¸íÄèÇÑ ÇØ°áÃ¥Àº ÀÖ´Ù. ¹®ÀÚÀÇ ÆøÀº ÇÊ¿äÇÏ°í °¢ ¹®ÀÚÀÇ ÆøÀº °¡º¯ÀûÀÌÁö¸¸ ½ÇÇàÁß¿¡ ¹®ÀÚÆøÀÌ º¯ÇÏÁö´Â ¾Ê´Â´Ù´Â Á¡¿¡ Âø¾ÈÇϸé ÀÌ ÇÔ¼öÀÇ È£Ãâ Ƚ¼ö¸¦ ´ëÆø ÁÙÀÏ ¼ö ÀÖ´Ù.

¾î¶»°Ô Çϴ°¡ ÇÏ¸é ¹®ÀÚÀÇ ÆøÀ» ¹Ì¸® ±¸Çسõ°í ÇÊ¿äÇÒ ¶§ ±¸ÇسõÀº °ªÀ» »ç¿ëÇÏ´Â °ÍÀÌ´Ù. ÀÌ·¸°Ô ÇÏ¸é ¸Å¹ø GetTextExtentPoint32 ÇÔ¼ö¸¦ È£ÃâÇÏÁö ¾Ê°íµµ ÇÊ¿äÇÑ ¹®ÀÚÆøÀ» Á¤È®ÇÏ°Ô ¾òÀ» ¼ö ÀÖ´Ù. °¢ ¹®ÀÚÀÇ ÆøÀ» ÀúÀåÇϱâ À§ÇØ ´ÙÀ½ ¹è¿­À» Àü¿ªÀ¸·Î ¼±¾ðÇÑ´Ù.

 

int arChWidth[128];

BYTE *arHanWidth;

 

arChWidth´Â ¿µ¹®°ú ±âÈ£ÀÇ ÆøÀ» ÀúÀåÇÒ ¹è¿­À̸ç arHanWidth´Â ÇѱÛÀÇ ÆøÀ» ÀúÀåÇÒ ¹è¿­ÀÌ´Ù. ÇѱÛÀº °¡º¯ÆøÀÎ °æ¿ìµµ ÀÖ°í °íÁ¤ÆøÀÎ °æ¿ìµµ ÀÖÀ¸¹Ç·Î »óȲ¿¡ µû¶ó ¹è¿­Å©±â°¡ ´Þ¶óÁö¸ç µû¶ó¼­ °íÁ¤Å©±âÀÇ ¹è¿­ÀÌ ¾Æ´Ñ Æ÷ÀÎÅÍ·Î ¼±¾ðµÇ¾ú´Ù. ÀÌ ¹è¿­¿¡ ¹®ÀÚÆøÀ» ¹Ì¸® °è»êÇÏ´Â ´ÙÀ½ ÇÔ¼ö¸¦ ÀÛ¼ºÇÏÀÚ.

 

void PrepareCharWidth(HDC hdc)

{

     int i;

     TCHAR Char[3]={0,};

     SIZE sz;

 

     for (i=1;i<128;i++) {

          Char[0]=i;

          GetTextExtentPoint32(hdc, Char, 1, &sz);

          arChWidth[i]=(BYTE)sz.cx;

     }

     arChWidth[0]=arChWidth[32];

 

     if (arHanWidth) {

          free(arHanWidth);

     }

     arHanWidth=(BYTE *)malloc(1);

     lstrcpy(Char,"ÇÑ");

     GetTextExtentPoint32(hdc, Char, 2, &sz);

     arHanWidth[0]=(BYTE)sz.cx;

}

 

1¹ø ¹®ÀÚºÎÅÍ Â÷·Ê´ë·Î ÆøÀ» °Ë»çÇÏ¿© arChWidth ¹è¿­¿¡ ±× ÆøÀ» ±â·ÏÇسõ´Â´Ù. ¹®ÀÚÀÇ ³ôÀÌ´Â ¹®ÀÚº°·Î ´Ù¸¥ °ÍÀÌ ¾Æ´Ï¹Ç·Î µû·Î ÀúÀåÇسõÀ» ÇÊ¿ä°¡ ¾ø´Ù. ¿©±â¼­ i°¡ 0ºÎÅÍ ½ÃÀÛÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó 1ºÎÅÍ ½ÃÀÛÇÔÀ» À¯ÀÇÇϵµ·Ï ÇÏÀÚ. 0¹ø ¹®ÀÚ Áï NULLÁ¾·á ÄÚµå´Â ½ÇÁ¦ ¹®ÀÚ°¡ ¾Æ´Ï±â ¶§¹®¿¡ ÆøÀ» °è»êÇÒ ¼ö ¾ø´Ù. ±×·¸´Ù°í Çؼ­ ÀÌ °ªÀ» ¾Æ¹«·¸°Ô³ª ³»¹ö·ÁµÑ ¼ö´Â ¾øÀ¸¹Ç·Î °ø¹é°ú °°Àº ÆøÀ» °¡Áö´Â °ÍÀ¸·Î °£ÁÖÇÏ¿´´Ù. NULL ¹®ÀÚÀÇ ÆøÀº Â÷ÈÄ¿¡ µ¤¾î¾²±â ¸ðµå¿¡¼­ ½ÇÁ¦·Î »ç¿ëµÈ´Ù.

ÇÑ±Û ¹®ÀÚÀÇ ÆøÀº ´ëÇ¥ÀûÀ¸·Î ¡®ÇÑ¡¯ÀÚ¿¡ ´ëÇؼ­¸¸ ÆøÀ» °è»êÇÏ¿© arHanWidth[0]¿¡ ÀúÀåÇصξú´Ù. ½Ã½ºÅÛ ÆùÆ®ÀÇ ÇѱÛÀº °íÁ¤ÆøÀÌ¸ç ´ëºÎºÐÀÇ ÇÑ±Û ÆùÆ®´Â °íÁ¤Æø¹Ç·Î ÀÌ ¹è¿­ÀÇ Å©±â´Â ÀÏ´Ü 1ÀÌ¸é µÈ´Ù. ÇѱÛÀÌ °¡º¯ÆøÀÎ °æ¿ì´Â Â÷ÈÄ¿¡ µû·Î ó¸®Çϵµ·Ï ÇÏÀÚ. ÀÌ ÇÔ¼ö´Â OnCreate¿¡¼­ µü ÇÑ ¹ø¸¸ È£ÃâÇÑ´Ù.

 

BOOL OnCreate(HWND hWnd, LPCREATESTRUCT lpCreateStruct)

{

     ....

    PrepareCharWidth(hdc);

     ReleaseDC(hWnd,hdc);

     ....

 

¹®ÀÚÆøÀ» ±¸Çϱâ À§Çؼ­´Â DCÀÇ ÇÚµéÀÌ ÇÊ¿äÇϹǷΠReleaseDC·Î ÇÚµéÀ» ÇØÁ¦Çϱâ Àü¿¡ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù. ÀÌ ÇÔ¼ö°¡ ÇÒ´çÇÑ arHanWidth ¹è¿­Àº ºñ·Ï Å©±â´Â ÀÛÁö¸¸ ¸Þ¸ð¸®¸¦ Â÷ÁöÇÏ°í ÀÖÀ¸¹Ç·Î Á¾·á½Ã¿¡ ÇØÁ¦ÇØ¾ß ÇÑ´Ù.

 

void OnDestroy(HWND hWnd)

{

     PostQuitMessage(0);

     free(buf);

    free(arHanWidth);

}

 

ÀÌÁ¦ ÇÁ·Î±×·¥ÀÌ ½ÃÀÛµÉ ¶§ °¢ ¹®ÀÚÀÇ ÆøÀ» ±¸ÇØ arChWidth ¹è¿­°ú arHanWidth ¹è¿­¿¡ ±× ÆøÀ» ±â·ÏÇسõ¾ÒÀ¸¹Ç·Î GetCharWidth ÇÔ¼ö´Â ¸Å¹ø GetTextExtentPoint32 ÇÔ¼ö¸¦ È£ÃâÇÒ ÇÊ¿ä¾øÀÌ ÀÌ ¹è¿­¿¡¼­ ¹®ÀÚÀÇ ÆøÀ» ÀÐÀ» ¼ö ÀÖ´Ù. ½Ç½Ã°£À¸·Î ¹®ÀÚÀÇ ÆøÀ» ±¸ÇÏ´Â °Í°ú ¹è¿­°ªÀ» Àд °ÍÀº ¼Óµµ»ó ºñ±³°¡ µÇÁö ¾ÊÀ» Á¤µµ·Î Â÷ÀÌ°¡ ¸¹ÀÌ ³­´Ù. ¶ÇÇÑ DC·ÎºÎÅÍ ¹®ÀÚÆøÀ» ±¸ÇÏ´Â °ÍÀÌ ¾Æ´Ï¹Ç·Î GetCharWidth ÇÔ¼ö´Â DCÀÇ ÇÚµéÀ» Àü´Þ¹ÞÀ» ÇÊ¿ä°¡ ¾ø¾îÁ³´Ù. ÀÌ ÇÔ¼ö´Â ´ÙÀ½°ú °°ÀÌ ¼öÁ¤µÈ´Ù.

 

int GetCharWidth(TCHAR *ch, int len)

{

     if (len==1) {

          return arChWidth[*ch];

     } else {

          return arHanWidth[0];

     }

}

 

ÆøÀ» ±¸ÇÒ ¹®ÀÚ ±æÀÌ°¡ 1À̸é arChWidth ¹è¿­¿¡¼­ ÆøÀ» ±¸ÇÏ°í ±æÀÌ°¡ 2À̸é arHanWidth¿¡¼­ ÆøÀ» ±¸ÇØ ¸®ÅÏÇÏ¸é µÈ´Ù. arChWidth´Â ¹®ÀÚÄڵ带 ¹è¿­ÀÇ Ã·ÀÚ·Î »ç¿ëÇÏ°í ÀÖÀ¸¹Ç·Î Àü´ÞµÈ ¹®ÀÚÀÇ °ªÀ¸·ÎºÎÅÍ º°´Ù¸¥ ¿©ºÐÀÇ °è»ê¾øÀÌ ¹Ù·Î ¹è¿­°ªÀ» ÀÐÀ» ¼ö ÀÖ´Ù.

ÀÌ ÇÔ¼ö°¡ ÀÌ·¸°Ô ¹Ù²ñÀ¸·Î½á GetCharWidth¸¦ È£ÃâÇÏ´Â ¸ðµç ÇÔ¼öµéµµ ¼öÁ¤µÇ¾î¾ß ÇÑ´Ù. ¸ðµÎ ¿©¼¸ °³ÀÇ ÇÔ¼ö°¡ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÏ°í Àִµ¥ SetCaret, GetLineSub, GetXYFromOff, GetXPosOnLine, GetOffFromXY, DrawSegment µîÀÌ´Ù. ´ëÇ¥ÀûÀ¸·Î SetCaret ÇÔ¼ö¸¦ ¼öÁ¤Çغ¸ÀÚ.

 

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

{

     int toff;

     int caretwidth;

     int x,y;

     RECT crt;

     int ty;

     BOOL bScroll=FALSE;

 

     if (bComp) {

          toff=off-2;

        caretwidth=GetCharWidth(buf+toff,2);

     } else {

          toff=off;

          caretwidth=2;

     }

     ....

 

Áö¿ªº¯¼ö hdc°¡ »èÁ¦µÇ¾úÀ¸¸ç GetDC È£Ãâ¹®°ú ReleaseDC È£Ãâ¹®µµ »èÁ¦µÇ¾ú´Ù. DC¸¦ »ý¼ºÇÏ°í ÇØÁ¦ÇÏ´Â Äڵ嵵 ²Ï ½Ã°£À» ¸¹ÀÌ ¼Ò¸ðÇϹǷΠGetDC¸¸ Á¦°ÅÇصµ ¼Óµµ»óÀÇ ¸¹Àº À̵æÀ» º¼ ¼ö ÀÖ´Ù. GetCharWidth ÇÔ¼ö È£Ãâ¹®¿¡µµ hdc Àμö¸¦ »©¾ß ÇÑ´Ù. ³ª¸ÓÁö ÇÔ¼öµéµµ µ¿ÀÏÇÑ ¹æ¹ýÀ¸·Î ¼öÁ¤Çϵµ·Ï Ç쵂 DrawSegment ÇÔ¼ö´Â ¼öÁ¤ÇÏ´Â ¹æ¹ýÀÌ Á» ´Ù¸£´Ù. »ó±âÀÇ ÇÔ¼öµéÀº ÇÑ ¹®ÀÚÀÇ Æø¸¸ ±¸ÇÏÁö¸¸ ÀÌ ÇÔ¼ö´Â ¹®ÀÚ¿­ÀÇ ÆøÀ» ±¸ÇϹǷΠ¹è¿­À» °ð¹Ù·Î ÀÐÀ» ¼ö´Â ¾ø´Ù. ±×·¡¼­ ¹®ÀÚ¿­ÀÇ ÆøÀ» ±¸ÇÏ´Â º°µµÀÇ Ãß°¡ ÇÔ¼ö¸¦ ¸¸µé ÇÊ¿ä°¡ ÀÖ´Ù.

 

int MyGetTextExtent(TCHAR *text, int len)

{

     TCHAR *p=text;

     int acwidth;

 

     for (acwidth=0;p-text!=len;) {

          if (IsDBCS(p-buf)) {

               acwidth+=GetCharWidth(p,2);

               p+=2;

          } else {

               acwidth+=GetCharWidth(p,1);

               p++;

          }

     }

     return acwidth;

}

 

ÀÌ ÇÔ¼ö´Â text ¹®ÀÚ¿­ÀÇ ÆøÀ» ±¸ÇØ ¸®ÅÏÇϴµ¥ ³»ºÎÀûÀ¸·Î GetCharWidth ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ¹Ì¸® ±¸ÇسõÀº ¹è¿­À» ÂüÁ¶ÇÏ°í ÀÖÀ¸¹Ç·Î ¼Óµµ´Â È®½ÇÈ÷ »¡¶óÁø´Ù. DrawSegment¿¡¼­ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇϵµ·Ï ¼öÁ¤ÇÏÀÚ.

 

void DrawSegment(HDC hdc, int &x, int y, int SegOff, int len, BOOL ignoreX, COLORREF fore, COLORREF back)

{

     ....

          if (ignoreX == FALSE) {

            x+=MyGetTextExtent(buf+SegOff,len);

          }

     }

}

 

ÀÌÁ¦ GetTextExtentPoint32 ÇÔ¼ö´Â À¯ÀÏÇÏ°Ô PrepareCharWidth ÇÔ¼ö¿¡¼­ ÃÖÃÊ ½ÇÇà½Ã µü ÇÑ ¹ø¸¸ È£ÃâµÇ¸ç ±× ¿ÜÀÇ ³ª¸ÓÁö ºÎºÐ¿¡¼­´Â ÀÌ ÇÔ¼ö°¡ ¹Ì¸® ±¸ÇسõÀº °á°ú¸¸À» »ç¿ëÇÑ´Ù. °ú¿¬ ¾ó¸¶³ª »¡¶óÁ³´ÂÁö ÄÄÆÄÀÏÇÑ ÈÄ ´Ù½Ã ¼Óµµ ÃøÁ¤À» Çغ¸µµ·Ï ÇÏÀÚ. °á°ú´Â ½Ã½ºÅÛ¸¶´Ù ´Ù¸£°ÚÁö¸¸ ¾îÂ÷ÇÇ »ó´ëÀûÀÎ ÃøÁ¤À̹ǷΠÀý´ëÀûÀÎ ½Ã°£Àº Áß¿äÇÏÁö ¾Ê´Ù. ´ÙÀ½Àº ³ªÀÇ ³ëÆ®ºÏ¿¡¼­ Å×½ºÆ®ÇÑ °á°úÀÌ´Ù.

 

Å×½ºÆ®

1

2

3

4

5

6

ÃÖÃÊ

14.29

15.4

28.89

37.29

46.52

78.03

¹®ÀÚÆø °è»ê ÈÄ

2.92

2.87

5.76

7.10

8.72

15.14

 

¹è¿­ Çϳª¸¦ µµÀÔÇßÀ» »ÓÀε¥ ¼Óµµ´Â Æò±Õ ´Ù¼¸ ¹è Á¤µµ °³¼±µÇ¾ú´Ù. ¹®ÀåÀ» ÀÔ·ÂÇغ¸¸é ü°¨ÇÒ ¼ö ÀÖÀ» ¸¸Å­ »¡¶óÁ® ÀÖÀ» °ÍÀÌ´Ù. ³î¶ó¿î °³¼± È¿°úÀ̱â´Â ÇÏÁö¸¸ ¾ÆÁ÷µµ ¿©ÀüÈ÷ ´À¸®±â´Â ¸¶Âù°¡Áö´Ù.