°¡. Á¦¾î¹®ÀÚ º¸±â

Á¦¾î¹®ÀÚ¶õ °³ÇàÄڵ峪 ÅÇ°°ÀÌ ¹®ÀÚ°¡ ¾Æ´Ñ °ÍÀ» ¸»Çϴµ¥ ÀÌ·± ÄÚµå´Â ´Ù¸¥ ¹®ÀÚ¿­ÀÇ Ãâ·Â ¹æ½Ä¿¡ ¿µÇâÀ» ÁÖ±â´Â ÇÏÁö¸¸ ±× ÀÚü°¡ È­¸é¿¡ º¸ÀÌÁö´Â ¾Ê´Â´Ù. ÀÌ·± Á¦¾îÄڵ带 ¸í½ÃÀûÀ¸·Î È­¸é¿¡ º¸¿©ÁÖ¸é º¹ÀâÇÑ ¹®¼­¸¦ ÆíÁýÇÒ ¶§ ¸¹Àº µµ¿òÀÌ µÈ´Ù. ±×·¸´Ù°í Çؼ­ Ç×»ó Á¦¾îÄڵ带 º¸¿©ÁÖ¸é ¿ÀÈ÷·Á ÁöÀúºÐÇغ¸ÀÏ ¼ö ÀÖÀ¸¹Ç·Î ¿É¼ÇÀ» µÎ¾î ¿øÇÒ ¶§¸¸ º¼ ¼ö ÀÖµµ·Ï ¸¸µé¾îº¸ÀÚ. ´ÙÀ½ º¯¼ö¸¦ ¼±¾ðÇÏ°í ÃʱâÈ­ÇÑ´Ù.

 

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 º¯¼öÀÇ ÃʱⰪÀ» ¹Ù²ã °¡¸é¼­ ½ÇÇàÇغ¸¸é Á¦¾îÄÚµåÀÇ ¸ð¾çÀ» ´Ù¸£°Ô ¼±ÅÃÇÒ ¼öµµ ÀÖ´Ù. ÀÌ Å¸ÀÔÀº ÄÚµåÀÇ ´Ù¸¥ ºÎºÐ°ú ÀüÇô ¿¬°üµÇ¾î ÀÖÁö ¾ÊÀ¸¹Ç·Î ½Ã°£¸¸ Çã¶ôÇÑ´Ù¸é ÀÌ·± Ãâ·ÂŸÀÔÀº ¾ó¸¶µçÁö ´Ã¸± ¼ö ÀÖÀ» °ÍÀÌ´Ù.