³ª. ÇöÀçÇà Ç¥½Ã

ÇöÀçÇàÀ̶õ ij·µÀÌ ÀÖ´Â À§Ä¡, Áï ÆíÁýÀ» ÇÏ°í ÀÖ´Â È­¸é»óÀÇ À§Ä¡¸¦ ¸»ÇÑ´Ù. ij·µÀº °è¼Ó ±ô¹Ú°Å·Á ´«¿¡ Àß ¶çµµ·Ï µÇ¾î ÀÖÁö¸¸ Å©±â°¡ º°·Î Å©Áö ¾Ê±â ¶§¹®¿¡ ÇÑ´«¿¡ À§Ä¡°¡ Àß ÆľǵÇÁö ¾Ê´Â °æÇâÀÌ ÀÖ´Ù. ƯÈ÷ ½Ã·ÂÀÌ ÁÁÁö ¾ÊÀº »ç¶÷¿¡°Ô ÀÌ ¹®Á¦´Â ¾ÆÁÖ ½É°¢ÇÏ´Ù. ÇöÀçÇà Ç¥½Ã ±â´ÉÀº ij·µÀÌ ÀÖ´Â ÁÙ Àüü¸¦ °­Á¶ÇÏ¿© ¾îµðÂë ÆíÁýÇÏ°í ÀÖ´ÂÁö¸¦ ºÐ¸íÇÏ°Ô º¸¿©ÁÖ´Â ±â´ÉÀÌ´Ù. °³ÀÎÀûÀ¸·Î º°·Î ÁÁ¾ÆÇÏÁöµµ ¾Ê°í ²À ÇÊ¿äÇÏ´Ù°íµµ »ý°¢ÇÏÁö ¾ÊÁö¸¸ ´ëºÎºÐÀÇ ÆíÁý±âµéÀÌ ÀÌ ±â´ÉÀ» Áö¿øÇÏ°í ÀÖÀ¸¹Ç·Î ApiEditµµ ÀÌ ±â´ÉÀ» ¸¸µé¾îº¸ÀÚ.

ÇöÀçÇàÀ» °­Á¶ÇÒ ¶§´Â º¸Åë »ç°¢ÀÇ ¹Ú½º¸¦ º¸¿©Áְųª ¾Æ´Ï¸é ¹è°æ»öÀ» ´Ù¸¥ »öÀ¸·Î Ä¥ÇØ ´«¿¡ Àß ¶çµµ·Ï Çϴµ¥ ÃëÇâ¿¡ µû¶ó °­Á¶ ¹æ½ÄÀ» ¼±ÅÃÇÒ ¼ö ÀÖµµ·Ï ÇÑ´Ù. Áï, ÇöÀçÇàÀ» º¸¿©ÁÙ °ÍÀΰ¡ ¾Æ´Ñ°¡ »Ó¸¸ ¾Æ´Ï¶ó ¾î¶² ½ÄÀ¸·Î º¸¿©ÁÙ °ÍÀΰ¡¸¦ ¼±ÅÃÇÒ ¼ö ÀÖ´Ù. ±×·¡¼­ º¯¼ö´Â BOOLÇüÀÌ ¾Æ´Ñ Á¤¼öÇüÀ¸·Î ¼±¾ðÇÏ¿´´Ù.

 

int nShowCurLine;

COLORREF CurColor;

 

ÀÌ º¯¼öÀÇ °ª¿¡ µû¶ó ÇöÀçÇàÀ» °­Á¶ÇÏ´Â ¹æ½ÄÀÌ ´Þ¶óÁö¸ç ´ÙÀ½ 5°¡Áö ¹æ½ÄÀÌ °¡´ÉÇÏ´Ù. ¹°·Ð ÇÊ¿äÇϸé ŸÀÔÀ» ¾ó¸¶µçÁö ´õ ´Ã¸± ¼ö ÀÖ´Ù.

 

°ª

ÇöÀçÇà °­Á¶

