1.¾ÈÂÊ ¿©¹é

°¡.¿©¹é ¿É¼Ç

ApiEdit´Â ¿ÞÂÊ ¸¶Áø ¿µ¿ªÀ» ÀϺθ¦ Á¦¿ÜÇÏ°í´Â ÀÚ½ÅÀÇ ÀÛ¾÷¿µ¿ª Àüü¸¦ ÅؽºÆ® Ãâ·Â¿¡ »ç¿ëÇÑ´Ù. ±×·¡¼­ ÆíÁý ¿µ¿ªÀÌ ÄÁÆ®·ÑÀÇ °æ°è¼±°ú ³Ê¹« ¹ÐÂøµÇ¾î Àִµ¥ À­ÂÊ¿¡ ¿©À¯°¡ ÀüÇô ¾ø¾î ¹«Ã´ °©°©ÇØ º¸ÀÌ°í °¡µ¶¼ºµµ ¶³¾îÁø´Ù. ´ÙÀ½Àº ±¼¸² 10ptÀÇ ±Û²Ã·Î ÅؽºÆ®¸¦ Ãâ·ÂÇÑ ¸ð¾çÀε¥ ±ÛÀÚÀÇ À­ ȹÀÌ °æ°è¼±°ú ºÙÀÌ ¾ú¾î º°·Î º¸±â¿¡ ÁÁÁö ¾Ê´Ù.

Á» ´õ ½Ã¿ø½º·´°Ô º¸À̵µ·Ï Çϱâ À§ÇØ ÆíÁý ¿µ¿ª°ú °æ°è¼± »çÀÌ¿¡ ¾à°£ÀÇ ¿©¹éÀ» µÎ±â·Î ÇÑ´Ù. ±×±îÁþ ¿©¹é Á¶±Ý ÁÖ´Â Á¤µµ°¡ ¹¹ ±×¸® ¾î·Á¿ï±î ½Í°ÚÁö¸¸ ÁÂÇ¥¸¦ ÂüÁ¶ÇÏ´Â ¸ðµç ÇÔ¼öµéÀÌ ¼öÁ¤µÇ¾î¾ß ÇϹǷΠ¸¸¸¸ÇÑ ÀÛ¾÷Àº ¾Æ´Ï´Ù. º¹ÀâÇÏÁö´Â ¾ÊÁö¸¸ ±ÍÂúÀº »ê¼ö¸¦ ¸¹ÀÌ ÇØ¾ß ÇϹǷΠÀÌ ÀÛ¾÷À» ´ë½ÅÇÏ´Â ¸ÅÅ©·Î ÇÔ¼ö¸¦ Á¤ÀÇÇØ ³õ°í »ç¿ëÇϱâ·Î ÇÑ´Ù. ApiEdit.h¿¡ ¸ÅÅ©·Î ÇÔ¼ö¿Í ÇÊ¿äÇÑ ¸â¹ö º¯¼ö¸¦ ¼±¾ðÇÑ´Ù.

 

// ¹®¼­ ÁÂÇ¥¿Í ¼ø¼ö ¹®¼­ ÁÂÇ¥¸¦ º¯È¯ÇÑ´Ù.

#define PureX(x) ((x)-frt.left)

#define PureY(y) ((y)-frt.top)

#define DocX(x) ((x)+frt.left)

#define DocY(y) ((y)+frt.top)

 

class CApiEdit : public CWindow

{

private:

     ....

     RECT InnerRect;

     COLORREF InnerRectColor;

 

public:

     ....

     RECT GetInnerRect() { return InnerRect; }

     void SetInnerRect(RECT aRect);

     COLORREF GetInnerRectColor() { return InnerRectColor; }

     void SetInnerRectColor(COLORREF aValue);

};

 

¸ÅÅ©·Î ÇÔ¼öµéÀº ¼ø¼ö ¹®¼­ ÁÂÇ¥¿Í ¹®¼­ ÁÂÇ¥°£À» º¯È¯Çϴµ¥ ÀÌ µÎ ÁÂǥü°èÀÇ Â÷ÀÌÁ¡Àº ´ÙÀ½ Ç׿¡¼­ ÀÚ¼¼È÷ ¾Ë¾Æº¼ °ÍÀÌ´Ù. InnerRectÀÇ °¢ ¸â¹ö´Â °æ°è¼±°ú ÆíÁý ¿µ¿ª »çÀÌÀÇ ¿©¹éÀ» ÁöÁ¤Çϸç InnerRectColorÀº ¿©¹éÀÇ »ö»óÀÌ´Ù. ÀÌ º¯¼öµéÀº ÇÁ·¹ÀÓ¿¡ ¼±¾ðÇØ µÎ°í ºä¿¡¼­´Â ÇÁ·¹ÀÓÀÇ °ªÀ» ÂüÁ¶ÇÒ °ÍÀÌ´Ù. Áï, ÀÌ °ªÀº ¸ðµç ºä¿¡ ÀÏ°ýÀûÀ¸·Î Àû¿ëµÇ¸ç ºä¸¶´Ù ´Ù¸¥ ¼³Á¤À» °¡Áú ¼ö ¾ø´Ù. º¯¼ö¸¦ ¸¸µé¾úÀ¸´Ï ÀÐ°í ¾²´Â ¾×¼¼½º ÇÔ¼öµµ ÇÊ¿äÇÏ´Ù. »ý¼ºÀÚ¿¡¼­ ÀÌ º¯¼öµéÀ» ´ÙÀ½°ú °°ÀÌ ÃʱâÈ­ÇÑ´Ù.

 

CApiEdit::CApiEdit()

{

     ....

     SetRect(&InnerRect,32,32,32,32);

     InnerRectColor=RGB(255,0,0);

}

 

Å×½ºÆ®¸¦ À§ÇØ °¢ ¹æÇâÀ¸·Î 32¸¸Å­ ÃæºÐÇÑ ¿©¹éÀ» ÁØ´Ù. ¾ÈÂÊ ¿©¹éÀÇ »ö»óÀº ´«¿¡ Àß ¶ç´Â »¡°£»öÀ¸·Î ÀÏ´Ü ÃʱâÈ­ÇÑ´Ù. Å×½ºÆ®¸¦ ÇÒ ¶§´Â ¿É¼ÇÀÇ È¿°ú¸¦ Á» °úÀåÇØ¾ß ¸ðµç Äڵ尡 ÀÌ»ó¾øÀÌ Àß ½ÇÇàµÇ´ÂÁö ½±°Ô ÆǺ°ÇÒ ¼ö ÀÖ´Ù. Å×½ºÆ®°¡ ³¡³ª¸é ¿©¹éÀ» Á» ÁÙÀÌ°í »ö»óµµ ¹«³­ÇÏ°Ô ¹Ù²Ü °ÍÀÌ´Ù. Set ÇÔ¼ö´Â ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÑ´Ù.

 

void CApiEdit::SetInnerRect(RECT aRect)

{

     InnerRect=aRect;

     for (int aet=0;aet<4 && arView[aet];aet++) {

          SendMessage(arView[aet]->hWnd,WM_SIZE,0,0);

          arView[aet]->Invalidate(-1);

     }

}

 

void CApiEdit::SetInnerRectColor(COLORREF aValue)

{

     InnerRectColor=aValue;

     ForAllView(Invalidate(-1))

}

 

Æ÷¸ËÆà ¿µ¿ªÀÌ ¹Ù²î¸é Á¤·Äµµ ´Ù½Ã ÇØ¾ß ÇÏ°í ½ºÅ©·Ñ ¹Ù À§Ä¡µµ ¹Ù²î¸ç ½ºÅ©·Ñ ¹üÀ§µµ ¹Ù²ï´Ù. ÀÌ ¸ðµç º¯È­´Â À©µµ¿ìÀÇ ÆøÀÌ ¹Ù²ð ¶§¿Í µ¿ÀÏÇϹǷΠ°¢ ºä·Î WM_SIZE ¸Þ½ÃÁö¸¦ º¸³» ÀÛ¾÷¿µ¿ª Å©±â°¡ ¹Ù²î¾úÀ» ¶§ÀÇ Ã³¸®¸¦ Çß´Ù. »ö»óÀÌ ¹Ù²î¸é ´Ü¼øÈ÷ ´Ù½Ã ±×¸®±â¸¸ ÇÏ¸é µÈ´Ù.

InnerRect´Â Æ÷¸ËÆà ¿µ¿ªÀÇ »óÇÏ ÁÂ¿ì ¿©¹éÀ» ÁöÁ¤Çϸç frtÀÇ °¢ º¯¿¡ InnerRectÀÇ ´ëÀÀµÇ´Â º¯ÀÇ °ªÀ» »©¸é ÀÌ ¿µ¿ªÀÌ ÁøÂ¥ Æ÷¸ËÆà ¿µ¿ªÀ̸ç ÀÌ ¾È¿¡ ÅؽºÆ®°¡ ¹èÄ¡µÈ´Ù. Æ÷¸ËÆà ¿µ¿ªÀÇ Æø°ú ³ôÀÌ´Â ÀÚÁÖ ÂüÁ¶µÇ¹Ç·Î º°µµÀÇ ¸â¹ö º¯¼ö¿¡ ¹Ì¸® °è»êÇØ ³õ´Â °ÍÀÌ À¯¸®ÇÏ´Ù. ÀÌ °ªÀº ºä¸¶´Ù ´Ù¸¦ ¼ö ÀÖÀ¸¹Ç·Î ºä¿¡ ¼±¾ðÇÑ´Ù. OnSize¿¡¼­ Æ÷¸ËÆà ¿µ¿ªÀº ´ÙÀ½°ú °°ÀÌ °è»êÇÑ´Ù.

 

class CApiEditText : public CWindow

{

     ....

     int Fwidth, Fheight;

public:

     ....

     virtual void ManageCaret();

}

 

void CApiEditText::OnSize(HWND hWnd, UINT state, int cx, int cy)

