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