Á¦¾î¹®ÀÚ¶õ °³ÇàÄڵ峪 ÅÇ°°ÀÌ ¹®ÀÚ°¡ ¾Æ´Ñ °ÍÀ» ¸»Çϴµ¥ ÀÌ·± ÄÚµå´Â ´Ù¸¥ ¹®ÀÚ¿ÀÇ Ãâ·Â ¹æ½Ä¿¡ ¿µÇâÀ» ÁÖ±â´Â ÇÏÁö¸¸ ±× ÀÚü°¡ ȸ鿡 º¸ÀÌÁö´Â ¾Ê´Â´Ù. ÀÌ·± Á¦¾îÄڵ带 ¸í½ÃÀûÀ¸·Î ȸ鿡 º¸¿©ÁÖ¸é º¹ÀâÇÑ ¹®¼¸¦ ÆíÁýÇÒ ¶§ ¸¹Àº µµ¿òÀÌ µÈ´Ù. ±×·¸´Ù°í Çؼ Ç×»ó Á¦¾îÄڵ带 º¸¿©ÁÖ¸é ¿ÀÈ÷·Á ÁöÀúºÐÇغ¸ÀÏ ¼ö ÀÖÀ¸¹Ç·Î ¿É¼ÇÀ» µÎ¾î ¿øÇÒ ¶§¸¸ º¼ ¼ö ÀÖµµ·Ï ¸¸µé¾îº¸ÀÚ. ´ÙÀ½ º¯¼ö¸¦ ¼±¾ðÇÏ°í ÃʱâÈÇÑ´Ù.
BOOL bShowTab;
BOOL bShowEnter;
BOOL bShowSpace;
int ShowTabType;
int ShowEnterType;
int ShowSpaceType;
COLORREF CodeColor;
BOOL OnCreate(HWND hWnd, LPCREATESTRUCT lpCreateStruct)
{
bShowTab=TRUE;
bShowEnter=TRUE;
bShowSpace=TRUE;
ShowTabType=1;
ShowEnterType=2;
ShowSpaceType=0;
CodeColor=RGB(128,128,128);
return TRUE;
}
°¢ º¯¼öµéÀº ÅÇ, °³ÇàÄÚµå, °ø¹éÀ» º¸¿©ÁÙ °ÍÀΰ¡ ¾Æ´Ñ°¡¿Í º¸¿©ÁØ´Ù¸é ¾î¶² ½ÄÀ¸·Î º¸¿©ÁÙ °ÍÀΰ¡¸¦ ÁöÁ¤Çϴµ¥ µðÆúÆ®°ªÀº FALSE·Î µÎ°í »ç¿ëÀÚ°¡ ¿øÇÒ ¶§¸¸ TRUE·Î ¹Ù²Ù¸é µÈ´Ù. ´Ü, Áö±ÝÀº Á¦¾îÄڵ尡 ȸ鿡 Àß º¸ÀÌ´ÂÁö Å×½ºÆ®ÇØ¾ß ÇϹǷΠTRUE·Î ÃʱâÈÇϵµ·Ï ÇÏÀÚ. CodeColor´Â Á¦¾îÄÚµåÀÇ »ö»ó°ªÀÌ¸ç º»¹®°ú ±¸ºÐÇϱ⠽±µµ·Ï ȸ»öÀ¸·Î ÃʱâÈÇÏ¿´´Ù. Á¦¾îÄڵ带 Ãâ·ÂÇØ¾ß ÇÒ ½ÃÁ¡Àº DrawSegment°¡ Á¶°¢À» Ãâ·ÂÇÒ ¶§ÀÌ´Ù. Á¶°¢¾È¿¡ ÅÇÀ̳ª °³ÇàÄڵ尡 ÀÖ´Ù¸é °°ÀÌ Ãâ·ÂÇϵµ·Ï ÇÏ¸é µÈ´Ù. ´ÙÀ½ Äڵ带 DrawSegment ÇÔ¼ö¿¡ ÀÛ¼ºÇÑ´Ù.
void DrawSegment(HDC hdc, int &x, int y, int SegOff, int len, BOOL ignoreX,
COLORREF fore, COLORREF back)
{
int docx;
int oldx;
RECT rt;
HBRUSH Brush;
if (buf[SegOff] == ¡®\t¡¯) {
oldx=x;
docx=x+xPos;
docx=((docx-MarginWidth)/TabSize+1)*TabSize+MarginWidth;
x=docx-xPos;
SetRect(&rt,oldx,y,x+1,y+FontHeight);
Brush=CreateSolidBrush(back);
FillRect(hdc,&rt,Brush);
DeleteObject(Brush);
if (bShowTab) {
DisplayTab(hdc,oldx,x,y,back);
}
} else {
SetTextColor(hdc,fore);
SetBkColor(hdc,back);
TextOut(hdc,x,y,buf+SegOff,len);
if (bShowSpace) {
DisplaySpace(hdc,x,y,buf+SegOff,len);
}
if (bShowEnter || ignoreX == FALSE) {
x+=MyGetTextExtent(buf+SegOff,len);
}
}
if (bShowEnter) {
if (buf[SegOff+len] == ¡®\r¡¯) {
DisplayEnter(hdc,x,y,back);
}
}
}
Á¦¾îÄÚµå º¸±â º¯¼öÀÇ »óÅ¿¡ µû¶ó ÀûÀýÇÑ Á¦¾îÄÚµå Ãâ·ÂÇÔ¼ö¸¦ È£ÃâÇϴµ¥ ¿¹¸¦ µé¾î bShowTabÀÌ TRUEÀ̸é DisplayTab ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù. °³ÇàÄÚµåÀÇ °æ¿ì´Â Á¶°¢ ¹®ÀÚ¿¿¡ °°ÀÌ Æ÷ÇԵǾî Àü´ÞµÇÁö ¾ÊÀ¸¹Ç·Î Á¶°¢À» ´Ù Ãâ·ÂÇÑ ÈÄ µÚÂÊ ¹®ÀÚ°¡ °³ÇàÄÚµåÀÎÁö µû·Î Á¡°ËÇغ¸°í Á¶°¢ ³¡¿¡¼ °³Ç๮ÀÚ¸¦ º¸¿©ÁÖµµ·Ï ÇØ¾ß ÇÑ´Ù. °³ÇàÄڵ尡 Ãâ·ÂµÇ¾î¾ß ÇÒ À§Ä¡´Â Á¶°¢ÀÇ ¸¶Áö¸· ÁÂÇ¥À̹ǷΠbShowEnter°¡ TRUEÀ̸é ignoreX¿¡ »ó°ü¾øÀÌ xÀÇ ³¡ ÁÂÇ¥¸¦ °è»êÇϵµ·Ï ÇÏ¿´´Ù. ±×·¯¸é °¢°¢ÀÇ Á¦¾îÄÚµå Ãâ·ÂÇÔ¼öµéÀ» ÀÛ¼ºÇغ¸ÀÚ. Àüü ÄÚµå´Â ´ÙÀ½°ú °°´Ù.
void DisplayTab(HDC hdc, int x1, int x2, int y,COLORREF back)
{
static BYTE arTab[]={0,0,1,0,2,0,1,1,1,2,1,3,1,4,
4,0,3,1,3,2,3,3,3,4,5,1,5,2,5,3,5,4,4,2,
6,0,6,1,6,2,6,3,6,4,7,0,7,2,7,4,8,1,8,3};
HPEN hPen,OldPen;
int i;
hPen=CreatePen(PS_SOLID,1,CodeColor);
OldPen=(HPEN)SelectObject(hdc,hPen);
switch (ShowTabType) {
case 0:
MoveToEx(hdc,x1+1,FontHeight/2,NULL);
LineTo(hdc,x2-1,FontHeight/2);
LineTo(hdc,x2-3,FontHeight/2-2);
LineTo(hdc,x2-3,FontHeight/2+2);
LineTo(hdc,x2-1,FontHeight/2);
break;
case 1:
MoveToEx(hdc,x1+1,FontHeight*3/4,NULL);
LineTo(hdc,x2-1,FontHeight*3/4);
LineTo(hdc,x2-3,FontHeight*3/4-2);
LineTo(hdc,x2-3,FontHeight*3/4+2);
LineTo(hdc,x2-1,FontHeight*3/4);
for (i=0;i<sizeof(arTab)/sizeof(arTab[0]);i+=2) {
SetPixel(hdc,arTab[i]+x1+2,arTab[i+1]+FontHeight*3/4-6,CodeColor);
}
break;
}
SelectObject(hdc,OldPen);
DeleteObject(hPen);
}
void DisplayEnter(HDC hdc, int x, int y,COLORREF back)
{
HPEN hPen,OldPen;
HBRUSH Brush,OldBrush;
RECT rt;
int width;
hPen=CreatePen(PS_SOLID,1,CodeColor);
OldPen=(HPEN)SelectObject(hdc,hPen);
Brush=CreateSolidBrush(back);
switch (ShowEnterType) {
case 0:
width=arChWidth[0x20]*2;
break;
case 1:
width=arChWidth[0x20]*3;
break;
case 2:
width=arChWidth[0x20]*3;
break;
}
SetRect(&rt,x,y,x+width,y+FontHeight);
FillRect(hdc,&rt,Brush);
if (ShowEnterType <= 1) {
MoveToEx(hdc,x+width-2,FontHeight/10,NULL);
LineTo(hdc,x+width-2,FontHeight*3/4);
LineTo(hdc,x+2,FontHeight*3/4);
LineTo(hdc,x+4,FontHeight*3/4-2);
LineTo(hdc,x+4,FontHeight*3/4+2);
LineTo(hdc,x+2,FontHeight*3/4);
} else {
OldBrush=(HBRUSH)SelectObject(hdc,GetStockObject(NULL_BRUSH));
Rectangle(hdc,rt.left+1,rt.top+1,rt.right-1,rt.bottom-1);
SelectObject(hdc,OldBrush);
MoveToEx(hdc,x+width-4,FontHeight/5,NULL);
LineTo(hdc,x+width-4,FontHeight*5/8);
LineTo(hdc,x+3,FontHeight*5/8);
LineTo(hdc,x+5,FontHeight*5/8-2);
LineTo(hdc,x+5,FontHeight*5/8+2);
LineTo(hdc,x+3,FontHeight*5/8);
}
SelectObject(hdc,OldPen);
DeleteObject(hPen);
DeleteObject(Brush);
}
void DisplaySpace(HDC hdc, int x, int y, TCHAR *text, int len)
{
int nPos;
int nx=x;
int width;
HPEN hPen,OldPen;
HBRUSH OldBrush;
width=arChWidth[0x20];
if (ShowSpaceType!=0) {
hPen=CreatePen(PS_SOLID,1,CodeColor);
OldPen=(HPEN)SelectObject(hdc,hPen);
OldBrush=(HBRUSH)SelectObject(hdc,GetStockObject(NULL_BRUSH));
}
for (nPos=0;nPos!=len;nPos++) {
if (text[nPos] == 0x20) {
switch (ShowSpaceType) {
default:
case 0:
SetPixel(hdc,nx+width/2,y+FontHeight/2,CodeColor);
SetPixel(hdc,nx+width/2,y+FontHeight/2+1,CodeColor);
break;
case 1:
MoveToEx(hdc,nx,FontHeight*3/4+1,NULL);
LineTo(hdc,nx,FontHeight-1);
LineTo(hdc,nx+width-1,FontHeight-1);
LineTo(hdc,nx+width-1,FontHeight*3/4);
break;
case 2:
Rectangle(hdc,nx,0,nx+width,FontHeight);
break;
}
nx+=width;
} else {
if (IsDBCS(text-buf+nPos)) {
nx += GetCharWidth(text+nPos,2);
nPos++;
} else {
nx += GetCharWidth(text+nPos,1);
}
}
}
if (ShowSpaceType!=0) {
SelectObject(hdc,OldPen);
DeleteObject(hPen);
SelectObject(hdc,OldBrush);
}
}
°¢ ÇÔ¼ö´Â Á¦¾îÄڵ带 º¸¿©ÁÖ´Â ¹æ½Ä¿¡ µû¶ó °¢°¢ ´Ù¸¥ ¸ð¾çÀ¸·Î Á¦¾îÄڵ带 Ç¥ÇöÇÑ´Ù. °ø¹éÀÇ °æ¿ì µÎ °³ÀÇ Á¡À¸·Î Ç¥ÇöÇϱ⵵ ÇÏ°í »ç°¢ÇüÀ̳ª ¿¸° »ç°¢ÇüÀ¸·Î °ø¹é À§Ä¡¸¦ Ç¥ÇöÇÒ ¼öµµ ÀÖ´Ù. ¿£ÅÍÄÚµå´Â ¼¼ °¡Áö ¹æ½ÄÀ¸·Î ±×¸®´Âµ¥ 0,1¹øÀÇ µÎ ŸÀÔÀº µ¿ÀÏÇÑ ¸ð¾çÀÌµÇ Æø¸¸ ´Ù¸£¸ç 2¹øÀº »ç°¢Çü¾È¿¡ °³ÇàÄڵ带 ±×¸®µµ·Ï ÇÏ¿´´Ù. ÅÇÀº Áß¾Ó¿¡ È»ìÇ¥°¡ ÀÖ´Â ¸ð¾ç ¶Ç´Â ¾Æ·¡ÂÊ¿¡ È»ìÇ¥°¡ ÀÖ°í TAB ¹®ÀÚ°¡ ÀÖ´Â ¸ð¾ç µÎ °¡Áö°¡ ÀÖ´Ù. ÄÚµå ÀÚü´Â ´Ü¼øÇÑ Ãâ·Â¹®µéÀ̹ǷΠ¾î·ÆÁö ¾Ê°Ô ºÐ¼®ÀÌ µÉ °ÍÀÌ´Ù.
±×·±µ¥ ¿Ö Á¦¾îÄڵ带 Èûµé°Ô ±×·¡ÇÈÀ¸·Î ±×¸®´ÂÁö ÀǾÆÇÒ °ÍÀÌ´Ù. Àû´çÇÑ ¸ð¾çÀÇ ±×·¡Çȹ®ÀÚ¸¦ Ãâ·ÂÇϸé ÈξÀ ´õ ½¬¿îµ¥ Äڵ差µµ ¸¹°í ¼Óµµµµ ´À¸° ÀÛµµ ÇÔ¼ö¸¦ ¾²´Â °ÍÀϱî? ½ÇÁ¦·Î ÅÇÀº 0x1a¹®ÀÚ(¢ç)¸¦ Ãâ·ÂÇÏ¸é µÇ°í °³ÇàÄÚµå´Â 0x14¹ø ¹®ÀÚ¸¦ Ãâ·ÂÇÏ¸é º¸±â ÁÁ°Ô Ãâ·ÂµÈ´Ù. ´õ±¸³ª ÀÌ·¸°Ô ¹®ÀÚÄڵ带 »ç¿ëÇϸé ÆùÆ®ÀÇ Å©±â°¡ ¹Ù²ð ¶§ Á¦¾îÄÚµå Å©±âµµ °°ÀÌ ¹Ù²î¾î Ãâ·ÂµÇ¹Ç·Î º¸±â¿¡µµ ÁÁ´Ù.
±×·¯³ª ¹®ÀÚÄڵ带 ¾²´Â ¹æ½Ä¿¡´Â °áÁ¤ÀûÀÎ ´ÜÁ¡ÀÌ Àִµ¥ ȣȯ¼ºÀÌ ÁÁÁö ¸øÇÏ´Ù´Â Á¡ÀÌ´Ù. ±×·¡Çȹ®ÀÚ´Â ¼±ÅõǾî ÀÖ´Â ÆùÆ®¿¡ µû¶ó ´Þ¶óÁú ¼ö°¡ ÀÖÀ¸¸ç °°Àº ÆùÆ®¶óµµ ¿î¿µÃ¼Á¦¿¡ µû¶ó ±× ¸ð¾çÀÌ ´Þ¶óÁø´Ù. 0x1a ¹®ÀÚ´Â 2000¿¡¼´Â ÅÇÇ¥½ÄÀÌ ³ª¿ÀÁö¸¸ XP¿¡¼´Â ¾û¶×ÇÑ ¹®ÀÚ°¡ ³ª¿Â´Ù. Ç×»ó ÀÏÁ¤ÇÑ ¸ð¾çÀÇ ¹®ÀÚ°¡ ³ª¿À·Á¸é Á¦¾îÄÚµå Ãâ·Â¿ëÀ¸·Î º°µµÀÇ ÆùÆ®¸¦ Çϳª ´õ »ý¼ºÇØ¾ß Çϴµ¥ À̰͵µ ¾à°£ ºÎ´ã½º·¯¿î ÀÏÀÌ´Ù.
±×·¡ÇÈÀ» Á÷Á¢ ±×¸®¸é Ç¥Çö¿¡ À־ ¿ÏÀüÇÑ ÀÚÀ¯¸¦ ´©¸± ¼ö ÀÖ´Ù. ÅÇÇ¥½ÄÀ» ÅÇÀÇ ±æÀ̸¸Å ±æ°Ô ´Ã·ÁÁÙ ¼ö ÀÖÀ¸¹Ç·Î ½ÇÁ¦ ÅÇÀÇ ÆøÀ» º¼ ¼ö ÀÖ¾î¼ ¾ÆÁÖ Æí¸®ÇÏ´Ù. ¹°·Ð ½ÇÇà¼Óµµ°¡ ´À·ÁÁö±â´Â ÇÏÁö¸¸ ÀÚÁÖ ¾²´Â ±â´ÉÀÌ ¾Æ´Ï¹Ç·Î °¨¼öÇÒ¸¸ÇÏ´Ù. ÅÇÇ¥½ÄÀÇ TAB ¹®ÀÚ´Â 9*5ÀÇ ºñÆ®¸ÊÀ» ¸¸µé°í Á¡ ÁÂÇ¥·Î ¹Ù²Û ÈÄ ÀÏÀÏÀÌ Âï¾ú´Ù. ºñÆ®¸ÊÀ» ¾²´Â °ÍÀÌ ´õ ºü¸¦ °Í °°Áö¸¸ ºñÆ®¸ÊÀº Åõ¸í Ãâ·ÂÀÌ ¾î·Á¿ö ±×³É Á¡À» Âï´Â ´Ù¼Ò ¹«½ÄÇÑ ¹æ¹ýÀ» ¼±ÅÃÇß´Ù. Á¦¾îÄڵ尡 Á¦´ë·Î º¸ÀÌ´ÂÁö ½ÇÇàÇغ¸ÀÚ. ¹°·Ð Á¦´ë·Î º¸ÀÏ °ÍÀÌ´Ù.
Show*Type º¯¼öÀÇ ÃʱⰪÀ» ¹Ù²ã °¡¸é¼ ½ÇÇàÇغ¸¸é Á¦¾îÄÚµåÀÇ ¸ð¾çÀ» ´Ù¸£°Ô ¼±ÅÃÇÒ ¼öµµ ÀÖ´Ù. ÀÌ Å¸ÀÔÀº ÄÚµåÀÇ ´Ù¸¥ ºÎºÐ°ú ÀüÇô ¿¬°üµÇ¾î ÀÖÁö ¾ÊÀ¸¹Ç·Î ½Ã°£¸¸ Çã¶ôÇÑ´Ù¸é ÀÌ·± Ãâ·ÂŸÀÔÀº ¾ó¸¶µçÁö ´Ã¸± ¼ö ÀÖÀ» °ÍÀÌ´Ù.