{

     if (state != SIZE_MINIMIZED) {

          GetClientRect(hWnd,&crt);

          frt=crt;

        // ½ºÅ©·Ñ ¹Ù ¿µ¿ª°ú ¾ÈÂÊ ¿©¹éÀº ÆíÁý ¿µ¿ª¿¡¼­ Á¦¿ÜµÈ´Ù.

        frt.right-=(SBW+pFrame->InnerRect.right);

        frt.bottom-=(SBW+pFrame->InnerRect.bottom);

        frt.left+=(MarginWidth+pFrame->InnerRect.left);

        frt.top+=(pFrame->InnerRect.top);

        // Æ÷¸ËÆà ¿µ¿ªÀÇ Æø°ú ³ôÀ̸¦ ¹Ì¸® ±¸ÇØ ³õ´Â´Ù.

        Fwidth=frt.right-frt.left;

        Fheight=frt.bottom-frt.top;

          // ºÐÇÒ °¡´ÉÇÏ¸é ½ºÅ©·Ñ ¹Ù À§, ¿ÞÂÊ¿¡ ½ºÇø´ ¹Ú½º¸¦ À§ÇÑ ¿©¹éÀ» ³²±ä´Ù.

          if (bVertSplit) {

          ....

          if (nWrap && ViewType == TEXT_VIEW) {

              GetRCFromOff(toff,r,c);

              yPos=(r+nLine)*LineHeight;

           yPos=max(0,min(yPos,yMax-(Fheight/LineHeight)*LineHeight));

          }

 

ÀÛ¾÷¿µ¿ª¿¡¼­ ½ºÅ©·Ñ ¹Ù, ¸¶Áø ¿µ¿ª»Ó¸¸ ¾Æ´Ï¶ó InnerRect¸¸Å­ ´õ ÁÙ¿©¼­ Æ÷¸ËÆà ¿µ¿ª frt¸¦ °è»êÇß´Ù. Æ÷¸ËÆà ¿µ¿ªÀÇ Æø°ú ³ôÀÌÀÎ Fwidth, Fheight´Â frtÀÇ Á¿ì, »óÇÏÀÇ Â÷·Î ½±°Ô °è»êÇÒ ¼ö ÀÖ´Ù. ApiEditÀÇ ÀÛ¾÷¿µ¿ª(crt)Àº ´ÙÀ½°ú °°ÀÌ ¿©·¯ °³ÀÇ ¿ä¼Ò·Î ºÐÇҵȴÙ. ¹°·Ð ´ë°³ÀÇ °æ¿ì ¾ÈÂÊ ¿©¹éÀº ±â²¯ÇØ¾ß 1À̳ª 2Á¤µµ¸¸ ÁöÁ¤ÇϹǷΠfrt°¡ ÀÛ¾÷¿µ¿ªÀÇ ´ëºÎºÐÀ» Â÷ÁöÇÒ °ÍÀÌ´Ù.

ÀÌ »óÅ¿¡¼­ ½ÇÇàÇØ º¸¸é ApiEdit°¡ Æ÷¸ËÆà ¿µ¿ªÀ» Á¦´ë·Î ó¸®ÇÏ°í ÀÖÁö ¾ÊÀ½À» ¾Ë ¼ö ÀÖ´Ù. ¿À¸¥ÂÊ°ú ¾Æ·¡ÂÊ ¿©¹é¸¸ °Ü¿ì º¸À̴µ¥ frt.topÀº ¹«Á¶°Ç 0À¸·Î °¡Á¤ÇÏ°í frt.right°¡ crt.right¿Í µ¿ÀÏÇÑ Àǹ̷Π»ç¿ëµÇ°í Àֱ⠶§¹®ÀÌ´Ù. Æ÷¸ËÆà ¿µ¿ª¿¡ ¿©¹éÀÌ ¾øÀ» ¶§´Â ÀÌ °¡Á¤ÀÌ ¸Â¾ÒÁö¸¸ ÀÌÁ¦´Â Ʋ·ÁÁ³À¸¹Ç·Î ¸¹Àº ºÎºÐÀÌ ¼öÁ¤µÇ¾î¾ß ÇÑ´Ù. OnPaintºÎÅÍ ¼öÁ¤ÇÑ´Ù.

 

void CApiEditText::OnPaint(HWND hWnd)

{

     ....

    HBRUSH hInnerBrush;

 

     hdc=BeginPaint(hWnd,&ps);

     GetClientRect(hWnd,&crt);

 

    // ¾ÈÂÊ ºê·¯½Ã »ý¼º

    hInnerBrush=CreateSolidBrush(pFrame->InnerRectColor);

    //À§, ¿À¸¥ÂÊ ¿©¹é ±×¸²

    if (pFrame->InnerRect.top) {

        SetRect(&mrt,MarginWidth,0,crt.right-SBW,frt.top);

        FillRect(hdc,&mrt,hInnerBrush);

    }

    if (pFrame->InnerRect.right) {

        SetRect(&mrt,frt.right,0,crt.right-SBW,crt.bottom-SBW);

        FillRect(hdc,&mrt,hInnerBrush);

    }

 

     t=yPos/LineHeight;

    s=max((yPos+PureY(ps.rcPaint.top))/LineHeight,t);

    e=max((yPos+PureY(ps.rcPaint.bottom)-1)/LineHeight,t);

     if (ViewType == TEXT_VIEW) {

          e=min(e,TotalLine-1);

          Parser->ParseLines(*this,e);

     } else {

          e=min(e,GetRowCount()-1);

     }

    

     hMemDC=CreateCompatibleDC(hdc);

     if (hBit == NULL) {

          hBit=CreateCompatibleBitmap(hdc,frt.right,LineHeight);

     }

     OldBitmap=(HBITMAP)SelectObject(hMemDC,hBit);

 

     if (hMainFont) {

          hOldFont=(HFONT)SelectObject(hMemDC,hMainFont);

     }

 

     hBrush=CreateSolidBrush(pFrame->cBack);

    SetRect(&lrt,MarginWidth,0,frt.right,LineHeight);

 

     for (l=s;l<=e;l++) {

          FillRect(hMemDC,&lrt,hBrush);

          DrawLine(hMemDC,l);

        BitBlt(hdc,0,DocY((l-t)*LineHeight),frt.right,LineHeight,

           hMemDC,0,0,SRCCOPY);

     }

 

     if (MarginWidth != 0) {

          hMarBrush=CreateSolidBrush(pFrame->MarColor1);

        // ¸¶Áø ¿©¹é 1Çȼ¿ °¨¼Ò

        SetRect(&mrt,0,(l-t)*LineHeight+frt.top,MarginWidth,crt.bottom-SBW);

          FillRect(hdc,&mrt,hMarBrush);

        // À§ÂÊ ¸¶Áøµµ ±×¸°´Ù.

        SetRect(&mrt,0,0,MarginWidth,frt.top);

        FillRect(hdc,&mrt,hMarBrush);

 

          hMarPen=CreatePen(PS_SOLID,1, pFrame->MarColor2);

          OldPen=(HPEN)SelectObject(hdc,hMarPen);

        // ¸¶Áø ±¸ºÐ¼±Àº óÀ½ºÎÅÍ ³¡±îÁö ±×À½

        MoveToEx(hdc,MarginWidth-1,0,NULL);

        LineTo(hdc,MarginWidth-1,crt.bottom-SBW);

 

          SelectObject(hdc,OldPen);

          DeleteObject(hMarPen);

          DeleteObject(hMarBrush);

     }

    SetRect(&lrt,frt.left,DocY((l-t)*LineHeight),frt.right,frt.bottom);   

     FillRect(hdc,&lrt,hBrush);

    // ¹®¼­ µÞºÎºÐÀÇ ¿ÞÂÊ ¿©¹é ±×¸². ´õºí ¹öÆÛ¸µµÇÁö ¾ÊÀ¸¹Ç·Î Á÷Á¢ ±×·Á¾ß ÇÑ´Ù.

    if (pFrame->InnerRect.left) {

        SetRect(&mrt,MarginWidth,DocY((l-t)*LineHeight),frt.left,frt.bottom);

        FillRect(hdc,&mrt,hInnerBrush);

    }

    // ¾Æ·¡ ¿©¹é ±×¸²

    if (pFrame->InnerRect.bottom) {

        SetRect(&mrt,MarginWidth,frt.bottom,frt.right,crt.bottom-SBW);

        FillRect(hdc,&mrt,hInnerBrush);

    }

    // ¾ÈÂÊ ºê·¯½Ã Æı«

    DeleteObject(hInnerBrush);

 

     if (hMainFont) {

          SelectObject(hMemDC,hOldFont);

     }

     ....

 

¾ÈÂÊ ¿©¹éÀ» ä»öÇϱâ À§ÇØ hInnerBrush¸¦ »ý¼ºÇÑ´Ù. À§ÂÊ, ¿À¸¥ÂÊÀÇ ¿©¹éÀº OnPaint¿¡¼­ Á÷Á¢ ±×¸°´Ù. DrawLineÀº Æ÷¸ËÆà ¿µ¿ª¸¸ ±×°Íµµ ÅؽºÆ®°¡ ÀÖ´Â ÁÙ¸¸ Ãâ·ÂÇÒ »ÓÀ̹ǷΠÀÌ ºÎºÐÀº OnPaint¿¡¼­ Á÷Á¢ ±×·Á¾ß ÇÑ´Ù. ÀÛ¾÷¿µ¿ª ºÐÇÒµµ¸¦ º¸¸é ÀÌ ¿µ¿ªÀÇ ÁÂÇ¥´Â ¾î·ÆÁö ¾Ê°Ô ±¸ÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.

¹«È¿ ¿µ¿ªÀ¸·ÎºÎÅÍ Ãâ·Â ½ÃÀÛÁÙ s,e¸¦ °è»êÇÏ´Â °ø½Äµµ ¹Ù²î¾ú´Ù. ps.rcPaint.topÀº È­¸é ÁÂÇ¥¸¦ °¡¸®Å°°í ÀÖÀ¸¹Ç·Î ¿©±â¼­ frt.topÀ» »©¼­ ¼ø¼ö ¹®¼­ ÁÂÇ¥·Î ¹Ù²Û ÈÄ LineHeight·Î ³ª´©¾î¾ß ¹«È¿ ¿µ¿ªÀÇ ÁÙ ¼ö¸¦ ±¸ÇÒ ¼ö ÀÖ´Ù. ´Ü, ½ÃÀÛÁÙ s´Â È­¸é»óÀÇ Ã¹ÁÙ tº¸´Ù ÀÛÀ» ¼ö ¾ø´Ù. ¿©¹é ºÎºÐÀÌ ¹«È¿È­µÇ¾úÀ» ¶§ º¸ÀÌÁöµµ ¾Ê´Â ÁÙÀ» ±×¸± ÇÊ¿ä´Â ¾øÀ¸¸ç ±×¸®¸é ¿ÀÈ÷·Á ¿©¹éÀÌ ±úÁö´Â ºÎÀÛ¿ëÀÌ ÀÖ´Ù.

¿ÞÂÊ ¿©¹éÀº DrawLine¿¡¼­ ¸Þ¸ð¸® ºñÆ®¸Ê¿¡ Á÷Á¢ ±×¸± °ÍÀÌ´Ù. ±×·¡¼­ ¸Þ¸ð¸® ºñÆ®¸ÊÀÇ ÆøÀº ¿©ÀüÈ÷ frt.rightÀε¥ DrawLine¿¡¼­ ¸¶Áø°ú ¾ÈÂÊ ¿©¹é±îÁö ±×¸®±â ¶§¹®ÀÌ´Ù. ¾ÈÂÊ ¿©¹éÀ» DrawLine¿¡¼­ ±×¸®Áö ¾Ê°í ¸ðµç ÁÙÀ» Ãâ·ÂÇÑ ÈÄ OnPaint¿¡¼­ ±×¸®¸é ±ô¹Ú°Å¸²ÀÌ ¹ß»ýÇϹǷΠ°¡±ÞÀû ÇÑ ¹ø¿¡ ±×·Á¾ß ÇÑ´Ù. ¾Æ·¡ÂÊ ¿©¹éµµ OnPaint¿¡¼­ ±×¸®µÇ DrawLineÀ» ¸ðµÎ È£ÃâÇÑ ÈÄ¿¡ ±×·È´Ù.

¸¶ÁøÀÇ ±¸Á¶µµ ¾à°£ º¯°æÇÑ´Ù. ¹Ù±ùÂÊ¿¡ 1Çȼ¿ ¿©ºÐÀ» µÎ¾úÀ¸³ª ÀÌÁ¦ º°µµÀÇ ¾ÈÂÊ ¿©¹é ÁöÁ¤ ±â´ÉÀÌ µé¾î°¡¹Ç·Î ±×·² ÇÊ¿ä°¡ ¾ø´Ù. 1Çȼ¿ÀÌ¶óµµ ¸¶ÁøÀ» ³Ð°Ô ¾²±â À§ÇØ ¸¶ÁøÀº MarginWidth ÆøÀ» ¸ðµÎ »ç¿ëÇÑ´Ù. °æ°è¼±, ÁÙ¹øÈ£ Ãâ·Â À§Ä¡°¡ 1Çȼ¿ ¿À¸¥ÂÊÀ¸·Î ÇÑ Ä­¾¿ À̵¿µÇ¾ú´Ù. º»¹® ¿µ¿ª lrtµµ Margin¿¡¼­ºÎÅÍ ½ÃÀ۵ȴÙ.

BitBlt Ãâ·Â¹®µµ ¼öÁ¤ÇÑ´Ù. (l-t)*LineHeight °ø½ÄÀ¸·Î ÇöÀç È­¸é»óÀÇ ÁÙ¹øÈ£(È­¸éùÁÙ - ÇöÀçÁÙ)¿¡ ÁÙ°£À» °öÇØ ¼öÁ÷ À§Ä¡¸¦ Á¤ÇßÀ¸³ª ÀÌÁ¦ À§ÂÊ¿¡ ¿©¹éÀÌ µé¾î°¡°Ô µÊÀ¸·Î½á ¿©±â¿¡ frt.topÀÌ ´õÇØÁ®¾ß ÇÑ´Ù. »ç½Ç ±× Àü¿¡´Â frt.topÀÌ Ç×»ó 0À̾úÀ¸¹Ç·Î ´õÇÒ ÇÊ¿ä°¡ ¾ø¾úÀ¸³ª ÀÌÁ¦´Â Á¦´ë·Î °è»êÇØ¾ß ÇÑ´Ù. ¾ÕÀ¸·ÎÀÇ ¼öÁ¤µµ ÀÌ·± ½ÄÀ¸·Î 0À¸·Î °íÁ¤µÇ¾ú´ø °ªÀ» °è»ê¿¡ Æ÷ÇÔ½ÃÅ°´Â ÀÛ¾÷ÀÌ´Ù. °¢ ÁÙÀ» ¸ðµÎ Ãâ·ÂÇÑ ÈÄ µÞºÎºÐÀÇ ¸¶Áø ¿µ¿ªÀ» ±×¸®µÇ À§ÂÊ ¿©¹éÀÇ ¿ÞÂÊ¿¡µµ ¸¶ÁøÀ» ±×·Á¾ß ÇÑ´Ù. °æ°è¼±Àº ¾Æ¿¹ Á¦ÀÏ À§¿¡¼­ºÎÅÍ ¾Æ·¡±îÁö ¼±À» ±×¾ú´Ù. ¹®¼­ µÞºÎºÐÀÇ ºó °ø°£°ú ¾ÈÂÊ ¿©¹éµµ Á÷Á¢ ±×·Á¾ß ÇÑ´Ù.

Äڵ忡¼­ ¹®¼­ÀÇ ³¡ ´ÙÀ½ ºÎºÐ ÁÂÇ¥¸¦ (l-t)*LineHeight + frt.topÀ¸·Î °è»êÇÏ°í Àִµ¥ ÀÌ °ªÀº »ç½ÇÀº ¹®¼­ ³¡ ºÎºÐÀÌ ¾Æ´Ï¶ó Ãâ·ÂÀ» ³¡³½ ÁÙ ´ÙÀ½ ÁÙÀÌ´Ù. ÀÌ ºÎºÐÀ» ¹®¼­ ³¡À̶ó´Â °¡Á¤Àº lÀÌ ¹®¼­ ³¡±îÁö ·çÇÁ¸¦ µ¹¾ÒÀ» ¶§¸¸ ¸ÂÀ¸¸ç ¹®¼­ÀÇ Áß°£ÂëÀÌ ¹«È¿È­µÇ¾úÀ» ¶§´Â ¸¶Áö¸· Ãâ·ÂµÈ µÞºÎºÐÀ» °¡¸®Å²´Ù. ±×·¯³ª ÀÌ Äڵ忡 ÀÇÇØ ¹«È¿ ¿µ¿ª ¾Æ·¡ÂÊÀÌ Áö¿öÁú ¿°·Á´Â ¾ø´Ù. ¿Ö³ÄÇÏ¸é ¹«È¿ÇÏ´Ù¸é lÀÌ ÀÌ ÁÙ ±îÁö ·çÇÁ¸¦ µ¹ °ÍÀÌ°í ±×·¸Áö ¾Ê´Ù¸é ¾Æ¿¹ Ãâ·ÂÀÌ ³ª°¡Áö ¾Ê´Â´Ù. Á¤È®ÇÏ°Ô °è»êÇÏÀÚ¸é (l-t) ÁÙÀÌ °ú¿¬ ¹®¼­ ³¡ÀÎÁö ÀÏÀÏÀÌ Á¡°ËÇØ¾ß Çϳª ÀÌ Á¡°ËÀ» ÇÏ´Â ½Ã°£º¸´Ù´Â GDI°¡ ¹«È¿ ¿µ¿ª ¹Ù±ùÀ» Ŭ¸®ÇÎ Çϵµ·Ï ³»¹ö·Á µÎ´Â °ÍÀÌ ´õ ³´´Ù.

OnPaint°¡ ¼öÁ¤µÇ¾úÀ¸¹Ç·Î Á¹º´ÀÎ DrawLine°ú ±× Á¹º´ÀÎ DrawLineSubµµ ¼öÁ¤ÇØ¾ß ÇÑ´Ù. ÃÖ°í Á¹º´ ÇÔ¼öÀÎ DrawSegmentµµ ¹°·Ð ¼öÁ¤ ´ë»óÀÌ´Ù. ´ëÀå ÇÔ¼öµéÀÌ ¼öÁ¤µÇ¾úÀ¸´Ï ÃÖ°í Á¹º´ ÇÔ¼öµµ ¾î¿ ¼ö ¾øÀÌ ¼öÁ¤µÇ¾î¾ß ÇÑ´Ù. ¼öÁ¤ÇÏ´Â ¹æ½ÄÀº OnPaint¿Í °ÅÀÇ À¯»çÇѵ¥ 0À¸·Î °¡Á¤µÈ °ªÀ» ½ÇÁ¦ °ªÀ¸·Î º¯°æÇÏ´Â °ÍÀÌ´Ù.

 

int CApiEditText::DrawLine(HDC hdc, int Line)

{

     ....

    x=frt.left-xPos;

     ....

 

void CApiEditText::DrawLineSub(HDC hdc,int Line,BOOL bCurLine)

{

     ....

    // ¿ÞÂÊ ¾ÈÂÊ ¿©¹é ±×¸²

    if (pFrame->InnerRect.left) {

        hMarBrush=CreateSolidBrush(pFrame->InnerRectColor);

        SetRect(&mrt,MarginWidth,0,frt.left,LineHeight);

        FillRect(hdc,&mrt,hMarBrush);

        DeleteObject(hMarBrush);

    }

 

     // ¸¶Áø Ãâ·Â

     if (MarginWidth != 0) {

          hMarBrush=CreateSolidBrush(pFrame->MarColor1);

        SetRect(&mrt,0,0,MarginWidth,LineHeight);

          FillRect(hdc,&mrt,hMarBrush);

          hMarPen=CreatePen(PS_SOLID,1,pFrame->MarColor2);

          OldPen=(HPEN)SelectObject(hdc,hMarPen);

        MoveToEx(hdc,MarginWidth-1,0,NULL);

        LineTo(hdc,MarginWidth-1,LineHeight);

 

          SelectObject(hdc,OldPen);

          DeleteObject(hMarPen);

          DeleteObject(hMarBrush);

 

          // ÁÙ ¹øÈ£ Ãâ·Â

          if (bShowLineNum && (ViewType==HEXA_VIEW || pLine[Line].nLine==0)) {

              ....

           TextOut(hdc,MarginWidth-3,(FontHeight-10)/2,szLine,lstrlen(szLine));

     ....

 

¹®ÀÚ¿­ÀÌ Ãâ·ÂµÇ´Â ½ÃÀÛ À§Ä¡´Â MarginWidth°¡ ¾Æ´Ï¶ó ¿©±â¿¡ ¾ÈÂÊ ¿©¹éÀÌ ´õÇØÁø frt.left°¡ µÇ¾î¾ß ÇÑ´Ù. ¸¶Áø°ú º»¹® »çÀÌÀÇ 1Çȼ¿ ¿©¹éÀ» Á¦°ÅÇÑ´Ù. ¸¶Áø ¿·ÀÇ ¿ÞÂÊ ¿©¹éÀº OnPaint¿¡¼­ Ãâ·ÂÇÏ¸é ±ô¹Ú°Å¸®¹Ç·Î ºñÆ®¸Ê¿¡ ¹Ì¸® Ãâ·ÂÇØ ³õ´Â´Ù. DrawSegment ÇÔ¼ö´Â ´ÙÇàÈ÷ ¼öÁ¤ÇÒ ºÎºÐÀÌ ¸¹Áö ¾Ê´Ù.

 

void CApiEditText::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 (pFrame->buf[SegOff] == '\t') {

          oldx=x;

          docx=x+xPos;

        docx=DocX((PureX(docx)/TabSize+1)*TabSize);

          ....

 

ÅÇ °è»ê½Ä¸¸ Á¶±Ý ¹Ù²î¾ú´Ù. docx¸¦ ¼ø¼ö ¹®¼­ ÁÂÇ¥·Î ¹Ù²Û ÈÄ ´ÙÀ½ ÅÇ À§Ä¡¸¦ ã°í ´Ù½Ã ¹®¼­ ÁÂÇ¥·Î ¹Ù²Ù¾ú´Ù. ÀÌ ½ÄÀº 1±Ç¿¡¼­ ÀÌ¹Ì ¼³¸íÇߴµ¥ MarginWidth ´ë½Å frt.left¸¦ ´õÇÏ°í »«´Ù´Â Á¡ÀÌ ¹Ù²ï °ÍÀÌ´Ù. Àüü È­¸éÀº ´ÙÀ½°ú °°ÀÌ ±×·ÁÁø´Ù.

DrawLineÀÌ ±×¸®´Â ºÎºÐÀº °ËÁ¤»ö ³×¸ð ¾ÈÂÊÀÌ´Ù. °¢ ÁÙÀÇ ÅؽºÆ®´Â ¹°·ÐÀÌ°í ¸¶Áø, ¾ÈÂÊ ¿©¹é, ±×¸®°í ¸¶Áø¿¡ Ãâ·ÂµÇ´Â ºÏ¸¶Å©, ÁÙ¹øÈ£ µîÀÌ DrawLine¿¡ ÀÇÇØ ±×·ÁÁø´Ù. ³ª¸ÓÁö ¿µ¿ªÀº ¸ðµÎ OnPaint°¡ Á÷Á¢ ±×¸°´Ù. ¹®¼­ µÞºÎºÐÀÇ ³²Àº ºÎºÐÀÇ ¸¶Áø°ú ¿©¹é, ¿À¸¥ÂÊ, À§ÂÊ ¿©¹é µîµî, ½ÉÁö¾î À§ÂÊ ¿©¹é ¿ÞÂÊÀÇ ¸¶Áøµµ OnPaintÀÇ Ã¥ÀÓÀÌ´Ù.

³ª.¹®¼­ ÁÂÇ¥

¾ÈÂÊ ¿©¹éÀ» ¸¸µé±â´Â Çߴµ¥ Ãâ·Â¸¸ µÉ »Ó ¾ÆÁ÷ ÆíÁý ÄÚµåµéÀÌ À̸¦ Á¦´ë·Î ÀνÄÇÏÁö ¾Ê´Â´Ù. ¿Ö³ÄÇÏ¸é ±× Àü¿¡´Â frt.top°ú frt.left°¡ »ó¼ö 0À¸·Î °íÁ¤µÇ¾î ÀÖ¾ú±â ¶§¹®Àε¥ ¾ÈÂÊ ¿©¹é °³³äÀÌ µé¾î°¡°Ô µÊÀ¸·Î½á ÁÂÇ¥¸¦ ´Ù·ç´Â ¸ðµç ºÎºÐÀÌ ¿µÇâÀ» ¹Þ´Â´Ù. ¾ÆÁÖ Áö·çÇÑ ÆíÁý ÀÛ¾÷À» ÇØ¾ß Çϴµ¥ ¿ì¼± ¿ÀÇÁ¼ÂÀ¸·ÎºÎÅÍ ÁÂÇ¥°ªÀ» ±¸ÇÏ´Â ÇÔ¼öºÎÅÍ ¼öÁ¤ÇÏÀÚ.

 

void CApiEditText::GetXYFromOff(int nPos, int &x, int &y)

{

     int r,c;

     TCHAR *p;

 

     assert(nPos >= 0 && nPos <= pFrame->doclen);

     GetRCFromOff(nPos, r, c);

    y=r*LineHeight+frt.top;

 

    x=frt.left;

     for (p=pFrame->buf+pLine[r].Start;p!=pFrame->buf+nPos;) {

          assert(p < pFrame->buf+nPos);

          if (*p == '\t') {

           x = DocX((PureX(x)/TabSize+1)*TabSize);

              p++;

     ....

 

y´Â ÁÙ¹øÈ£ r¿¡ ÁÙ°£À» °öÇÏ°í ¿©±â¿¡ Æ÷¸ËÆà ¿µ¿ªÀÇ »ó´ÜÀÎ frt.topÀ» ´õÇØ¾ß ÇÑ´Ù. Àü¿¡´Â frt.topÀÌ Ç×»ó 0À̾úÀ¸¹Ç·Î ´õÇϳª ¸¶³ª¿´Áö¸¸ Áö±ÝÀº ÀÌ °ªÀÌ ÇÊ¿äÇÏ´Ù. x´Â MarginWidth¿¡¼­ºÎÅÍ ½ÃÀÛÇß¾ú´Âµ¥ ÀÌÁ¦ InnerRect.left±îÁö ´õÇØÁø frt.left¿¡¼­ ½ÃÀÛÇØ¾ß ÇÑ´Ù. ÀÌ·± ½ÄÀ¸·Î Æ÷¸ËÆà ¿µ¿ªÀÇ ¿ÞÂÊ ÁÂÇ¥¿´´ø MarginWidth´Â ¸ðµÎ frt.left·Î ¹Ù²î¾î¾ß ÇÑ´Ù. ÅÇ °è»ê¿¡µµ ¼ø¼ö ¹®¼­ ÁÂÇ¥·Î ¹Ù²Û ÈÄ ÅÇ Àû¿ëÇÏ¿© ´Ù½Ã ¹®¼­ ÁÂÇ¥·Î ¹Ù²Ù¾î¾ß ÇÑ´Ù. ¹Ý´ë ÇÔ¼öµµ ¼öÁ¤ÇÑ´Ù.

 

int CApiEditText::GetOffFromXY(int x, int y)

{

     int r,len;

     TCHAR *p;

     int chWidth;

     int acwidth;

 

    x=max(x,frt.left);

    y=max(y,frt.top);

 

    r=PureY(y)/LineHeight;

     r=min(r,GetRowCount()-1);

 

    for (p=pFrame->buf+pLine[r].Start,acwidth=frt.left;;) {

     ....

          if (*p == '\t') {

              len=1;

           chWidth=DocX((PureX(acwidth)/TabSize+1)*TabSize-acwidth);

              ....

 

¿äûÇÑ ÁÂÇ¥ y´Â ÃÖ¼ÒÇÑ frt.top ÀÌ»óÀ̾î¾ß Çϸç x´Â ÃÖ¼ÒÇÑ frt.left¿©¾ß ÇÑ´Ù. yÁÂÇ¥·ÎºÎÅÍ ÁÙ ¹øÈ£¸¦ ±¸ÇÒ ¶§´Â y¿¡¼­ frt.topÀ» ¸ÕÀú »« ÈÄ LineHeight·Î ³ª´«´Ù. xÁÂÇ¥ÀÇ ´©Àû°ªÀÎ acwidth´Â frt.left¿¡¼­ºÎÅÍ ½ÃÀÛÇÑ´Ù. GetXPosOnLine ÇÔ¼öµµ °°Àº ½ÄÀ¸·Î ¼öÁ¤ÇÑ´Ù. xÁÂÇ¥ÀÇ ½ÃÀÛÀº frt.leftÀ̸ç ÅÇ ÁÂÇ¥¸¦ °è»êÇÒ ¶§µµ frt.left°¡ »ç¿ëµÈ´Ù.

 

int CApiEditText::GetXPosOnLine(int r,int DestX)

{

     TCHAR *p;

     int len, acwidth;

 

     assert(r >= 0 && r <= TotalLine-1);

    if (DestX == frt.left) {

          return pLine[r].Start;

     }

    for (p=pFrame->buf+pLine[r].Start, acwidth=frt.left;;) {

          if (p-pFrame->buf == pLine[r].End) {

              if (IsVirtualPosable()) {

                   ExtraX=(DestX-acwidth)/arChWidth[' '];

              }

              break;

          }

          assert(p < pFrame->buf+pLine[r].End);

 

          if (*p == '\t') {

              len=1;

           acwidth=DocX((PureX(acwidth)/TabSize+1)*TabSize);

          ....

 

¿©±â¼­ ³í¸®ÀûÀ¸·Î ¾ÆÁÖ Áß¿äÇÑ ÇÙ½É »çÇ×À» Á¤¸®ÇÏ°í ³Ñ¾î°¡ÀÚ. GetXYFromOff¸¦ ºñ·ÔÇÏ¿© ÁÂÇ¥¸¦ ´Ù·ç´Â ÇÔ¼öµéÀÌ »ç¿ëÇÏ´Â XY°ªÀº ¾î¶² Àǹ̸¦ °¡Áö´Â°¡? ÀÌ ÁÂÇ¥´Â ½ºÅ©·ÑÀ» °í·ÁÇÏÁö ¾ÊÀº ¹®¼­ ÁÂÇ¥ÀÌµÇ Æ÷¸ËÆà ¿µ¿ªÀÇ À§, ¿ÞÂʸ¸Å­ ÆòÇà À̵¿µÈ °ªÀÌ´Ù. ±×·¡¼­ ¹®¼­»óÀÇ Ã¹ ¹ø° ¹®ÀÚ ÁÂÇ¥´Â (0,0)ÀÌ µÇ´Â °ÍÀÌ ¾Æ´Ï°í (frt.left, frt.top)ÀÌ µÈ´Ù.

¿Ö ÀÌ·± ½ÄÀÇ È¥¶õ½º·¯¿î ÁÂÇ¥ ü°è¸¦ »ç¿ëÇϴ°¡ ÇÏ¸é ¸¶¿ì½º, ij·µ, ¼±Åà ¿µ¿ª ºñ±³ µî ÀÌ ÇÔ¼ö¸¦ »ç¿ëÇÏ´Â ¸ðµç °÷ÀÌ ÀÛ¾÷ ¿µ¿ª ÁÂÇ¥¸¦ ´Ù·ç±â ¶§¹®ÀÌ´Ù. Æ÷¸ËÆà ¿µ¿ªÀ» °í·ÁÇÑ ¹®¼­ ÁÂÇ¥¿¡¼­ xPos, yPos¸¸ »©¸é ¹Ù·Î È­¸é ÁÂÇ¥¸¦ ±¸ÇÒ ¼ö ÀÖ´Ù. ¸¸¾à ÀÌ ÇÔ¼öµéÀÌ ¼ø¼öÇÑ ¹®¼­ ÁÂÇ¥¸¦ ¸®ÅÏÇÑ´Ù¸é ÀÌ ÁÂÇ¥¸¦ »ç¿ëÇÏ´Â ¸ðµç °÷¿¡¼­ frt.left¿Í frt.topÀ» ´õÇؼ­ »ç¿ëÇØ¾ß ÇϹǷΠºÒÆíÇÏ´Ù.

¼ø¼ö ¹®¼­ ÁÂÇ¥¶õ Æ÷¸ËÆà ¿µ¿ªÀ» °í·ÁÇÏÁö ¾Ê°í ¹®¼­»óÀÇ Ã¹ ¹ø° ¹®ÀÚ¸¦ ¿øÁ¡À¸·Î ÇÑ ÁÂÇ¥ÀÌ´Ù. ÀÌ ÁÂÇ¥°¡ ÇÊ¿äÇÑ ÀÌÀ¯´Â ½ºÅ©·Ñ °ªÀÎ xPos, yPos¿¡ Æ÷¸ËÆà ¿µ¿ªÀÇ °³³äÀÌ ¾ø±â ¶§¹®ÀÌ´Ù. ¹®¼­ ÁÂÇ¥¸¦ xPos, yPos¿Í ºñ±³, ¿¬»êÇÏ·Á¸é ¹Ýµå½Ã ¼ø¼ö ¹®¼­ ÁÂÇ¥·Î ¹Ù²Û ÈÄ ºñ±³ÇØ¾ß ÇÑ´Ù. ¼ø¼öÇÑ ¹®¼­ ÁÂÇ¥°¡ ÇÊ¿äÇÏ´Ù¸é, Áï ù ¹ø° ¹®ÀÚ À§Ä¡ÀÎ (0,0)À» ±âÁØÀ¸·Î ÇÑ ÁÂÇ¥¸¦ ÇÊ¿ä·Î ÇÑ´Ù¸é ´ÙÀ½ °ø½ÄÀ¸·Î »óÈ£ º¯È¯ÇÒ ¼ö ÀÖ´Ù.

¹®¼­ ÁÂÇ¥¿Í ¼ø¼ö ¹®¼­ ÁÂÇ¥´Â Æ÷¸ËÆà ¿µ¿ªÀÇ Á»ó´Ü ÁÂÇ¥¸¦ ´õÇÏ°í »­À¸·Î½á º¯È¯°¡´ÉÇÏ´Ù. ¶ÇÇÑ ½ºÅ©·Ñ À§Ä¡¸¦ ´õÇÏ°í »©¸é ¹®¼­ ÁÂÇ¥¿Í È­¸é ÁÂÇ¥¸¦ º¯È¯ÇÒ ¼ö ÀÖ´Ù. ¼ø¼ö ¹®¼­ ÁÂÇ¥¸¦ È­¸é ÁÂÇ¥·Î ¹Ù·Î º¯È¯ÇÒ ¼ö´Â ¾øÀ¸¸ç Áß°£ Çü½ÄÀÎ ¹®¼­ ÁÂÇ¥¸¦ Çѹø °ÅÃÄ¾ß ÇÑ´Ù. ÃÖÃÊ ¹®¼­ ÁÂÇ¥¶ó´Â °³³äÀ» µµÀÔÇß´ø ÀÌÀ¯´Â ÁÂÇ¥ »ç¿ëÀÇ Æí¸®¿Í È¿À²À» À§Çؼ­À̳ª »ç½Ç ¹ø°Å·Î¿î ¸éµµ ÀÖ´Ù. Â÷¶ó¸® óÀ½ºÎÅÍ ¼ø¼ö ¹®¼­ ÁÂÇ¥¸¦ »ç¿ëÇß´õ¶ó¸é ÇÏ´Â »ý°¢ÀÌ µé±âµµ Çϴµ¥ Çѹø °áÁ¤µÈ °ÍÀ̱⠶§¹®¿¡ Áö±ÝÀº ¹Ù²Ü ¼ö ¾øÀ¸¸ç ¾îÂ÷ÇÇ µÑ ´Ù ³ª¸§´ë·ÎÀÇ Àå´ÜÁ¡ÀÌ ÀÖ´Ù.

¾ÕÀÇ GetOffFromXY ÇÔ¼ö¿¡ »ç¿ëµÈ r=PureY(y)/LineHeight;½ÄÀ» Ç®¾î º¸¸ér=(y-frt.top)/LineHeight;°¡ µÈ´Ù. ÁÙ¹øÈ£ rÀº Àμö·Î Àü´ÞµÈ ¹®¼­ ÁÂÇ¥ y¿¡¼­ frt.topÀ» »©¼­ ¼ø¼ö ¹®¼­ ÁÂÇ¥·Î ¹Ù²Û ÈÄ LineHeight·Î ³ª´©¾î ±¸Çß´Ù. Áï ÁÙ¹øÈ£=¼ø¼ö¹®¼­ÁÂÇ¥/ÁÙ°£ ÀÌ·¸°Ô µÈ´Ù. ÀÌ ½ÄÀ» ÀÌÇØÇÏ´Â °ÍÀº ¾î·ÆÁö ¾ÊÀ» °ÍÀ̳ª ºñ½ÁÇÑ ½ÄÀÌ Á» ´õ º¹ÀâÇÑ ¼ö½Ä³»¿¡¼­ »ç¿ëµÇ¸é ´ë´ÜÈ÷ È¥¶õ½º·´´Ù. ±×·¡¼­ ÀÌ·± È¥¶õÀ» Á¶±ÝÀÌ¶óµµ ÁÙÀ̱â À§ÇØ PureX, DocX°°Àº ¸ÅÅ©·Î ±¸¹®À» ¸¸µç °ÍÀÌ´Ù. ÀÌ ¸ÅÅ©·ÎµéÀº È¿À²º¸´Ù´Â ¼Ò½º¸¦ Á» ´õ ½±°Ô ÆľÇÇϴµ¥ µµ¿òÀ» ÁØ´Ù. ÀÌ ¸ÅÅ©·Î¸¦ »ç¿ëÇÏ´Â ÀÌÀ¯¿Í GetXYFromOff°¡ Á¶»çÇØ ÁÖ´Â ÁÂÇ¥ÀÇ ¼ºÁúÀ» Á¤È®ÇÏ°Ô ÀÌÇØÇÏ°í ³Ñ¾î°¥ ÇÊ¿ä°¡ ÀÖ´Ù. ¿©±â±îÁö ÀÛ¾÷ÇÑ ÈÄ ½ÇÇàÇØ º¸¸é Àû¾îµµ ij·µÀº Á¦ÀÚ¸®¸¦ ã´Â´Ù.

´Ù.°ü·Ã ÇÔ¼ö ¼öÁ¤

ÁÂÇ¥ ü°è°¡ ¹Ù²î¾úÀ¸´Ï ±²ÀåÈ÷ ¸¹Àº ÇÔ¼öµéÀÌ ¼öÁ¤µÇ¾î¾ß ÇÑ´Ù. Áß°£¿¡ »õ·Î¿î °³³äÀ» Ãß°¡ÇÑ´Ù´Â °ÍÀº ÀÌ·¸µí ¹«Ã´ ±ÍÂúÀº ÀÏÀÌ´Ù. óÀ½ ±âȹÇÒ ¶§ºÎÅÍ ÀÌ·± ±â´ÉÀ» °í·ÁÇß´Ù¸é ¾ÖÃʺÎÅÍ Äڵ忡 ¹Ý¿µÇßÀ» °ÍÀÌ´Ù. GetLineÇÔ¼ö¸¦ ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇÑ´Ù.

 

void CApiEditText::GetLine(int Line, int &s, int &e)

{

     if (RightWrap == 0) {

          Right=frt.right-2;

     } else {

        Right=frt.left+RightWrap*FontWidth;

     }

     ....

     if (nWrap == 0 && RightWrap == 0) {

          while (!AeIsLineEnd(p)) {

              if (pFrame->IsDBCS(p-pFrame->buf)) {

                   p++;

              }

              p++;

          }

     } else {

        for (acwidth=frt.left,Head=p;;) {

              if (*p == '\t') {

                   len=1;

               acwidth=DocX((PureX(acwidth)/TabSize+1)*TabSize);

                   EndPos=p;

          ....

           if (acwidth > max(Right, frt.left+FontHeight*4)) {

 

ÀÚµ¿ °³Çà¿­ °è»ê ¹æ½ÄÀÌ Æ²·ÁÁ³´Ù. ¿ÞÂÊ ½ÃÀÛ ÁÂÇ¥ ¹× ÅÇ Ã³¸® µîÀº ¾Õ¿¡¼­ ÀÛ¾÷Çß´ø °Í°ú µ¿ÀÏÇÏ´Ù. acwidth´Â frt.left¿¡¼­ ½ÃÀÛÇÏ¿© ÀÚµ¿ °³Çà¿­À̳ª Æ÷¸ËÆà ¿µ¿ªÀÇ ¿À¸¥ÂÊ ³¡¿¡ ´êÀ» ¶§±îÁö °è¼Ó Áõ°¡ÇÑ´Ù. ´ÙÇàÈ÷ Àμâ¿ë GetLineÀº ¼öÁ¤ÇÒ ÇÊ¿ä°¡ ¾ø´Âµ¥ Àμ⠷çƾ¿¡´Â ÀÌ¹Ì ¿©¹é¿¡ ´ëÇÑ °è»êÀÌ Æ÷ÇԵǾî ÀÖ´Ù. ½ºÅ©·Ñ ÇÔ¼öµéµµ ´ëÆø ¼öÁ¤µÇ´Âµ¥ ¸ÕÀú ´ÙÀ½ ÇÔ¼ö¸¦ Ãß°¡ÇÑ´Ù.

 

// ½ºÅ©·Ñ »óŸ¦ °í·ÁÇÏ¿© ij·µÀ» ¼û±â°Å³ª º¸ÀδÙ.

void CApiEditText::ManageCaret()

{

     POINT pt;

     GetXYFromOff(off,(int &)pt.x,(int &)pt.y);

     pt.y-=yPos;

     pt.x-=xPos;

 

     // Æ÷¸ËÆà ¿µ¿ªÀ» ¹þ¾î³ª¸é ¼û±ä´Ù.

     if (PtInRect(&frt,pt)==FALSE) {

          if (bHideCaret==FALSE) {

              HideCaret(hWnd);

              bHideCaret=TRUE;

          }

     } else {

          ShowCaret(hWnd);

          bHideCaret=FALSE;

     }

     // ij·µÀÌ ¾ÆÁ÷ º¸ÀÌ´Â »óŸé À̵¿ÇÑ´Ù.

     if (bHideCaret==FALSE) {

          SetCaret(FALSE,FALSE);

     }

}

 

ÀÌ ÇÔ¼ö´Â ½ºÅ©·Ñ ÈÄ¿¡ ij·µÀÇ À§Ä¡¸¦ Á¡°ËÇØ º¸°í Æ÷¸ËÆà ¿µ¿ª ¹Ù±ùÀ̸é ij·µÀ» ¼û±ä´Ù. Àü¿¡´Â ¼öÆòÀ¸·Î¸¸ ij·µÀÌ ¼ûÀ» ¼ö ÀÖÁö¸¸ ÀÌÁ¦ ¾Æ·¡ À§¿¡µµ ¿©¹éÀÌ ÀÖÀ¸¹Ç·Î ¿©±â¼­µµ ij·µÀ» ¼û°Ü¾ß ÇÑ´Ù. ij·µÀÌ º¸ÀÌ´Â »óŸé SetCaret ÇÔ¼ö¸¦ È£ÃâÇÏ¿© Á÷Á¢ ij·µÀ» À̵¿½ÃŲ´Ù. ÀÌ Ã³¸®´Â ½ºÅ©·Ñ ¹Ù°¡ ÄÁÆ®·ÑÀÌ µÇ¸é¼­ºÎÅÍ ÇÊ¿äÇØÁ³´Ù. ¼öÆò, ¼öÁ÷ ½ºÅ©·Ñ ¸Þ½ÃÁö ó¸® ÇÔ¼ö´Â ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇÑ´Ù.

 

void CApiEditText::OnHScroll(HWND hWnd, HWND hwndCtl, UINT code, int pos)

{

     ....

     ScrollWindow(hWnd, -xInc, 0, &frt, &frt);

     SetScrollPos(hHorzScroll, SB_CTL, xPos, TRUE);

    ManageCaret();

}

 

void CApiEditText::OnVScroll(HWND hWnd, HWND hwndCtl, UINT code, int pos)

{

     if (!IsWindowEnabled(hVertScroll)) {

          return;

     }

    LinePerPage=(Fheight/LineHeight)*LineHeight;

     ....

     ScrollWindow(hWnd, 0, -yInc, &srt,&srt);

     SetScrollPos(hVertScroll, SB_CTL, yPos, TRUE);

    ManageCaret();

}

 

void CApiEditText::OnMouseWheel(HWND hWnd, WPARAM wParam, LPARAM lParam)

{

    LinePerPage=(Fheight/LineHeight)*LineHeight;

     ....

     if (IsWindowEnabled(hVertScroll)) {

          SetScrollPos(hVertScroll, SB_CTL, yPos, TRUE);

     }

    ManageCaret();

}

 

½ºÅ©·Ñ ¸Þ½ÃÁö ó¸® ÈÄ¿¡ ij·µÀÌ Æ÷¸ËÆà ¿µ¿ª¾È¿¡ ÀÖ´ÂÁö Á¡°ËÇϱâ À§ÇØ ManageCaret ÇÔ¼ö¸¦ È£ÃâÇß´Ù. ¼öÁ÷ ½ºÅ©·ÑÀº ÇÑ ÆäÀÌÁö¿¡ µé¾î°¡´Â ÁÙ ¼ö °è»ê °ø½ÄÀÌ ¹Ù²î¾ú´Âµ¥ Æ÷¸ËÆà ¿µ¿ªÀÇ Á¤È®ÇÑ ³ôÀÌ´Â bottom-topÀ¸·Î °è»êÇØ¾ß Çϸç ÀÌ °ªÀº OnSize¿¡¼­ FHeight¿¡ ¹Ì¸® ´ëÀÔÇØ µÎ¾ú´Ù. ½ºÅ©·Ñ ¹üÀ§¸¦ ¼³Á¤ÇÏ´Â ÇÔ¼ö¿Í Scroll ÇÔ¼öµµ ¼öÁ¤ÇÑ´Ù.

 

void CApiEditText::UpdateScrollInfo()

{

     SCROLLINFO si;

     int i, MaxLength;

 

    yMax=(GetRowCount()+Fheight/LineHeight/2)*LineHeight;

 

     si.cbSize=sizeof(SCROLLINFO);

     si.fMask=SIF_ALL | SIF_DISABLENOSCROLL;

     si.nMin=0;

     si.nMax=yMax;

    si.nPage=(Fheight/LineHeight)*LineHeight;

     ....

     if (nWrap == 0 || RightWrap != 0) {

          ....

        si.nPage=Fwidth;

          si.nPos=xPos;

          SetScrollInfo(hHorzScroll, SB_CTL, &si, TRUE);

          if (si.nPage >= (unsigned)si.nMax) {

              EnableWindow(hHorzScroll,FALSE);

          }

     }

 

void CApiEditText::Scroll(int nLine, int nCode/*=0*/)

{

     int yInc;

     int LinePerPage;

     RECT srt;

 

     if (nCode) {

          switch (nCode) {

          case 1:

              SendMessage(hWnd,WM_VSCROLL,MAKELONG(SB_PAGEDOWN,0),0);

              return;

          case -1:

              SendMessage(hWnd,WM_VSCROLL,MAKELONG(SB_PAGEUP,0),0);

              return;

          case 2:

           nLine=Fheight/LineHeight/2;

              break;

          case -2:

           nLine=-Fheight/LineHeight/2;

              break;

          }

     }

    LinePerPage=(Fheight/LineHeight)*LineHeight;

     ....

     if (IsWindowEnabled(hVertScroll)) {

          SetScrollPos(hVertScroll, SB_CTL, yPos, TRUE);

     }

    ManageCaret();

}

 

ftr.bottomÀ̶ó°í µÇ¾î ÀÖ´ø ºÎºÐÀÌ Fheight·Î ¹Ù²î¾ú°í frt.right´Â Fwidth·Î ¹Ù²î¾ú´Ù. ´ÙÀ½Àº SetCaret ÇÔ¼öÀÌ´Ù.

 

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

{

     ....

     if (bScrollToCaret && crt.right) {

          pFrame->SendNotify(AEN_MOVE);

          if (nWrap==0) {

           if ((x+caretwidth > xPos+frt.right) || (x < xPos+frt.left)) {

               // ¼ø¼ö ¹®¼­ ÁÂÇ¥¿¡¼­ ÆøÀÇ Àý¹ÝÀ» »« À§Ä¡¸¦ »õ·Î Á¤ÇÔ

               xPos=max(0,PureX(x)-(frt.right-frt.left)/2);

                   bScroll=TRUE;

              }

          }

 

          // ¼ø¼ö ¹®¼­»óÀÇ ÁÂÇ¥°¡ yPosº¸´Ù ´õ ÀÛÀ¸¸é ±× ÁÙÀ» ùÁÙ·Î ¹Ù²Û´Ù.

        if (PureY(y) < yPos) {

           yPos=PureY(y);

              bScroll=TRUE;

          }

 

        if (y+FontHeight > yPos+frt.bottom) {

              // ty=È­¸é Á¦ÀÏ ¾Æ·¡ÂÊÀÇ º¸ÀÌ´Â ÁÙÀÇ È­¸é»óÀÇ ÁÂÇ¥. ÁÙ°£ ¿µ¿ªÀº Á¦¿Ü. ¹è¼ö Á¶Á¤

           ty=(frt.bottom-frt.top-FontHeight)/LineHeight*LineHeight;

              // ½ºÅ©·Ñ À§Ä¡ = ¼ø¼­ ¹®¼­»óÀÇ ÁÂÇ¥¿¡¼­ Á¦ÀÏ ¾Æ·¡ ÁÙ ÁÂÇ¥.

           yPos=PureY(y)-ty;

              bScroll=TRUE;

          }

     ....

 

ij·µÀÌ ¾ÈÂÊ ¿©¹éÀ¸·Î µé¾î¿À¸é, Áï Æ÷¸ËÆà ¿µ¿ªÀ» ¹þ¾î³ª¸é ¼öÆò ½ºÅ©·ÑÇÑ´Ù. À̶§ »õ ¼öÆò ½ºÅ©·Ñ À§Ä¡´Â ¼ø¼ö ¹®¼­ ÁÂÇ¥¿¡¼­ Æ÷¸ËÆà ¿µ¿ª ÆøÀÇ Àý¹ÝÀ» »« À§Ä¡ÀÌ´Ù. Æ÷¸ËÆà ¿µ¿ªÆøÀº right-left·Î °è»êÇÑ´Ù. GetXYFromOff°¡ Á¶»çÇÑ y¿¡´Â frt.topÀÌ ÀÌ¹Ì ´õÇØÁ® Àִµ¥ ºñÇØ yPos´Â ¼ø¼ö ¹®¼­ ÁÂÇ¥À̹ǷΠy¸¦ ¼ø¼ö ¹®¼­ ÁÂÇ¥·Î ¹Ù²Û ÈÄ ºñ±³ÇÑ´Ù. ¶ÇÇÑ yPos¸¦ ÇöÀç yÁÙ¿¡ ¸ÂÃâ ¶§µµ y¸¦ ¼ø¼­ ¹®¼­ ÁÂÇ¥·Î ¹Ù²Û ÈÄ ´ëÀÔÇÑ´Ù. ¼¼¹ø° if¹®Àº ij·µÀÇ ¹ß°¡¶ôÀÌ Æ÷¸ËÆà ¿µ¿ª¹ÛÀ» ¹þ¾î³µÀ» ¶§ÀÇ Ã³¸®¸¦ Çϴµ¥ ÀÌ Á¶°Ç¹®Àº »ç½Ç ´ÙÀ½ µÑ Áß Çϳª·Î ¾²´Â °ÍÀÌ ¿øÄ¢ÀûÀÌ´Ù.

 

          if (PureY(y)+FontHeight > yPos+(frt.bottom-frt.top)) {

          if ((y-frt.top)+FontHeight > yPos+(frt.bottom-frt.top)) {

 

Áº¯Àº ÇöÀç ij·µÀÇ ¼ø¼ö ¹®¼­ ÁÂÇ¥¿¡ FontHeight¸¦ ´õÇÑ Ä³·µÀÇ ¹ß°¡¶ô ¼öÁ÷ ÁÂÇ¥ÀÌ°í ¿ìº¯Àº ÇöÀç ½ºÅ©·Ñ »óÅ¿¡¼­ Á¦ÀÏ ¾Æ·¡ÂÊ ¼öÁ÷ ÁÂÇ¥ÀÌ´Ù. ±×·¡¼­ ÀÌ ½ÄÀº "ij·µÀÇ ¾Æ·¡ÂÊÀÌ ¾Èº¸À̸é"À̶ó´Â Á¶°ÇÀ» ±¸¼ºÇϴµ¥ º¸´Ù½ÃÇÇ ¾çº¯¿¡ -frt.topÀÌ ÀÖÀ¸´Ï ¾çÂÊ ´Ù ¾ø¾Ö ¹ö·Áµµ ¼ö½ÄÀº µ¿ÀÏÇØÁø´Ù. ±×·¡¼­ ÀÌ °ªÀ» ¾çÂÊ ´Ù ¾ø¾Ö ¹ö¸®°í °ýÈ£¸¦ Á¤¸®Çϸé À§ÀÇ °á°ú Äڵ尡 ³ª¿Â´Ù. »ç½Ç Á¿ìÀÇ -frt.topÀº Á¸Àç °¡Ä¡´Â ¾øÁö¸¸ Àǹ̰¡ ´Ù¸£´Ù. Áº¯ÀÇ °æ¿ì y¸¦ ¼ø¼ö ¹®¼­ ÁÂÇ¥·Î ¹Ù²Ù±â À§ÇØ, ¿ìº¯ÀÇ °æ¿ì´Â Æ÷¸ËÆà ¿µ¿ªÀÇ ³ôÀ̸¦ ±¸Çϱâ À§ÇØ ÇÊ¿äÇÑ °ÍÀÌ´Ù. ¾çº¯¿¡ -frt.topÀ» ¾ø¾Ö ¹ö¸®¸é ÄÚµå´Â °£´ÜÇØÁöÁö¸¸ ÀÌÇØÇϱâ´Â ´õ ¾î·Á¿öÁø´Ù. °á°ú Äڵ常À¸·Î´Â ÀÌ·± Áß°£ °úÁ¤±îÁö À¯ÃßÇÒ ¼ö ¾ø±â ¶§¹®¿¡ ´Ù¸¥ »ç¶÷ÀÇ Äڵ带 º¸±â°¡ ±Ùº»ÀûÀ¸·Î ¾î·Á¿î °ÍÀÌ´Ù.

ij·µÀÌ Æ÷¸ËÆà ¿µ¿ª ¾Æ·¡ÂÊ¿¡ ÀÖÀ» ¶§´Â yPos¸¦ À̵¿½ÃÄÑ ÀÌ ÁÙÀÌ È­¸é ¾Æ·¡ÂÊ¿¡ ÀÖµµ·Ï ÇÑ´Ù. ¿©±â¼­ ty´Â È­¸é Á¦ÀÏ ¾Æ·¡ÂÊ¿¡ ¹èÄ¡µÉ º¸ÀÌ´Â ÁÙÀÇ È­¸é ¼öÁ÷ ÁÂÇ¥ÀÌ´Ù. Æ÷¸ËÆà ¿µ¿ªÀÇ ³ôÀÌ¿¡¼­ FontHeight¸¦ »©°í ÀÌ °ªÀ» LineHeightÀÇ ¹è¼ö·Î ³»¸²ÇÏ¿´´Ù. Áï, ÇöÀç Æ÷¸ËÆà ¿µ¿ª ³ôÀÌ¿¡¼­ ¾îµðÂë¿¡ ÁÙÀ» Ãâ·ÂÇϸé ÀÌ ÁÙÀÌ ´Ù º¸ÀÏ °ÍÀΰ¡¸¦ °è»êÇÑ °ÍÀÌ´Ù. ¿©±â¿¡ FontHeight ´ë½Å LineHeight¸¦ »ç¿ëÇϸé Àǹ̰¡ ´Þ¶óÁø´Ù. ¿ÏÀüÈ÷ º¸ÀÌ´Â ÁÙÀÇ Á¤ÀǶõ ÁÙ°£±îÁö ´Ù º¸ÀÌ´Â ÁÙÀÌ ¾Æ´Ï¶ó ÁÙ°£Àº »©°í ±ÛÀÚ¸¸ Á¦´ë·Î º¸ÀÌ´Â ÁÙ·Î Á¤ÀÇÇ߱⠶§¹®¿¡ FontHeight¸¦ »ç¿ëÇß´Ù.

ty¸¦ °è»êÇßÀ¸¸é yPos´Â ÇöÀç ij·µ À§Ä¡ y¸¦ ¼ø¼ö ¹®¼­ ÁÂÇ¥·Î ¹Ù²Û ÈÄ ¿©±â¼­ ty¸¦ »©¸é µÈ´Ù. ÀÌ ½ÄÀº ´ÙÀ½°ú °°ÀÌ º¯ÇüÇÒ ¼ö ÀÖ´Ù. Áï yPos¿¡¼­ ¸¶Áö¸· ÁÙÀÇ È­¸é ÁÂÇ¥ ty¸¦ ´õÇÑ À§Ä¡¿¡ ÇöÀç ij·µÀÌ ÀÖ´Â ÁÙÀ» ¹èÄ¡Ç϶ó´Â ¶æÀÌ µÈ´Ù.

 

yPos=(y-frt.top)-ty;

yPos+ty=(y-frt.top);

 

OnMouseMove¿¡¼­ Ä¿¼­°¡ »ó´ÜÀ» ¹þ¾î³ª´ÂÁö ºñ±³ÇÏ´Â ¿¬»ê¹®µµ ¼öÁ¤ÇÑ´Ù.

 

void CApiEditText::OnMouseMove(HWND hWnd, int x, int y, UINT keyFlags)

{

     ...

    if (y < frt.top) {

          SendMessage(hWnd, WM_VSCROLL, SB_LINEUP, 0L);

          bInstTimer=TRUE;

     }

     if (nWrap == 0) {

          GetRCFromOff(SelEnd,r,c);

          if (x>frt.right && SelEnd != pLine[r].End) {

              SendMessage(hWnd, WM_HSCROLL, SB_LINERIGHT, 0L);

              bInstTimer=TRUE;

          }

        if (x<frt.left && SelEnd != pLine[r].Start) {

     ....

 

0 ´ë½Å frt.top, frt.left¸¦ »ç¿ëÇßÀ» »ÓÀÌ´Ù. OnSetCursor´Â Ưº°È÷ °íÄ¡Áö ¾Ê´Â´Ù. ¿©¹é¿¡¼­ÀÇ Ä¿¼­³ª ¸¶¿ì½º ¾×¼ÇÀº Æ÷¸ËÆà ¿µ¿ª°ú µ¿ÀÏÇÏ°Ô Ãë±ÞÇÑ´Ù. ¿­¸ðµå¿¡¼­ ÇÑ ÁÙÀÇ ¼±Åà ¿µ¿ªÀ» Á¶»çÇÏ´Â GetSelInLine ÇÔ¼ö¸¦ ¼öÁ¤ÇÑ´Ù.

 

void CApiEditText::GetSelInLine(int Line,int &s,int &e)

{

     ....

    s=GetOffFromXY(left,DocY(Line*LineHeight));

    e=GetOffFromXY(right,DocY(Line*LineHeight));

     ignoreVirt--;

     ExtraX=BkExtraX;

}

 

LineÁÙÀÇ ¼öÁ÷ ¹®¼­ ÁÂÇ¥´Â Line*LineHeight¿¡ frt.topÀ» ´õÇØ¾ß ÇÑ´Ù. GetOffFromXY´Â ¼ø¼ö ¹®¼­ ÁÂÇ¥°¡ ¾Æ´Ñ ¹®¼­ ÁÂÇ¥¸¦ ¿ä±¸ÇÑ´Ù. Å°º¸µå¿¡¼­ ÆäÀÌÁö ´ÜÀ§·Î ½ºÅ©·Ñ ÇÒ ¶§µµ Æ÷¸ËÆà ¿µ¿ªÀÇ Å©±â¸¸Å­ À̵¿ÇØ¾ß ÇÑ´Ù.

 

     case VK_UP:

          if (bControl && bShift)

               break;

          GetRCFromOff(off,r,c);

         

          OldOff=off;

          if (r > 0) {

              if (bControl) {

                   SendMessage(hWnd, WM_VSCROLL, SB_LINEUP, 0L);

               if (r != (Fheight+yPos)/LineHeight)

                        break;

              }

     case VK_PRIOR:

          GetRCFromOff(off,r,c);

          oldr=r;

        r-=Fheight/LineHeight;

          r=max(r,0);

          ....

     case VK_NEXT:

          GetRCFromOff(off,r,c);

          oldr=r;

        r+=Fheight/LineHeight;

          r=min(r,GetRowCount()-1);

          yPos=yPos+(r-oldr)*LineHeight;

        yPos=max(0,min(yPos,yMax-(Fheight/LineHeight)*LineHeight));

          Invalidate(-1);

 

crt.bottom ´ë½Å Fheight¶ó°í ½á¾ß ÇÑ´Ù. CtrlÅ°¿Í VK_UPÀ» °°ÀÌ ´©¸¦ ¶§´Â Æ÷¸ËÆà ¿µ¿ªÀÇ ³¡ ÁÙÀÌ ¾Æ´Ñ ÇÑ Ä¿¼­¸¦ À̵¿½Ãų ÇÊ¿ä°¡ ¾ø´Âµ¥ À̶§ Æ÷¸ËÆà ¿µ¿ª ³¡ÁÙ ÆǺ°¹®µµ Fheight¸¦ ÂüÁ¶ÇÑ´Ù.

¶ó.Çí»ç ºä ¼öÁ¤

ºä°¡ µÎ °³À̹ǷΠµû·Î ¼öÁ¤ÇØ¾ß ÇÑ´Ù. ±×·¯³ª ´ëºÎºÐÀ» ÅؽºÆ® ºäÀÇ ±â´ÉÀ» ºô·Á¼­ »ç¿ëÇϹǷΠ¸¹ÀÌ °íÄ¥ ÇÊ¿ä´Â ¾ø´Ù. Å°º¸µå Çڵ鷯´Â ÅؽºÆ® ºä¿Í ¿ÏÀüÈ÷ °°Àº ¹æ½ÄÀ¸·Î ¼öÁ¤ÇÑ´Ù. ¸Þ½ÃÁö Çڵ鷯µµ ´ÙÀ½ Çϳª¸¸ ¼öÁ¤ÇÏ¸é µÈ´Ù. ³ª¸ÓÁö´Â ¸ðµÎ ±âº» ºäÀÇ ¸Þ½ÃÁö Çڵ鷯¸¦ È£ÃâÇϹǷΠÀÌ¹Ì ¿©¹éÀ» ÀνÄÇϵµ·Ï ¼öÁ¤µÇ¾ú´Ù.

 

void CApiEditHexa::OnMouseMove(HWND hWnd, int x, int y, UINT keyFlags)

{

    if (y < frt.top) {

          SendMessage(hWnd, WM_VSCROLL, SB_LINEUP, 0L);

          bInstTimer=TRUE;

     }

     ....

 

SetCaretÀº ÅؽºÆ® ºä¿Í µ¿ÀÏÇÏ°Ô ¼öÁ¤ÇÑ´Ù.

 

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

{

     ....

     if (bScrollToCaret && crt.right) {

          pFrame->SendNotify(AEN_MOVE);

        if ((x+caretwidth > xPos+frt.right) || (x < xPos+frt.left)) {

           xPos=max(0,PureX(x)-(frt.right-frt.left)/2);

              bScroll=TRUE;

          }

 

        if (PureY(y) < yPos) {

           yPos=PureY(y);

              bScroll=TRUE;

          }

 

        if (y+FontHeight > yPos+frt.bottom) {

           ty=(frt.bottom-frt.top-FontHeight)/LineHeight*LineHeight;

           yPos=PureY(y)-ty;

              bScroll=TRUE;

          }

          ....

 

ÁÂÇ¥¿Í ¿ÀÇÁ¼Â°£À» º¯È¯ÇÏ´Â µÎ ÇÔ¼öµµ ¼öÁ¤ÇÑ´Ù.

 

void CApiEditHexa::GetXYFromOff(int nPos,int &x,int &y)

{

     int r,c;

 

     assert(nPos >= 0 && nPos <= pFrame->doclen);

     GetRCFromOff(nPos,r,c);

    y=DocY(r*LineHeight);

    x=DocX(c*bGap+bCol);

}

 

int CApiEditHexa::GetOffFromXY(int x,int y)

{

     int r,c;

 

    x-=frt.left;

     x=max(x,bCol);

    y=max(y,frt.top);

 

    r=PureY(y)/LineHeight;

     r=min(r,GetRowCount()-1);

     c=(x-bCol+FontWidth)/bGap;

     c=min(c,bpl-1);

 

     return GetOffFromRC(r,c);

}

 

DrawLine ÇÔ¼ö´Â ±âº»ºä¿Í ¿ÏÀüÈ÷ ¶È°°°Ô ¼öÁ¤ÇÑ´Ù. ´ÙÀ½ ÇÑ ÁÙ¸¸ ¼öÁ¤ÇÏ¸é µÈ´Ù.

 

int CApiEditHexa::DrawLine(HDC hdc, int Line)

{

     ....

    x=frt.left-xPos;

 

¼öÁ¤ ¿Ï·áµÇ¾ú´Ù. º°·Î ¾î·ÆÁö´Â ¾ÊÁö¸¸ ÀÌ¹Ì Çß´ø ÀÛ¾÷À» ¹Ýº¹ÇÏ·Á´Ï Á» ±ÍÂú±â´Â ÇÏ´Ù. ¸¸¾à ÀÌ ½Ç½ÀÀÌ ¾î·Æ°Ô ´À²¸Áø´Ù¸é ±âÁ¸ Äڵ忡 Àͼ÷ÇÏÁö ¾Ê¾Æ¼­ÀÏ °ÍÀÌ´Ù. ÇÁ·ÎÁ§Æ®°¡ Ä¿Áú¼ö·Ï À¯Áö º¸¼ö ºñ¿ëÀÌ Áõ°¡ÇÑ´Ù´Â °ÍÀº ¹Ù·Î ÀÌ·± ¶æÀÌ´Ù.

¸¶.´«±ÝÀÚ º¸±â

´«±ÙÀÚ´Â ÆíÁýâ »ó´Ü¿¡ ¿­ ¼ö¸¦ Ç¥½ÃÇÏ¿© ´ëÃæ ¸î ±ÛÀÚ Á¤µµ ÀÔ·ÂÇß´ÂÁö¸¦ º¼ ¼ö ÀÖ´Â ÀåÄ¡ÀÌ´Ù. »ç½Ç ¼­½ÄÀÌ ¾ø´Â ÅؽºÆ® ÆíÁý±â¿¡¼­ ¹®¼­ÀÇ ³»¿ë¸¸ Áß¿äÇÏ°í Çü½ÄÀº ±×´ÙÁö °í·Á ´ë»óÀÌ ¾Æ´Ï¹Ç·Î ´«±ÝÀÚ´Â ±×´ÙÁö ½Ç¿ëÀûÀÌÁö ¾Ê´Ù. ±×·¯³ª °íÁ¤Æø ±Û²Ã¿¡¼­ Çà´ç ÀÏÁ¤ °³¼öÀÇ ¹®ÀÚ¸¸À» ÀÔ·ÂÇØ¾ß ÇÏ´Â ¹®¼­¿¡¼­´Â ´«±ÝÀÚ°¡ °¡²û ÇÊ¿äÇÒ ¶§µµ ÀÖ´Ù. ´«±ÝÀÚ ±¸ÇöÀ» À§ÇØ ´ÙÀ½ º¯¼öµéÀ» ÇÁ·¹ÀÓ¿¡ ¼±¾ðÇÑ´Ù.

 

#define RULERHEIGHT 20

 

class CApiEdit : public CWindow

{

private:

     ....

     BOOL bShowRuler;

     COLORREF RulerColor;

 

public:

     ....

     BOOL GetShowRuler() { return bShowRuler; }

     void SetShowRuler(BOOL aValue);

     COLORREF GetRulerColor() { return RulerColor; }

     void SetRulerColor(int aValue);

};

 

´«±ÝÀÚ Ç¥½Ã ¿©ºÎ¿Í ´«±ÝÀÚÀÇ »ö»óÀ» ÁöÁ¤ÇÏ´Â º¯¼öÀÌ´Ù. RULERHEIGHT »ó¼ö´Â À̸§ÀÌ ÀǹÌÇϵíÀÌ ´«±ÝÀÚÀÇ ³ôÀÌÀÌ´Ù. »ý¼ºÀÚ¿¡¼­ ´ÙÀ½°ú °°ÀÌ ÃʱâÈ­ÇÑ´Ù.

 

CApiEdit::CApiEdit()

{

     ....

     bShowRuler=TRUE;

     RulerColor=RGB(220,220,220);

}

 

Å×½ºÆ®¸¦ ÇØ¾ß ÇϹǷΠÀÏ´Ü TRUE·Î ÃʱâÈ­Çß´Ù. ¿É¼Ç°ªÀ» º¯°æÇÏ´Â Set ÇÔ¼ö´Â ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÑ´Ù.

 

void CApiEdit::SetShowRuler(BOOL aValue)

{

     bShowRuler=aValue;

     for (int aet=0;aet<4 && arView[aet];aet++) {

          SendMessage(arView[aet]->hWnd,WM_SIZE,0,0);

          arView[aet]->Invalidate(-1);

     }

}

 

void CApiEdit::SetRulerColor(int aValue)

{

     RulerColor=aValue;

     ForAllView(Invalidate(-1))

}

 

´«±ÝÀÚ º¸±â ¸ðµå°¡ ¹Ù²î¸é Æ÷¸ËÆà ¿µ¿ªÀ» ´Ù½Ã °è»êÇØ¾ß ÇϹǷΠWM_SIZE ¸Þ½ÃÁö¸¦ º¸³½´Ù. ´«±ÝÀÚ°¡ º¸ÀÌ°Ô µÇ¾ú´Ù°í Çؼ­ ÆøÀÌ ¹Ù²î´Â °ÍÀº ¾Æ´Ï¹Ç·Î Á¤·ÄÀ» ´Ù½Ã ÇÒ ÇÊ¿ä´Â ¾ø´Âµ¥ ºÒÇÊ¿äÇÑ Á¤·ÄÀ» Çѹø ´õ ÇÏ´Â ¼ÀÀ̱â´Â ÇÏÁö¸¸ ÀÚÁÖ ÀÖ´Â ÀÏÀÌ ¾Æ´Ï¹Ç·Î °£´ÜÇÏ°Ô ±¸ÇöÇß´Ù. »ö»óÀÌ ¹Ù²î¸é ´Ù½Ã ±×¸®±â¸¸ ÇÏ¸é µÈ´Ù. ºäÀÇ OnSize¿¡¼­ ´«±ÝÀÚÀÇ ³ôÀ̸¸Å­ Æ÷¸ËÆà ¿µ¿ª »ó´ÜÀ» À̵¿½ÃŲ´Ù.

 

void CApiEditText::OnSize(HWND hWnd, UINT state, int cx, int cy)

{

     ....

     if (state != SIZE_MINIMIZED) {

          ....

        frt.top+=(pFrame->InnerRect.top+(pFrame->bShowRuler ? RULERHEIGHT:0));

 

´ÙÀ½Àº ´«±ÝÀÚ¸¦ ±×¸®´Â ÇÔ¼ö¸¦ ÀÛ¼ºÇÑ´Ù. ´Ü¼øÇÑ ±×·¡ÇÈ Ãâ·Â¹®ÀÌ´Ù. OnPaint¿¡¼­ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ´«±ÝÀÚ¸¦ ±×¸°´Ù.

 

void CApiEditText::DrawRuler(HWND hWnd,HDC hdc)

{

     TCHAR szTemp[10];

     RECT crt,rrt;

     HBRUSH hBrush;

     HPEN hPen,OldPen;

     HFONT hOldFont;

     int i,x;

 

     GetClientRect(hWnd,&crt);

     hBrush=CreateSolidBrush(pFrame->RulerColor);

     SetRect(&rrt,MarginWidth,0,crt.right-SBW,RULERHEIGHT);

     FillRect(hdc,&rrt,hBrush);

     hPen=CreatePen(PS_SOLID,1,RGB(128,128,128));

     OldPen=(HPEN)SelectObject(hdc,hPen);

     MoveToEx(hdc,MarginWidth,RULERHEIGHT-1,NULL);

     LineTo(hdc,crt.right-SBW,RULERHEIGHT-1);

     hOldFont=(HFONT)SelectObject(hdc,CApiEdit::hLineNumFont);

     SetTextAlign(hdc,TA_CENTER);

     for (i=0;;i++) {

          x=frt.left+FontWidth*i;

          MoveToEx(hdc,x,RULERHEIGHT-1,NULL);

          if (i%10==0) {

              wsprintf(szTemp,"%d",i);

              TextOut(hdc,x,2,szTemp,lstrlen(szTemp));

          }

          if (i%5==0) {

              LineTo(hdc,x,RULERHEIGHT-9);

          } else {

              LineTo(hdc,x,RULERHEIGHT-5);

          }

          // Ãâ·ÂÇÑ ÈÄ ÁÂÇ¥ Á¡°ËÇØ¾ß ¸¶Áö¸· ´«±Ý±îÁö Ãâ·ÂµÈ´Ù.

          if (x > crt.right-SBW) {

              break;

          }

     }

     SetTextAlign(hdc,TA_LEFT);

     SelectObject(hdc,hOldFont);

     DeleteObject(SelectObject(hdc,OldPen));

     DeleteObject(hBrush);

}

 

void CApiEditText::OnPaint(HWND hWnd)

{

    int RulerHeight;

     ....

     hdc=BeginPaint(hWnd,&ps);

     GetClientRect(hWnd,&crt);

    

    if (pFrame->bShowRuler) {

        DrawRuler(hWnd,hdc);

        RulerHeight=RULERHEIGHT;

    } else {

        RulerHeight=0;

    }

     ....

     if (pFrame->InnerRect.top) {

        SetRect(&mrt,MarginWidth,RulerHeight,crt.right-SBW,frt.top);

          FillRect(hdc,&mrt,hInnerBrush);

     }

     if (pFrame->InnerRect.right) {

        SetRect(&mrt,frt.right,RulerHeight,crt.right-SBW,crt.bottom-SBW);

          FillRect(hdc,&mrt,hInnerBrush);

     }

 

´«±ÝÀÚ°¡ º¸ÀÌ´Â »óÅÂÀ̸é DrawRuler ÇÔ¼ö·Î ´«±ÝÀÚ¸¦ ±×¸°´Ù. À§ÂÊ, ¿À¸¥ÂÊ ¿©¹éÀº ´«±ÝÀÚÀÇ ³ôÀ̸¸Å­ ¾Æ·¡·Î À̵¿µÈ´Ù. Á¼Àº ¿µ¿ªÀ̹ǷΠ´õºí ¹öÆÛ¸µÀº ÇÏÁö ¾Ê¾Ò´Âµ¥ ¹Ù·Î ±×·Áµµ ±ô¹Ú°Å¸²À» ´À³¥ ¼ö ¾ø´Ù. ½ÇÇàÇØ º¸¸é ´«±ÝÀÚÀÇ ¼ýÀÚµéÀÌ ºÒÅõ¸íÇÏ°Ô Ãâ·ÂµÇ´Âµ¥ ÀÌ ¹®Á¦´Â ´ÙÀ½ Àý¿¡¼­ ÀÚ¿¬½º·´°Ô ÇØ°áµÉ °ÍÀÌ´Ù.

´«±ÝÀÚ´Â Æ÷¸ËÆà ¿µ¿ª¿¡ Æ÷ÇÔµÇÁö ¾ÊÀ¸¹Ç·Î OnSetCursor¿¡¼­ Æ÷¸ËÆà ¿µ¿ª ¹Ù±ù¿¡ Ä¿¼­°¡ ÀÖÀ» ¶§ È­»ìÇ¥ ¸ð¾çÀÇ Ä¿¼­·Î ¹Ù²Û´Ù. ¶ÇÇÑ ÀÌ ¿µ¿ª¿¡¼­ ¸¶¿ì½º ´©¸§Àº ¾Æ¹« µ¿ÀÛµµ ÇÏÁö ¾Ê¾Æ¾ß ÇÑ´Ù.

 

BOOL CApiEditText::OnSetCursor(HWND hWnd, HWND hwndCursor, UINT codeHitTest, UINT msg)

{

     if (codeHitTest==HTCLIENT) {

          ....

          // ´«±ÝÀÚ À§¿¡¼­´Â È­»ìÇ¥ Ä¿¼­¸¦ Ç¥½ÃÇÑ´Ù.

        if (pFrame->bShowRuler && pt.y < RULERHEIGHT) {

           SetCursor(LoadCursor(NULL,IDC_ARROW));

           return TRUE;

        }

 

          pt.x += xPos;

          ....

 

void CApiEditText::OnLButtonDown(HWND hWnd, BOOL fDoubleClick, int x, int y, UINT keyFlags)

{

     ....

     // ´«±ÝÀÚ À§¿¡¼­ÀÇ Å¬¸¯Àº ¹«½ÃÇÑ´Ù.

    if (pFrame->bShowRuler && y < RULERHEIGHT) {

        return;

    }

 

     bFindSelect=FALSE;

     ....

 

void CApiEditHexa::OnLButtonDown(HWND hWnd, BOOL fDoubleClick, int x, int y, UINT keyFlags)

{

     ....

     // ´«±ÝÀÚ À§¿¡¼­ÀÇ Å¬¸¯Àº ¹«½ÃÇÑ´Ù.

    if (pFrame->bShowRuler && y < RULERHEIGHT) {

        return;

    }

 

     bFindSelect=FALSE;

     ....

 

±×³É ¸®ÅÏÇØ ¹ö¸®¸é ¾Æ¹« Àϵµ ÀϾÁö ¾Ê´Â´Ù. ¿©±â±îÁö Å×½ºÆ®°¡ ³¡³µÀ¸¸é ¼³Á¤°ªµéÀ» ¹«³­ÇÑ °ªÀ¸·Î µðÆúÆ®¸¦ ¼öÁ¤ÇÑ´Ù.

 

CApiEdit::CApiEdit()

{

     ....

     SetRect(&InnerRect,1,2,0,0);

     InnerRectColor=GetSysColor(COLOR_WINDOW);;

     bShowRuler=FALSE;

     RulerColor=RGB(220,220,220);

}

 

¿ÞÂÊ¿¡ 1Çȼ¿, À§ÂÊ¿¡ 2Çȼ¿¸¸Å­¸¸ ¿©¹éÀ» ÁÖ¾ú°í ¿©¹éÀÇ »ö»óÀº ¹è°æ»ö»ó°ú °°´Ù. ÀÌ Á¤µµ ¿©¹é¸¸ Á־ ´Ù¼Ò ¿©À¯ÀÖ¾î º¸ÀδÙ. ´«±ÝÀÚ´Â µðÆúÆ®·Î º¸ÀÌÁö ¾Ê°Ô Çß´Ù.