0

°­Á¶ÇÏÁö ¾Ê´Â´Ù.

1

ÇöÀçÇàÀ» µÑ·¯½Î´Â »ç°¢ ÇÁ·¹ÀÓÀ» º¸¿©ÁØ´Ù.

2

ÇöÀçÇà ¾Æ·¡ÂÊ¿¡ ¹ØÁÙÀ» º¸¿©ÁØ´Ù.

3

¹è°æ»öÀ» Ä¥ÇÑ´Ù.

4

¹è°æ»öÀ» Ä¥ÇÏ°í »ç°¢ ÇÁ·¹ÀÓÀ¸·Î °¨½Ñ´Ù.

5

¸¶Áø¿¡ »ï°¢Çü Ç¥½Ã·Î ÇöÀçÇàÀ» Ç¥½ÃÇÑ´Ù.

 

Àû´çÇÑ µðÆúÆ®°ªÀ» ¼±ÅÃÇØ¾ß Çϴµ¥ ÀÏ´Ü ÀÌ ±â´ÉÀÌ ÀÖ´Ù´Â °ÍÀ» º¸¿© Áà¾ß ÇϹǷΠ3¹ø ¹è°æ»öÀ» Ä¥ÇÏ´Â °ÍÀ¸·Î ÃʱâÈ­Çϵµ·Ï ÇÏÀÚ. ¹è°æ»ö»óÀº ´«¿¡ Àß ¶ç´Â ³ë¶õ»öÀ¸·Î ÃʱâÈ­ÇÏ¿´´Ù.

 

BOOL OnCreate(HWND hWnd, LPCREATESTRUCT lpCreateStruct)

{

     ....

     nShowCurLine=3;

     CurColor=RGB(255,255,0);

     ....

 

ÀÌ º¯¼ö°ªÀº ÇÑ ÁÙÀ» Ãâ·ÂÇÏ´Â DrawLineÀÇ µ¿ÀÛ¿¡ ¸¹Àº ¿µÇâÀ» ¹ÌÄ¡°Ô µÈ´Ù. ÁÙÀÇ ÅؽºÆ®¸¸ Ãâ·ÂÇÒ °Ô ¾Æ´Ï¶ó ÇöÀç ÁÙµµ °°ÀÌ º¸¿© Áà¾ß Çϱ⠶§¹®ÀÌ´Ù. DrawLineÀÇ Äڵ尡 ¸¹ÀÌ È®ÀåµÇ¾î¾ß ÇÑ´Ù.

 

int DrawLine(HDC hdc, int Line)

{

     ....

    int r,c;

    BOOL bCurLine=FALSE;

    RECT lrt;

    HBRUSH hCurLine;

    int toff;

    POINT tri[]={{1,1},{1,0},{0,0},{1,1}};

 

     if (pLine[Line].Start == -1)

          return 0;

 

    if (bComp) {

        toff=off-2;

    } else {

        toff=off;

    }

    GetRCFromOff(toff,r,c);

    if (r==Line) {

        bCurLine=TRUE;

    }

 

    if (bCurLine && (nShowCurLine == 3 || nShowCurLine == 4)) {

        SetRect(&lrt,frt.left,0,frt.right,FontHeight);

        hCurLine=CreateSolidBrush(CurColor);

        FillRect(hdc,&lrt,hCurLine);

        DeleteObject(hCurLine);

    }

 

     SelFirst=min(SelStart,SelEnd);

     SelSecond=max(SelStart,SelEnd);

 

     x=MarginWidth-xPos;

     nowoff=pLine[Line].Start;

     for (;;) {

              ....

          if (bInSel && (GetFocus()==hWndMain || HideSelType!=0)) {

              fore=SelFore;

              back=SelBack;

          } else {

              fore=RGB(0,0,0);

           if ((nShowCurLine==3 || nShowCurLine==4) && bCurLine) {

               back=CurColor;

           } else {

                   back=GetSysColor(COLOR_WINDOW);

           }

          }

 

          DrawSegment(hdc,x,0,nowoff,len,(nowoff+len==pLine[Line].End),fore,back);

 

          nowoff+=len;

          if (nowoff == pLine[Line].End)

              break;

     }

 

    if ((nShowCurLine==1 || nShowCurLine==2 || nShowCurLine==4) && bCurLine) {

        if (nShowCurLine == 1 || nShowCurLine == 4) {

           SetRect(&lrt,frt.left-1,0,frt.right+1,FontHeight);

        } else {

           SetRect(&lrt,frt.left-1,FontHeight,frt.right+1,FontHeight);

        }

        SetTextColor(hdc,RGB(0,0,0));

        SetBkColor(hdc,GetSysColor(COLOR_WINDOW));

        DrawFocusRect(hdc,&lrt);

    }

 

     if (MarginWidth != 0) {

          ....

        if (nShowCurLine == 5 && bCurLine) {

           OldBrush=(HBRUSH)SelectObject(hdc,GetStockObject(BLACK_BRUSH));

           tri[1].y=FontHeight-1-FontHeight % 2;

           tri[2].x=FontHeight/2;

           tri[2].y=FontHeight/2;

           Polygon(hdc,tri,4);

           SelectObject(hdc,OldBrush);

        }

     }

     return 1;

}

 

ÀÏ´Ü ÀÌ ÇÔ¼ö´Â Áö±Ý Ãâ·ÂÇÏ´Â Line ÁÙÀÌ ÇöÀç ij·µÀÌ ÀÖ´Â ÁÙÀÎÁö¸¦ ¸ÕÀú ÆÇ´ÜÇØ¾ß ÇÑ´Ù. ÀÌ ÇÔ¼ö´Â Ãâ·Â ´ë»óÀÌ µÇ´Â ÁÙ¹øÈ£¸¸ ¹ÞÀ» »ÓÀÌÁö ÀÌ ÁÙÀÌ ÇöÀç ÁÙÀÎÁö ¾Æ´ÑÁö´Â Àü´Þ¹ÞÁö ¾Ê±â ¶§¹®ÀÌ´Ù. ÇöÀç ij·µ À§Ä¡´Â ÀϹÝÀûÀ¸·Î Àü¿ªº¯¼ö off°¡ °¡¸®Å°´Â À§Ä¡ÀÌµÇ ´Ü ÇѱÛÀ» Á¶¸³ÇÏ°í ÀÖ´Â Áß¿¡´Â 2Ä­ ¾ÕÂÊÀÇ ¿ÀÇÁ¼ÂÀÌ ÇöÀç ij·µ À§Ä¡°¡ µÈ´Ù. ÀÌ À§Ä¡ÀÇ ÁÙ ¼ö¿Í Line ÁÙÀÌ ¸ÂÀ¸¸é Áö±Ý Ãâ·ÂÇÏ´Â ÁÙÀÌ ÇöÀç ÁÙÀ̸ç À̶§ bCurLine º¯¼ö¸¦ TRUE·Î ¹Ù²Û´Ù. ¸¸¾à ÇöÀç ÁÙÀÌ ¾Æ´Ï°Å³ª nShowCurLineÀÌ 0À̶ó¸é ¾Æ¹«°Íµµ ÇÒ ÇÊ¿ä°¡ ¾øÀ¸¸ç ÅؽºÆ®¸¸ Á¦´ë·Î Ãâ·ÂÇÏ¸é µÈ´Ù.

nShowCurLineÀÌ 1À̳ª 2ÀÎ °æ¿ìÀÇ Ã³¸®´Â ¸ðµç ÅؽºÆ®¸¦ ´Ù Ãâ·ÂÇÏ°í ³­ ´ÙÀ½¿¡ ÇÑ´Ù. »ç°¢ ÇÁ·¹ÀÓÀ» Ãâ·ÂÇÒ ¶§´Â DrawFocusRect ÇÔ¼ö¸¦ »ç¿ëÇϴµ¥ ÀÌ ÇÔ¼ö´Â DC¿¡ ¼³Á¤µÈ ÅؽºÆ®ÀÇ Àü°æ, ¹è°æ»öÀ» »ç¿ëÇϹǷΠ°ËÁ¤»ö°ú ¹è°æ»öÀ¸·Î µÈ Á¡¼±À» ±ß±â À§ÇØ Àü°æ, ¹è°æ»öÀ» ¸ðµÎ ¼³Á¤ÇØ¾ß ÇÑ´Ù. nShowCurLine°ª¿¡ µû¶ó ÇÁ·¹ÀÓÀ» Ãâ·ÂÇÒ ¿µ¿ªÀÌ ´Þ¶óÁö´Âµ¥ 1ÀÌ¸é ¾Æ·¡ÂÊ¿¡ 1Çȼ¿ µÎ²²·Î, 2¸é ÁÙ Àüü¸¦ °¨½Î´Â Å©±â´ë·Î Ãâ·ÂÇÏ¿´´Ù. ÇÁ·¹ÀÓÀÇ ¼öÆòÀ§Ä¡´Â Æ÷¸ËÆÿµ¿ªº¸´Ù ÇÑ Çȼ¿¾¿ ¹Ù±ùÂÊÀ¸·Î µÇ¾î Àִµ¥ ¿Ö³ÄÇÏ¸é ¼öÆò½ºÅ©·Ñ½Ã¿¡ ÇÁ·¹ÀÓÀÌ °°ÀÌ ½ºÅ©·ÑµÇ´Â °ÍÀ» ¹æÁöÇϱâ À§Çؼ­ÀÌ´Ù. ¸¶ÁøÀÇ ¿À¸¥ÂÊ¿¡ ÇÑ Çȼ¿ ¿©À¯ºÐÀÌ ÀÖÀ¸¹Ç·Î ÇÁ·¹ÀÓÀÌ Æ÷¸ËÆÿµ¿ªÀ» ¾à°£ ¹þ¾î³ªµµ º° »ó°üÀÌ ¾ø´Ù.

nShowCurLineÀÌ 3ÀÎ °æ¿ì´Â ¹è°æ»öÀ» Ä¥Çϴµ¥ ¹®ÀÚ°¡ ¾ø´Â ¿µ¿ª¿¡µµ ¹è°æ»öÀÌ ÀÖ¾î¾ß ÇϹǷΠÅؽºÆ® Ãâ·Â Àü¿¡ ÀÏ´Ü ¹è°æ»öÀ» ±ò¾Æ µÎ¾î¾ß ÇÑ´Ù. ±×¸®°í ÅؽºÆ®¸¦ Ãâ·ÂÇÒ ¶§ ¼±Åÿµ¿ªÀÌ ¾Æ´Ñ Á¶°¢ÀÇ ¹è°æ»öÀ» ³ë¶õ»öÀ¸·Î ¹Ù²Ù¾î ÁÜÀ¸·Î½á ÁÙ Àüü°¡ ³ë¶õ ¹è°æÀ» °¡Áöµµ·Ï Çß´Ù. ¹°·Ð ¼±Åÿµ¿ªÀº ¹è°æ»öÀ» ¹«½ÃÇÏ°í ¼±Åÿµ¿ªÀÇ ¹è°æ»öÀ» »ç¿ëÇØ¾ß ÇÑ´Ù. nShowCurLineÀÌ 4ÀÎ °æ¿ì´Â 3ÀÎ °æ¿ì¿Í 2ÀÎ °æ¿ìÀÇ Á¶ÇÕÀ̹ǷΠÅؽºÆ® Ãâ·Â Àü¿¡ ¹è°æÀ» ±ò°í Ãâ·Â ÈÄ¿¡ ÇÁ·¹ÀÓµµ ±×·Á¾ß ÇÑ´Ù.

nShowCurLineÀÌ 5ÀÎ °æ¿ì´Â Æ÷¸ËÆÿµ¿ªÀÌ ¾Æ´Ï¶ó ¸¶Áø¿µ¿ª¿¡ ÇöÀç ÇàÀ» Ç¥½ÃÇϹǷΠif (MarginWidth != 0) ºí·Ï ¾È¿¡ Äڵ带 ÀÛ¼ºÇØ¾ß ÇÑ´Ù. ÇöÀçÇà Ç¥½Ã´Â ÁÙ¹øÈ£³ª ºÏ¸¶Å© Ç¥½Ãº¸´Ùµµ ´õ À§¿¡ ÀÖ¾î¾ß ÇϹǷΠÀÌ ºí·ÏÀÇ °¡Àå ¾Æ·¡ÂÊ¿¡ ÀÖ´Â °ÍÀÌ ÁÁ´Ù. tri ¹è¿­Àº »ï°¢ÇüÀÇ ¼¼ ²ÀÁöÁ¡ ÁÂÇ¥ÀÌµÇ ¾Æ·¡ÂÊ°ú ¿À¸¥ÂÊ ²ÀÁöÁ¡Àº ÆùÆ® Å©±â¿¡ µû¶ó º¯ÇϹǷΠÀÏ´Ü 0À¸·Î ÃʱâÈ­ÇÏ°í »ï°¢ÇüÀ» ±×¸± ¶§ ÁÂÇ¥°ªÀ» Á¶Á¤ÇØ¾ß ÇÑ´Ù. ƯÈ÷ ¾Æ·¡ Á¡ tri[1].y °ªÀº FontHeight°¡ Ȧ¼öÀÏ ¶§´Â 1À» ´õ »©ÁÖ¾î¾ß ¿¹»Û »ï°¢ÇüÀÌ ±×·ÁÁø´Ù.

ij·µÀº ¹®¼­¿¡ Æ÷ÇԵǾî ÀÖ´Â °ÍÀÌ ¾Æ´Ï¹Ç·Î ij·µÀÇ À̵¿À¸·Î ÀÎÇØ È­¸éÀ» ´Ù½Ã ±×¸®Áö´Â ¾Ê´Â´Ù. ÇÏÁö¸¸ ÇöÀçÇà °­Á¶ ±â´ÉÀÌ µé¾î°¡¸é ij·µÀÌ À̵¿ÇÒ ¶§¸¶´Ù À̵¿ ÀüÀÇ Çà°ú À̵¿ ÈÄÀÇ ÇàÀ» ´Ù½Ã ±×·Á¾ß ÇÒ ÇÊ¿ä°¡ ÀÖ´Ù. SetCaret¿¡¼­ ij·µÀÇ y ÁÂÇ¥°¡ º¯°æµÇ¸é ¹«È¿È­ÇÏ¿© ´Ù½Ã ±×¸®µµ·Ï ÇØ¾ß ÇÑ´Ù. ¼öÆòÀ¸·Î À̵¿ÇÒ ¶§´Â ±»ÀÌ ´Ù½Ã ±×¸± ÇÊ¿ä°¡ ¾ø´Ù.

 

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

{

     POINT OldPos;

     RECT InvRt;

 

     GetCaretPos(&OldPos);

     ....

 

     if (nShowCurLine != 0 && OldPos.y != y-yPos) {

          InvRt.left=0;

          InvRt.right=frt.right;

          InvRt.top=min(OldPos.y,y-yPos);

          InvRt.bottom=max(OldPos.y,y-yPos)+LineHeight;

          InvalidateRect(hWndMain,&InvRt,FALSE);

     }

}

 

ij·µÀ» À̵¿Çϱâ Àü¿¡ OldPos¿¡ ij·µÀÇ ÁÂÇ¥¸¦ Á¶»çÇسõ°í ij·µÀ̵¿ ÈÄ OldPosÀÇ y ÁÂÇ¥°¡ À̵¿ÇÑ ÈÄÀÇ y ÁÂÇ¥¿Í ´Ù¸£¸é, Áï ij·µÀÇ ¼öÁ÷ÁÂÇ¥°¡ ¹Ù²î¾úÀ¸¸é ÀÛ¾÷¿µ¿ªÀ» ¹«È¿È­ÇÏ¿© ´Ù½Ã ±×·Á¾ß ÇÑ´Ù.

À̶§ ´Ù½Ã ±×·Á¾ß ÇÒ ¿µ¿ªÀº À̵¿Çϱâ ÀüÀÇ Ä³·µ À§Ä¡¿¡¼­ºÎÅÍ À̵¿ÇÑ ÈÄÀÇ Ä³·µ À§Ä¡±îÁöÀÌ¸ç ±× ¿ÜÀÇ ¿µ¿ªÀº ±»ÀÌ ´Ù½Ã ±×¸± ÇÊ¿ä°¡ ¾ø´Ù. ¿¹¸¦ µé¾î 3¹ø ÁÙ¿¡¼­ 4¹ø ÁÙ·Î ³»·Á¿Ô´Ù¸é 3¹ø ÁÙ¿¡ ÀÖ´Â ÇöÀçÇà Ç¥½Ã´Â Áö¿ì°í 4¹ø ÁÙ¿¡ ´Ù½Ã ÇöÀçÇàÀ» Ç¥½ÃÇÏ¸é µÈ´Ù. ¹«È¿¿µ¿ªÀ» ÃÖ¼ÒÈ­Çϱâ À§ÇØ À̵¿ ÀüÀÇ y ÁÂÇ¥¿Í À̵¿ ÈÄÀÇ y ÁÂÇ¥ »çÀ̸¸ ¹«È¿È­ÇÏ¿´´Ù.

ÀÛ¾÷¿µ¿ªÀ» ¹«È¿È­½ÃÅ°´Â Invalidate¶ó´Â ÇÔ¼ö¸¦ ÀÌ¹Ì ¸¸µé¾î µÎ¾úÁö¸¸ SetCaretÀº ÀÌ ÇÔ¼ö¸¦ »ç¿ëÇÏÁö ¾Ê°í ¹«È¿¿µ¿ªÀ» °è»êÇÏ´Â Äڵ带 ÀÛ¼ºÇÏ¿´´Ù. ¿Ö³ÄÇϸé SetCaretÀº È­¸é ÁÂÇ¥¸¦ Á÷Á¢ ´Ù·ç¸ç ¿ÀÇÁ¼ÂÀ» ´Ù·ç°í ÀÖÁö ¾Ê±â ¶§¹®ÀÌ´Ù. ij·µÀÌ À̵¿Çϱâ ÀüÀÇ ¿ÀÇÁ¼Â ÁÂÇ¥¸¦ ¸ð¸£±â ¶§¹®¿¡ Invalidate ÇÔ¼ö¸¦ »ç¿ëÇÒ ¼ö ¾øÀ¸¸ç ±×·¡¼­ Á÷Á¢ ¹«È¿¿µ¿ªÀ» °è»êÇÏ¿´´Ù. °¢ ŸÀÔ º°·Î ÇöÀçÇàÀº ´ÙÀ½°ú °°ÀÌ Ç¥½ÃµÈ´Ù.

  

ÇÁ·¹ÀÓÀ» º¸¿©ÁÖ´Â 1¹øÀÌ °¡Àå ±ò²ûÇÑ °Í °°°í 3¹øÀÌ °¡Àå ´«¿¡ Àß ¶è´Ù. 5¹øµµ ±×·°Àú·° ±¦Âú¾Æ º¸À̴µ¥ ÀÌ·± ŸÀÔÀº ¾ó¸¶µçÁö ´õ Ãß°¡ÇÒ ¼ö ÀÖ´Ù.