2.¼±Åà ºí·Ï

°¡.ºí·ÏÀÇ ¸ð¾ç

ApiEditÀÇ ¼±Åà ºí·ÏÀº ÅØ½ºÆ®¸¸ ¹ÝÀü½ÃÄÑ Ãâ·ÂÇϱ⠶§¹®¿¡ ¿©·¯ ÁÙÀ» ÇѲ¨¹ø¿¡ ¼±ÅÃÇϸé ÁÙ »çÀÌ´Â ¹ÝÀüµÇÁö ¾Ê´Â´Ù. ¸¶Ä¡ ¹®¼­¿¡ °¡·Î ÁÙ¹«´Ì°¡ ÀÖ´Â °Íó·³ °°Àºµ¥ º¸±â¿¡´Â ±×·° Àú·° ±¦Âú°í Ưº°È÷ ºÒÆíÇÑ Á¡Àº ¾øÁö¸¸ ¼±Åà ºí·Ï³»ÀÇ ¹®¼­¸¦ ÀÐÀ» ¶§´Â °¡µ¶¼º¿¡ ÁÁÁö ¾Ê°í ÀÌ·± ¹®ÀåÀ» ¿À·§µ¿¾È Àдٺ¸¸é ´«µµ ½±°Ô ÇÇ·ÎÇØÁø´Ù. ƯÈ÷ ÁÙ°£ÀÌ ³ÐÀ» ¶§´Â ÇÑ ÁÙ¾¿ °Ç³Ê¶Ù¸é ¼±ÅÃµÈ °Íó·³ º¸À̱⵵ ÇÑ´Ù.

¿öµå ÇÁ·Î¼¼¼­³ª ´Ù¸¥ ÅØ½ºÆ® ÆíÁý±â¿¡ Àͼ÷ÇÑ »ç¶÷Àº ÀÌ·± ºí·Ï ¸ð¾çº¸´Ù ¼±Åà ºí·Ï Àüü°¡ ¿ÏÀüÈ÷ ¹ÝÀüµÇ´Â °ÍÀ» ´õ ÁÁ¾ÆÇÑ´Ù. ¹°·Ð ÇöÀçÀÇ ApiEdit ºí·Ï ¸ð¾çÀÌ ´õ ¸¶À½¿¡ µå´Â »ç¶÷µµ ÀÖÀ» °ÍÀÌ´Ù. ºí·Ï ¸ð¾çÀ» ¾î¶»°Ô Ãâ·ÂÇÒ °ÍÀΰ¡¸¦ ¿É¼ÇÀ¸·Î ¸¸µé¾î º¸ÀÚ. ¶ÇÇÑ ÁÙ°£ÀÌ ³ÐÀ» ¶§ ¹®ÀÚ¿­ÀÌ »ó´ÜÀ¸·Î¸¸ Á¤·ÄµÇ´Â Á¤·Ä ¹æ½Äµµ º¯°æÇØ º¼ °ÍÀÌ´Ù. ÀÌ ±â´Éµé ±¸Çö¿¡ ÇÊ¿äÇÑ ¿É¼Ç º¯¼öµéÀ» ÇѲ¨¹ø¿¡ ¹Ì¸® ¼±¾ðÇÑ´Ù.

 

class CApiEdit : public CWindow

{

private:

     ....

     int VAlign;

     int SelBlockType;

     COLORREF SelFrameColor;

 

public:

     ....

     int GetVAlign() { return VAlign; }

     void SetVAlign(int aValue);

     int GetSelBlockType() { return SelBlockType; }

     void SetSelBlockType(int aValue);

     COLORREF GetSelFrameColor() { return SelFrameColor; }

     void SetSelFrameColor(int aValue);

};

 

VAlignÀº ¼±Åà ºí·Ï ³»¿¡¼­ÀÇ ¼öÁ÷ Á¤·Ä ¹æ½ÄÀ» ÁöÁ¤Çϸç SelBlockTypeÀº ¼±Åà ºí·°ÀÇ ¸ð¾çÀÌ´Ù. »ý¼ºÀÚ¿¡¼­ ÀÌ º¯¼öµéÀ» ÃʱâÈ­Çϰí Set ÇÔ¼ö¿¡¼­ ¿É¼Ç º¯°æ½ÃÀÇ Ã³¸®¸¦ ÇÑ´Ù.

 

CApiEdit::CApiEdit()

{

     ....

     VAlign=1;

     SelBlockType=1;

     SelFrameColor=RGB(0,0,0);

}

 

void CApiEdit::SetSelBlockType(int aValue)

{

     SelBlockType=aValue;

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

          if (arView[aet]->SelStart != arView[aet]->SelEnd) {

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

          }

     }

}


void CApiEdit::SetSelFrameColor(int aValue)

{

     SelFrameColor=aValue;

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

          if (arView[aet]->SelStart != arView[aet]->SelEnd) {

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

          }

     }

}

 

void CApiEdit::SetVAlign(int aValue)

{

     VAlign=aValue;

     ForAllView(Invalidate(-1))

}

 

ÀÌ ¿É¼ÇµéÀ» Á¦´ë·Î Àû¿ëÇÏ·Á¸é ÅØ½ºÆ® Ãâ·Â ¸ðµå¸¦ Åõ¸íÀ¸·Î ¹Ù²Ù¾î¾ß ÇÑ´Ù. ¼±Åà ºí·ÏÀ» ¸ÕÀú ±×¸®°í ÅØ½ºÆ®¸¦ Ãâ·ÂÇØ¾ß ÇÏ¸ç ¶Ç ¹è°æÀÇ ºñÆ®¸ÊÀÌ ±ò¸° »óÅ¿¡¼­µµ ÅØ½ºÆ®¸¦ Ãâ·ÂÇÒ °ÍÀ̹ǷΠ¹è°æ »ö»óÀ» ¹«½ÃÇØ¾ß ÇÑ´Ù.

 

 

void CApiEditText::OnPaint(HWND hWnd)

{

     hdc=BeginPaint(hWnd,&ps);

    SetBkMode(hdc,TRANSPARENT);

     ....

     hMemDC=CreateCompatibleDC(hdc);

    SetBkMode(hMemDC,TRANSPARENT);

     ....

 

È­¸é DC¿Í ¸Þ¸ð¸® DC µÑ ´Ù ¹«Á¶°Ç TRANSPARENT ¸ðµå·Î º¯°æÇß´Ù. ÀÌ·¸°Ô µÇ¸é ÁÙ ¹øÈ£ Ãâ·ÂÀ̳ª ´«±ÝÀÚÀÇ ÅØ½ºÆ®¸¦ Ãâ·ÂÇÒ ¶§ ÀϺη¯ Åõ¸í ¸ðµå·Î ¹Ù²ÙÁö ¾Ê¾Æµµ µÈ´Ù. ´ÙÀ½ ÄÚµåµéÀº ÀÌÁ¦ »èÁ¦ÇÑ´Ù.

 

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

{

    UINT OldBkMode;

     ....

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

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

           ....

           OldBkMode=SetBkMode(hdc,TRANSPARENT);

              ....

           SetBkMode(hdc,OldBkMode);

          }

 

          // ºÏ¸¶Å© Ãâ·Â

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

                        ....

                   OldBkMode=SetBkMode(hdc,TRANSPARENT);

                        ....

                   SetBkMode(hdc,OldBkMode);

                   }

              }

          }

 

¹°·Ð »èÁ¦ ¾ÈÇØµµ »ó°ü¾øÁö¸¸ ºÒÇÊ¿äÇÑ ÄÚµåÀ̹ǷΠÁö¿ö ¹ö¸®´Â °ÍÀÌ ÁÁ´Ù. ´«±ÝÀÚÀÇ ¼ýÀÚµéÀÌ ÀÌÁ¦ Á¦´ë·Î º¸ÀÏ °ÍÀÌ´Ù. ÀÌ·¸°Ô µÇ¸é ¼±Åà ºí·ÏÀ̳ª C++ ÆÄÀÏÀÇ ÁÖ¼®°°ÀÌ ¹è°æÀÌ ÀÖ´Â ÅØ½ºÆ®´Â Á¦´ë·Î º¸ÀÌÁö ¾Ê´Â´Ù. Áö±ÝºÎÅÍ´Â ¹è°æÀ» Á÷Á¢ ±×·Á¾ß ÇÑ´Ù. 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);

          x=docx-xPos;

        if (back!=pFrame->cBack) {

           if (pFrame->SelBlockType==0) {

               SetRect(&rt,oldx,y,x+1,y+FontHeight);

           } else {

               SetRect(&rt,oldx,0,x+1,LineHeight);

           }

           Brush=CreateSolidBrush(back);

           FillRect(hdc,&rt,Brush);

           DeleteObject(Brush);

        }

          if (bShowTab) {

              DisplayTab(hdc,oldx,x,y,back);

          }

     } else {

          SetTextColor(hdc,fore);

        SetBkColor(hdc,back);

        oldx=x;

        if (bShowEnter || ignoreX == FALSE || back!=pFrame->cBack) {

           x+=MyGetTextExtent(pFrame->buf+SegOff,len);

        }

        if (back!=pFrame->cBack) {

           if (pFrame->SelBlockType==0) {

               SetRect(&rt,oldx,y,x,y+FontHeight);

           } else {

               SetRect(&rt,oldx,0,x,LineHeight);

           }

           Brush=CreateSolidBrush(back);

           FillRect(hdc,&rt,Brush);

           DeleteObject(Brush);

        }

        AeTextOut(hdc,oldx,y,pFrame->buf+SegOff,len);

          if (bShowSpace) {

           DisplaySpace(hdc,oldx,y,pFrame->buf+SegOff,len);

          }

     }

     if (bShowEnter) {

          if (pFrame->IsEnterCode(SegOff+len)) {

              DisplayEnter(hdc,x,y,back);

          }

     }

}

 

¹è°æ »ö»óÀ» ÁöÁ¤ÇÏ´Â SetBkColor È£Ãâ¹®Àº ÀÌÁ¦ Çʿ䰡 ¾ø¾îÁ³´Ù. ¹è°æÀ» ¸ÕÀú ±×¸®°í ¿©±â¿¡ Åõ¸í»öÀ¸·Î ÅØ½ºÆ®¸¦ Ãâ·ÂÇÑ´Ù. ¼±Åà ºí·°À̳ª ¶Ç´Â ÁÖ¼®°°ÀÌ ¹è°æÀÌ ÀÖ´Â ÅØ½ºÆ®ÀÇ ¸ð¾çÀº SelBlockType º¯¼ö¿¡ µû¶ó ´Þ¶óÁö´Âµ¥ ÀÌ °ªÀÌ 0ÀÌ¸é ÆùÆ® ³ôÀ̸¸Å­ ¹è°æÀ» ±×¸®°í 1À̸é ÁÙ°£ ³ôÀ̸¸Å­ ¹è°æÀ» ±×¸°´Ù. ÁÙ°£ÀÌ ¾Æ¹«¸® Ä¿µµ ¼±Åà ºí·°ÀÌ ¸ðµÎ ºÙ¾î¼­ Ãâ·ÂµÈ´Ù.

Çí»çºä´Â DrawLine¿¡¼­ °ð¹Ù·Î Ãâ·ÂÇϹǷΠÀÌ ÇÔ¼ö¸¦ ¼öÁ¤ÇØ¾ß Çϴµ¥ Àá½Ã ÈÄ ÀÛ¼ºÇÒ ¼öÁ÷ Á¤·Ä ±â´É±îÁö °°ÀÌ ¼öÁ¤Çϵµ·Ï ÇÏÀÚ.

³ª.¼öÁ÷ Á¤·Ä

ValignÀº ¼±Åà ºí·Ï³»¿¡¼­ÀÇ ¼öÁ÷ Á¤·Ä À§Ä¡¸¦ ÁöÁ¤ÇÑ´Ù. ÁÙ°£ÀÌ 100% ÀÌ»óÀÏ ¶§´Â ¹®ÀÚ¿­ ¾Æ·¡ À§¿¡ ¿©¹éÀÌ »ý±â´Âµ¥ ÀÌ ¿©¹é°ú ¹®ÀÚ¿­ÀÇ ¹èÄ¡ °ü°è¸¦ ÁöÁ¤ÇÏ´Â °ÍÀÌ´Ù. Àüü ÁÙ°£ ³ôÀÌ¿¡¼­ ¹®ÀÚ¿­À» À§, Áß¾Ó, ¾Æ·¡¿¡ °¢°¢ ¹èÄ¡ÇÒ ¼ö ÀÖ´Ù.

Áß¾Ó Á¤·ÄÀÌ º¸±â¿¡ °¡Àå ÁÁÀºµ¥ ´ç±ÙÀÇ ÇöÀç Ãâ·Â ¹æ½ÄÀº »ó´Ü Á¤·Ä·Î µÇ¾î ÀÖ´Ù. DrawLineÀÌ º°´Ù¸¥ ÁÂÇ¥ Á¶Á¤¾øÀÌ ÁÙÀÇ ¼öÁ÷ ½ÃÀÛ ÁÂÇ¥¿¡ ¹®ÀÚ¿­À» Ãâ·ÂÇϱ⠶§¹®ÀÌ´Ù. Á¤·Ä ¹æ½ÄÀ» ¹Ù²Ù·Á¸é ÁÙ°£ÀÇ Ãâ·Â ÁÂÇ¥¸¦ Àû´çÈ÷ ¶ç¿ö ÅØ½ºÆ®¸¦ Á¶±Ý ¾Æ·¡ÂÊÀ¸·Î ³»·Á¾ß ÇÑ´Ù. ´ÙÀ½ ÇÔ¼ö´Â VAlign ¿É¼ÇÀ¸·ÎºÎÅÍ ÁÙ°£³»ÀÇ ¹®ÀÚ ¼öÁ÷ À§Ä¡¸¦ ±¸ÇÑ´Ù.

 

int CApiEditText::GetCharYPos()

{

     switch (pFrame->VAlign) {

     case 0:

          return 0;

     default:

     case 1:

          return (LineHeight-FontHeight)/2;

     case 2:

          return LineHeight-FontHeight;

     }

}

 

»ó´Ü Á¤·ÄÀÏ ¶§´Â 0À» ¸®ÅÏÇÏ¿© ÁÙ À§ÂÊ¿¡ Ãâ·ÂÇÏ¸é µÇ°í ÇÏ´Ü Á¤·ÄÀÏ ¶§´Â ÁÙ°£¿¡¼­ ±Û²Ã Å©±â ³ôÀ̸¦ »«¸¸Å­ÀÎ ¿©¹é ³ôÀ̸¦ ´õÇØ ÁÙ°£ ¾Æ·¡ÂÊ¿¡ ÅØ½ºÆ®¸¦ Ãâ·ÂÇÑ´Ù. Áß¾Ó Á¤·ÄÀÏ ¶§´Â ¿©¹é ³ôÀÌÀÇ Àý¹ÝÀ» ´õÇØ ÅØ½ºÆ®°¡ ÁÙ°£ÀÇ Áß¾Ó¿¡ ¿Àµµ·Ï ÇÑ´Ù. ´Ü¼öÇÑ ¿¬»ê¹®ÀÏ »ÓÀÌ´Ù. ÅØ½ºÆ®¸¦ Ãâ·ÂÇÒ ¶§ y ÁÂÇ¥¸¦ ¹«Á¶°Ç 0À¸·Î ÁÖÁö ¸»°í ÀÌ ÇÔ¼ö°¡ ¸®ÅÏÇÑ ÁÂÇ¥¸¦ »ç¿ëÇÑ´Ù.

 

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

{

    int x,y;

     ....

    y=GetCharYPos();

     if (bCurLine && (pFrame->nShowCurLine == 3 || pFrame->nShowCurLine == 4)) {

        if (pFrame->SelBlockType==0) {

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

        } else {

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

        }

          hCurLine=CreateSolidBrush(pFrame->CurColor);

          FillRect(hdc,&lrt,hCurLine);

          DeleteObject(hCurLine);

     }

     ....

     for (;;) {

          ....

        DrawSegment(hdc,x,y,nowoff,len,

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

          ....

 

yº¯¼ö¸¦ »õ·Î ¼±¾ðÇϰí VAlign°ª¿¡ µû¶ó ¼öÁ÷ Ãâ·Â À§Ä¡¸¦ ¼±ÅÃÇÑ´Ù. DrawSegmentÀÇ ¼¼¹øÂ° Àμö·Î y¸¦ ³Ñ±â¸é ÀÌ ÁÂÇ¥¿¡ ¹®ÀÚ¿­À» Ãâ·ÂÇÒ °ÍÀÌ´Ù. »ç½Ç ÀÌ Àμö´Â ´õºí ¹öÆÛ¸µÀ» Çϸ鼭ºÎÅÍ ºÒÇÊ¿äÇß¾úÀ¸³ª ¼öÁ÷ Á¤·Ä À§Ä¡¸¦ ÁöÁ¤ÇÏ´Â Áö±Ý¿¡ ¿Í¼­ ´Ù½Ã ÇÊ¿äÇÏ°Ô µÇ¾ú´Ù. ÀϺη¯ ³²°ÜµÐ °Íµµ ¾Æ´Ï°í ¾ø¾Ö±â°¡ ±ÍÂú¾Æ¼­ ³»¹ö·Á µÐ °ÍÀ̾ú´Âµ¥ ¾îÂîÇÏ´Ù º¸´Ï Àç»ç¿ëÇÒ ±âȸ°¡ »ý°å´Ù. À½¿µÀÌ µé¾î°£ ÇöÀçÇà Ç¥½Ã´Â SelBlockType°ú VAlign ¿É¼ÇÀÇ ¿µÇâÀ» µ¿½Ã¿¡ ¹Þ´Â´Ù. À½¿µÀÇ ³ôÀ̵µ ºí·ÏÀÇ ³ôÀÌ¿¡ ¸ÂÃß°í SelBlockTypeÀÌ 0ÀÏ °æ¿ì À½¿µÀÇ ½ÃÀÛ À§Ä¡¸¦ y¿¡ ¸ÂÃá´Ù. ij·µÀÇ À§Ä¡µµ ÅØ½ºÆ®¸¦ µû¶ó°¡¾ß ÇϹǷΠSetCaretµµ ¼öÁ¤ÇÑ´Ù.

 

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

{

     ....

    SetCaretPos(x-xPos,y-yPos+GetCharYPos());

     if (bUpdatePrevX) {

          PrevX=x;

     }

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

          InvRt.left=0;

          InvRt.right=frt.right;

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

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

          InvalidateRect(hWnd,&InvRt,FALSE);

     }

}

 

¼öÁ÷Á¤·ÄµÈ¸¸Å­ ij·µ À§Ä¡µµ ¾Æ·¡·Î ³»·È´Ù. Áß¾ÓÀ̳ª ÇÏ´Ü Á¤·ÄÀÏ ¶§ À½¿µÀÇ ¹«È¿ ¿µ¿ª ½ÃÀÛ À§Ä¡°¡ ij·µ ÁÂÇ¥°¡ ¾Æ´Ï¶ó ij·µÀÌ ÀÖ´Â ÁÙÀÇ Ã³À½À̾î¾ß ÇÑ´Ù. LineHeightÀÇ ¹è¼ö·Î ³»¸²Çϸé ÁÙÀÇ Ã³À½ ÁÂÇ¥¸¦ ½±°Ô ±¸ÇÒ ¼ö ÀÖ´Ù. DrawSegment ÇÔ¼ö°¡ yÀμö¸¦ ¹Þ¾ÆµéÀ̹ǷΠ±× Á¹º´ ÇÔ¼öµéÀÎ Á¦¾îÄÚµå º¸±â ÇÔ¼öµéµµ ¸ðµÎ ¼öÁ¤ÇØ¾ß ÇÑ´Ù. ¼öÁ¤ ¹æ¹ýÀº Áö±ØÈ÷ °£´ÜÇÏ´Ù.

 

void CApiEditText::DisplayTab(HDC hdc, int x1, int x2, int y,COLORREF back)

{

     switch (ShowTabType) {

     case 0:

          MoveToEx(hdc,x1+1,y+FontHeight/2,NULL);

          LineTo(hdc,x2-1,y+FontHeight/2);

          LineTo(hdc,x2-3,y+FontHeight/2-2);

          LineTo(hdc,x2-3,y+FontHeight/2+2);

          LineTo(hdc,x2-1,y+FontHeight/2);

          break;

     case 1:

          MoveToEx(hdc,x1+1,y+FontHeight*3/4,NULL);

          LineTo(hdc,x2-1,y+FontHeight*3/4);

          LineTo(hdc,x2-3,y+FontHeight*3/4-2);

          LineTo(hdc,x2-3,y+FontHeight*3/4+2);

          LineTo(hdc,x2-1,y+FontHeight*3/4);

          for (i=0;i<sizeof(arTab)/sizeof(arTab[0]);i+=2) {

              SetPixel(hdc,arTab[i]+x1+2,y+arTab[i+1]+FontHeight*3/4-6,pFrame->CodeColor);

          }

          break;

     }

 

     SelectObject(hdc,OldPen);

     DeleteObject(hPen);

}

 

¸ðµç ¼öÁ÷ ÁÂÇ¥¿¡ y+¸¸ ÇØ ÁÖ¸é µÈ´Ù. ¿ø·¡ ÀÌ °ªÀ» ´õÇØ¾ß Çß¾ú´Âµ¥ 0À̾ú±â ¶§¹®¿¡ ´õÇÏÁö ¾Ê¾Ò¾ú´Ù.

 

void CApiEditText::DisplayEnter(HDC hdc, int x, int y,COLORREF back)

{

     HPEN hPen,OldPen;

     HBRUSH Brush,OldBrush;

     RECT rt;

     int width;

 

     hPen=CreatePen(PS_SOLID,1,pFrame->CodeColor);

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

    Brush=CreateSolidBrush(back);

     ....

     SetRect(&rt,x,y,x+width,y+FontHeight);

    FillRect(hdc,&rt,Brush);

 

     if (ShowEnterType <= 1) {

          MoveToEx(hdc,x+width-2,y+FontHeight/10,NULL);

          LineTo(hdc,x+width-2,y+FontHeight*3/4);

          LineTo(hdc,x+2,y+FontHeight*3/4);

          LineTo(hdc,x+4,y+FontHeight*3/4-2);

          LineTo(hdc,x+4,y+FontHeight*3/4+2);

          LineTo(hdc,x+2,y+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,y+FontHeight/5,NULL);

          LineTo(hdc,x+width-4,y+FontHeight*5/8);

          LineTo(hdc,x+3,y+FontHeight*5/8);

          LineTo(hdc,x+5,y+FontHeight*5/8-2);

          LineTo(hdc,x+5,y+FontHeight*5/8+2);

          LineTo(hdc,x+3,y+FontHeight*5/8);

     }

     SelectObject(hdc,OldPen);

     DeleteObject(hPen);

    DeleteObject(Brush);

}

 

DrawSegment¿¡¼­ ¹è°æ »ö»óÀ¸·Î ¹Ì¸® ä¿ì±â¸¦ ÇØ µÎ¾úÀ¸¹Ç·Î Á¦¾î ÄÚµå Ãâ·ÂÀ» À§ÇØ ¹è°æÀ» Áö¿ï Çʿ䰡 ¾ø¾îÁ³´Ù. FillRect È£Ãâ¹®À» »èÁ¦ÇÏ°í ¹è°æ ºê·¯½Ãµµ ´õ ÀÌ»ó ÇÊ¿ä¾ø´Ù. ¸ðµç ¼öÁ÷ ÁÂÇ¥¿¡ y¸¦ ´õÇÑ´Ù. °ø¹éÀ» Ãâ·ÂÇÏ´Â ÇÔ¼öµµ ¸¶Âù°¡Áö·Î Ãâ·Â ÁÂÇ¥¿¡ y¸¦ ´õÇÑ´Ù.

 

void CApiEditText::DisplaySpace(HDC hdc, int x, int y, TCHAR *text, int len)

{

     ....

     for (nPos=0;nPos!=len;nPos++) {

          if (text[nPos] == 0x20) {

              switch (ShowSpaceType) {

              default:

              case 0:

               SetPixel(hdc,nx+width/2,y+FontHeight/2,pFrame->CodeColor);

               SetPixel(hdc,nx+width/2,y+FontHeight/2+1,pFrame->CodeColor);

                   break;

              case 1:

               MoveToEx(hdc,nx,y+FontHeight*3/4+1,NULL);

               LineTo(hdc,nx,y+FontHeight-1);

               LineTo(hdc,nx+width-1,y+FontHeight-1);

               LineTo(hdc,nx+width-1,y+FontHeight*3/4);

                   break;

              case 2:

               Rectangle(hdc,nx,0,nx+width,y+FontHeight);

                   break;

              }

              nx+=width;

          } else {

          ....

 

¸¶ÁøÀÇ ÁÙ¹øÈ£, ÇöÀçÇà Ç¥½Ã, ºÏ¸¶Å© Ç¥½Ã µîµµ °°ÀÌ º»¹® ÅØ½ºÆ®¿Í ³ôÀ¸¸¦ ¸ÂÃß¾î¾ß ÇϹǷΠDrawLineSub ÇÔ¼öÀÇ ¸ðµç Ãâ·Â¹®¿¡ y¸¦ ´õÇÑ´Ù.

 

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

{

     ....

    int vy;

 

    vy=GetCharYPos();

     // ¹Ú½º ¶Ç´Â ¹ØÁÙ·Î ÇöÀçÇà Ç¥½ÃÇϱâ

     if ((pFrame->nShowCurLine==1 || pFrame->nShowCurLine==2 ||

          pFrame->nShowCurLine==4) && bCurLine) {

          if (pFrame->nShowCurLine == 1 || pFrame->nShowCurLine == 4) {

           if (pFrame->SelBlockType==0) {

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

           } else {

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

           }

          } else {

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

          }

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

          SetBkColor(hdc,GetSysColor(COLOR_WINDOW));

          DrawFocusRect(hdc,&lrt);

     }

     ....

     // ¸¶Áø Ãâ·Â

     if (MarginWidth != 0) {

          ....

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

              ....

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

          ....

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

                    ....

               RoundRect(hdc,0,vy,10,vy+FontHeight,2,2);

                        ....

                   TextOut(hdc,2,vy+2,szLine,lstrlen(szLine));

          ....

          // ¸¶Áø¿¡ ÇöÀçÇà Ç¥½Ã

          if (pFrame->nShowCurLine == 5 && bCurLine) {

              ....

           if (len!=0 || vy!=0) {

                   for (c=0;c<4;c++) {

                   tri[c].y+=len+vy;

                   }

              }

 

¸ðµç Ãâ·Â ÁÂÇ¥¿¡ vy¸¦ ´õÇØ ÁØ´Ù. Á¡¼±À¸·Î ÇöÀçÇàÀ» Ç¥½ÃÇÒ ¶§ »ç°¢ ÇÁ·¹ÀÓÀÇ Å©±â´Â SelBlockType¿¡ µû¶ó ´Þ¶óÁø´Ù. ¸¶¿ì½º·Î µå·¡±×ÁßÀÇ Àӽà ij·µ À§Ä¡µµ ¼öÁ÷ Á¤·Ä¿¡ ¿µÇâÀ» ¹Þ´Â´Ù.

 

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

{

     ....

     if (bDragSel) {

          if (x > frt.left && x < frt.right && y > frt.top && y < frt.bottom) {

              toff=GetOffFromXY(x+xPos,y+yPos);

              GetXYFromOff(toff,sx,sy);

           SetCaretPos(sx-xPos,sy-yPos+GetCharYPos());

     ....

 

Çí»ç ºäµµ ¶È°°Àº ¹æ½ÄÀ¸·Î ¼öÁ¤ÇÑ´Ù.

 

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

{

    int x,y;

     ....

     COLORREF OldFore,OldBack;

     ....

 

     GetRCFromOff(off,r,c);

     if (r==Line && (bHideCurLine==FALSE || GetFocus()==hWnd)) {

          bCurLine=TRUE;

     }

 

    y=GetCharYPos();

     if (bCurLine && (pFrame->nShowCurLine == 3 || pFrame->nShowCurLine == 4)) {

        if (pFrame->SelBlockType==0) {

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

        } else {

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

        }

          hCurLine=CreateSolidBrush(CurColor);

          FillRect(hdc,&lrt,hCurLine);

          DeleteObject(hCurLine);

     }

     ....

     wsprintf(szText,"%.8X:",nPos);

     if (bCapital==FALSE) _strlwr(szText);

    TextOut(hdc,x,y,szText,lstrlen(szText));

     x+=bCol;

 

     // ¹ÙÀÌÆ® Ãâ·Â. ¹®¼­ ³¡À» ¸¸³ª´õ¶óµµ x°ª °»½ÅÀ» À§ÇØ ·çÇÁ´Â ³¡±îÁö µ¹¾Æ¾ß ÇÑ´Ù.

     for (i=nPos;i<nPos+bpl;i++) {

          if (i < pFrame->doclen) {

              wsprintf(szText,fmtByte,(BYTE)pFrame->buf[i]);

 

              // ¹ÙÀÌÆ® ÅØ½ºÆ® Ãâ·Â. ¼±Åà ¿µ¿ªÀÌ¸é ºí·Ï¾È¿¡ ÅØ½ºÆ® Ãâ·Â

              if (i>=SelFirst && i<SelSecond &&

                   (GetFocus()==hWnd || pFrame->HideSelType!=0 || bFindSelect)) {

                   OldFore=SetTextColor(hdc,fore);

//            OldBack=SetBkColor(hdc,back);

               if (pFrame->SelBlockType==0) {

                   SetRect(&srt,x,y,x+bGap,y+FontHeight);

               } else {

                   SetRect(&srt,x,0,x+bGap,LineHeight);

               }

                   FillRect(hdc,&srt,hSelBack);

               TextOut(hdc,x,y,szText,lstrlen(szText));

                   SetTextColor(hdc,OldFore);

//            SetBkColor(hdc,OldBack);

              } else {

               TextOut(hdc,x,y,szText,lstrlen(szText));

              }

          }

          x+=bGap;

     }

 

     // ¹®ÀÚ Ãâ·Â

     x+=FontWidth;

     for (i=nPos;i<nPos+bpl;i++) {

          memset(szText,0,3);

          if (i==pFrame->doclen) {

              break;

          }

          // DBCS µÞ ¹ÙÀÌÆ®´Â .À¸·Î ´ëü

          if (i==nPos && pFrame->IsInDBCS(i)) {

              szText[0]='.';

          } else {

              // ÇÑ±Û Ãâ·Â

              if (pFrame->IsDBCS(i) && !pFrame->IsEnterCode(i)) {

                   szText[0]=pFrame->buf[i++];

                   szText[1]=pFrame->buf[i];

              } else {

                   // ¿µ¹®Àº Àμ⠰¡´ÉÇÑ ¹®ÀÚ¸¸ Ãâ·Â

                   if (pFrame->buf[i] >= 0x20 && pFrame->buf[i] <= 0x7e) {

                        szText[0]=pFrame->buf[i];

                   } else {

                        szText[0]='.';

                   }

              }

          }

          // ¹®ÀÚ Ãâ·Â

        GetTextExtentPoint32(hdc,szText,lstrlen(szText),&sz);

          if (i>=SelFirst && i<SelSecond &&

              (GetFocus()==hWnd || HideSelType!=0 || bFindSelect)) {

              OldFore=SetTextColor(hdc,fore);

//         OldBack=SetBkColor(hdc,back);

           if (pFrame->SelBlockType==0) {

               SetRect(&srt,x,y,x+sz.cx,y+FontHeight);

           } else {

               SetRect(&srt,x,0,x+sz.cx,LineHeight);

           }

           FillRect(hdc,&srt,hSelBack);

           TextOut(hdc,x,y,szText,lstrlen(szText));

              SetTextColor(hdc,OldFore);

//         SetBkColor(hdc,OldBack);

          } else {

           TextOut(hdc,x,y,szText,lstrlen(szText));

          }

          x+=sz.cx;

     }

 

     DeleteObject(hSelBack);

     DeleteObject(SelectObject(hdc,OldPen));

     DrawLineSub(hdc,Line,bCurLine);

     return 1;

}

 

VAlign ¿É¼Ç¿¡ µû¶ó y¸¦ °è»êÇÏ°í ¸ðµç TextOut ÇÔ¼ö°¡ 0 ´ë½Å y¸¦ »ç¿ëÇÑ´Ù. ¹è°æ »ö»óÀº »ç¿ëÇÏÁö ¾ÊÀ¸¸ç ¼±Åà ºí·ÏÀº Á÷Á¢ FillRect·Î ±×¸°´Ù. °¢ ¹®ÀÚ¸¦ Ãâ·ÂÇϱâ Àü¿¡ ÆøÀ» ¸ÕÀú ±¸ÇØ ³õ¾Æ¾ß ºí·ÏÀÇ ÆøÀ» ¾Ë ¼ö ÀÖ´Ù. SetCaret ÇÔ¼ö´Â ÅØ½ºÆ® ºä¿Í ¿ÏÀüÈ÷ µ¿ÀÏÇÏ°Ô ¼öÁ¤ÇÑ´Ù.

 

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

{

     ....

     SetCaretPos(x-xPos,y-yPos+GetCharYPos());

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

          InvRt.left=0;

          InvRt.right=frt.right;

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

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

          InvalidateRect(hWnd,&InvRt,FALSE);

     }

}

 

ºä°¡ µÎ °³ÀÌ´Ù º¸´Ï °°Àº ÀÛ¾÷À» ¿©·¯ ¹ø ¹Ýº¹ÇØ¾ß ÇÑ´Ù. ¹Ýº¹µÇ´Â ÄÚµå´Â ÁÁÁö ¾ÊÀ¸¹Ç·Î ´ÙÀ½¿¡ ¸®ÆåÅ丵ÇÒ ¿¹Á¤ÀÌ´Ù.

´Ù.¼±ÅÃµÈ °³Çà ÄÚµå

ÁÙ ³¡¿¡ ÀÖ´Â °³Çà ÄÚµå´Â ¼±ÅÃÇØµµ ¼±Åà ºí·Ï¿¡ Æ÷ÇÔµÇÁö ¾Ê´Â´Ù. ±×·¡¼­ ºóÁÙÀÌ ÀÖ´Â ¹®¼­¸¦ ¼±ÅÃÇÏ¸é ´ÙÀ½ ±×¸²Ã³·³ ¼±Åà ¿µ¿ªÀÌ Áß°£ Áß°£ ²÷¾îÁø °Íó·³ º¸ÀδÙ.

¾îÂ÷ÇÇ ºóÁÙÀ̹ǷΠºí·ÏÀÌ ²÷¾îÁ® Ç¥½ÃµÇµµ º° ¹®Á¦´Â ¾øÁö¸¸ ¸¶Ä¡ ¾Æ·¡ÂÊÀÇ ¹®´Ü°ú À­ÂÊÀÇ ¹®´ÜÀÌ µû·Î ¼±ÅõǾî ÀÖ´Â °Íó·³ º¸ÀδÙ. »ç¿ëÀÚ¿¡°Ô È¥¶õÀ» ÁÙ ¼öµµ ÀÖÀ¸¹Ç·Î ¼±ÅÃµÈ °³Çà Äڵ嵵 ¹ÝÀüÇÏ¿© Ç¥½ÃÇØ º¸ÀÚ. ½¬¿ö º¸ÀÏÁö ¸ð¸£°ÚÁö¸¸ »ý°¢º¸´Ù ¹®Á¦Á¡ÀÌ ¸¹´Ù. Á¤·Ä Á¤º¸ÀÎ pLineÀÇ Start¿Í End¿¡ ±â·ÏµÇ´Â ¿ÀÇÁ¼Â¿¡´Â °³Çà Äڵ尡 Á¦¿ÜµÇ¹Ç·Î ÀÏ¹Ý ¹®ÀÚ¿Í µ¿ÀÏÇÏ°Ô Ãë±ÞÇÏ±â ¾î·Æ´Ù. ´Ù¸¸ bShowEnter ¿É¼ÇÀÌ ¼±ÅõǾî ÀÖÀ» ¶§´Â ±×·¡ÇÈÀ¸·Î °³Çà Äڵ带 º¸¿©Áִµ¥ ÀÌ °æ¿ìµµ ¼±Åà »óÅ´ ǥ½ÃÇÏÁö ¾Ê´Â´Ù.

°³Çà Äڵ嵵 ¼±ÅÃµÇ¸é ¹ÝÀü»öÀ¸·Î Ç¥½ÃÇØ º¸ÀÚ. °³Çà ÄÚµå º¸±â ¿É¼ÇÀÌ ÄÑÁ® ÀÖÀ» ¶§¿Í ±×·¸Áö ¾ÊÀ» ¶§ ¾çÂÊÀ» ´Ù ó¸®ÇØ¾ß ÇÑ´Ù. °³Çà ÄÚµå º¸±â ¿É¼ÇÀÌ ¼±ÅõǾî ÀÖÁö ¾ÊÀ» ¶§´Â DrawLine¿¡¼­ Á÷Á¢ ó¸®ÇÑ´Ù. °³Çà ÄÚµåÀÇ Æø¸¸Å­ ¹ÝÀü Ç¥½Ã¸¸ Ãâ·ÂÇÏ´Â °£´ÜÇÑ µ¿ÀÛÀÌÁö¸¸ ±³·ÁÇÒ °Ô ¸¹¾Æ Äڵ尡 Á» ±æ´Ù.

 

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

{

     BOOL bSelEnter=FALSE;

     ....

          // ÁÙ³¡ÀÇ ¼±ÅÃµÈ °³Çà Äڵ尡 ÀÖ´ÂÁö Á¶»çÇÑ´Ù.

          if (nowoff+len == pLine[Line].End) {

              if (!bShowEnter && pFrame->IsEnterCode(pLine[Line].End) &&

                   pLine[Line].End >= SelFirst && pLine[Line].End < SelSecond) {

                   bSelEnter=TRUE;

              }

          }

 

          // ¼±ÅÃµÈ °³Çà Äڵ尡 ÀÖÀ¸¸é x°»½Å

          DrawSegment(hdc,x,y,nowoff,len,

              (nowoff+len==pLine[Line].End && !bSelEnter),fore,back);

 

          nowoff+=len;

          // ¼±ÅÃµÈ °³Çà ÄÚµå Ãâ·Â

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

              if (bSelEnter) {

                   if (pFrame->SelBlockType==0) {

                        SetRect(&lrt,x,y,x+arChWidth[' '],y+FontHeight);

                   } else {

                        SetRect(&lrt,x,0,x+arChWidth[' '],LineHeight);

                   }

                   if (GetFocus()==hWnd || pFrame->HideSelType==2 || bFindSelect) {

                        hCurLine=CreateSolidBrush(pFrame->cSelBack);

                   } else {

                        hCurLine=CreateSolidBrush(RGB(192,192,192));

                   }

                   FillRect(hdc,&lrt,hCurLine);

                   DeleteObject(hCurLine);

              }

              break;

          }

     }

 

     DrawLineSub(hdc,Line,bCurLine);

     return 1;

}

 

ÁÙ³¡¿¡ ¼±ÅÃµÈ °³Çà Äڵ尡 ÀÖ´ÂÁö bSelEnter º¯¼ö¿¡ ¸ÕÀú Á¶»çÇÑ´Ù. ´Ü bShowEnter ¿É¼ÇÀÌ ÄÑÁ® ÀÖÀ¸¸é DisplayEnter ÇÔ¼ö¿¡¼­ Á¦¾îÄڵ带 ±×¸± ¶§ ¼±Åà ºí·ÏÀ» ±×¸®¹Ç·Î ¿©±â¼­ º°µµÀÇ Ã³¸®¸¦ ÇÒ Çʿ䰡 ¾ø´Ù. ÇöÀç ÁÙ ³¡ÀÌ°í ¿©±â°¡ °³Çà ÄÚµåÀÌ°í ¶Ç ¼±Åà ºí·Ï¾È¿¡ ÀÖ¾î¾ß °³Çà Äڵ尡 ¼±ÅÃµÈ °ÍÀÌ´Ù.

´Ü, ¿­¸ðµåÀÏ ¶§´Â °³Çà Äڵ尡 ¼±ÅõÇÁö ¾Ê´Â´Ù. GetSelInLine ÇÔ¼ö°¡ SelFirst¿Í SelSecond¸¦ Á¶ÀÛÇϴµ¥ À̶§ °³Çà Äڵ尡 ¼±Åà ¹üÀ§¿¡ Æ÷ÇÔµÇÁö ¾ÊÀº °ÍÀ¸·Î °è»êµÇ±â ¶§¹®ÀÌ´Ù. ¿­¸ðµå¿¡¼­´Â °³Çà ÄÚµå ¼±Åà ºí·ÏÀÌ Å« Àǹ̰¡ ¾øÀ¸¹Ç·Î È¥¶õ½º·´Áö ¾ÊÀ» °ÍÀÌ´Ù. ¸¸¾à ¿­ ¸ðµå¿¡¼­µµ °³Çà Äڵ带 ¼±ÅÃÇÏ·Á¸é ±×·¸°Ô ÇÒ ¼öµµ ÀÖÀ¸³ª ÀÌ·¸°Ô µÇ¸é ¹Ù·Î ´ÙÀ½¿¡ ÀÛ¼ºÇÒ ºí·Ï ÇÁ·¹ÀÓ¿¡¼­ ´õ Å« ¹®Á¦°¡ ¹ß»ýÇÑ´Ù.

DrawSegment¸¦ È£ÃâÇÒ ¶§ ÁÙ ³¡ÀÌ´õ¶óµµ ¼±ÅÃµÈ °³Çà Äڵ尡 ÀÖÀ¸¸é xÁÂÇ¥¸¦ °»½ÅÇØ¾ß ¸¶Áö¸· ¹®ÀÚ¿­ ´ÙÀ½¿¡ °³Çà ÄÚµå ºí·ÏÀÌ Á¦´ë·Î ±×·ÁÁø´Ù. ¸¶Áö¸· ÁÙ ³¡À» Ãâ·ÂÇÒ ¶§ °³Çà ÄÚµå ÀÚ¸®¿¡ ¼±Åÿµ¿ª »ö»óÀ¸·Î »ç°¢ ¹Ú½º¸¦ Çϳª ±×¸®¸é µÈ´Ù. °³Çà ÄÚµåÀÇ ÆøÀº °ø¹é°ú °°°í ³ôÀÌ´Â SelBlockType¿¡ µû¶ó ´Þ¶óÁö¸ç »ö»óÀº ¼±Åà ¿µ¿ª »ö»ó ¹× Æ÷Ä¿½º ¿©ºÎ µî ¿©·¯ °¡Áö Á¶°Ç¿¡ µû¶ó ´Þ¶óÁø´Ù. °³Çà ÄÚµå º¸±â ¿É¼ÇÀÌ ¼±ÅõǾî ÀÖÀ¸¸é DisplayEnter¿¡¼­ ¹è°æ»öÀ» Á÷Á¢ ±×¸° ÈÄ °³Çà Äڵ带 Ãâ·ÂÇÑ´Ù.

 

void CApiEditText::DisplayEnter(HDC hdc, int x, int y,COLORREF back)

{

     HPEN hPen,OldPen;

     HBRUSH OldBrush;

    RECT rt,brt;

     int width;

    HBRUSH Brush;

     ....

     SetRect(&rt,x,y,x+width,y+FontHeight);

    if (back!=pFrame->cBack) {

        if (pFrame->SelBlockType==0) {

           brt=rt;

        } else {

           SetRect(&brt,x,0,x+width,LineHeight);

        }

        Brush=CreateSolidBrush(back);

        FillRect(hdc,&brt,Brush);

        DeleteObject(Brush);

    }

 

     if (ShowEnterType <= 1) {

     ....

 

¹è°æ»öÀÌ ÇöÀç ¹è°æ»ö°ú ´Ù¸£´Ù¸é, Áï ¼±ÅõǾî ÀÖ´Ù¸é brt¿¡ ¹è°æ ¿µ¿ªÀ» °è»êÇÏ°í ¼±Åà »ö»óÀ¸·Î »ç°¢ÇüÀ» ¸ÕÀú ±×¸®¸é µÈ´Ù. ÀÌ·¸°Ô µÇ¸é °³Çà ÄÚµå Ç¥½Ã´Â ¸¶Áö¸· Ãâ·ÂµÈ Á¶°¢ÀÇ ¹è°æ»öÀ» µû¶ó°£´Ù. °³Çà ÄÚµå ÀÚü°¡ ¼±ÅõǾî ÀÖÁö ¾Ê´õ¶óµµ ¹Ù·Î ¾ÕÀÇ Á¶°¢ÀÌ ¼±ÅõǾî ÀÖÀ¸¸é °³Çà Äڵ嵵 ¼±ÅÃµÈ °Íó·³ Ãâ·ÂµÈ´Ù. °³Çà ÄÚµå ÀÚü°¡ ÁÙÀÇ ¹üÀ§¿¡¼­ Á¦¿ÜµÇ¾î Àֱ⠶§¹®¿¡ DrawLine¿¡¼­ ¼¼±×¸ÕÆ®¿¡ Æ÷ÇÔµÇÁö ¾ÊÀ¸¸ç DrawSegment¿¡¼­ ¸¶Áö¸· Á¶°¢ Ãâ·Â ÈÄ ´ýÀ¸·Î Ãâ·ÂÇÏ´Â °ÍÀ̱⠶§¹®ÀÌ´Ù. ±×·¡¼­ °³Çà ÄÚµå Ç¥½Ã°¡ ¼±Åÿµ¿ª ³»ºÎ¿¡ ÀÖ´ÂÁö ¾Æ´ÑÁö´Â º°µµ·Î Á¶»çÇØ¾ß ÇÑ´Ù. ÀÌ ºÎ´ãÀº DrawSegment¿¡¼­ Áö±â·Î ÇÑ´Ù. DisplayEnter¿¡¼­ ÇÒ ¼öµµ ÀÖÁö¸¸ ±×·¸°Ô ÇÏ·Á¸é °³Çà ÄÚµåÀÇ ¿ÀÇÁ¼ÂÀ» Àμö·Î Àü´Þ¹Þ¾Æ¾ß ÇÑ´Ù´Â »õ·Î¿î ºÎ´ã¿¡ »ý±ä´Ù.

 

void CApiEditText::DrawSegment(HDC hdc, int &x, int y, int SegOff, int len, BOOL ignoreX,

     COLORREF fore, COLORREF back)

{

     ....

     if (bShowEnter) {

          if (pFrame->IsEnterCode(SegOff+len)) {

              if (SegOff+len >= min(SelStart,SelEnd) && SegOff+len < max(SelStart,SelEnd)) {

                   DisplayEnter(hdc,x,y,back);

              } else {

                   DisplayEnter(hdc,x,y,pFrame->cBack);

              }

          }

     }

}

 

SgmOff+len, Áï °³Çà ÄÚµåÀÇ ÀÚ¸®°¡ ¼±Åÿµ¿ª¿¡ ¼ÓÇØ ÀÖÀ¸¸é Á¶°¢ÀÇ ¹è°æ»öÀ¸·Î Ãâ·ÂÇÏ°í ±×·¸Áö ¾Ê´Ù¸é cBack Áï, ±âº» ¹è°æ»öÀ¸·Î Ãâ·ÂÇÑ´Ù. óÀ½ºÎÅÍ °í·ÁµÇÁö ¾Ê¾Ò´ø ±â´ÉÀ̶ó È¿À²ÀûÀÌÁö ¸øÇÏ¸ç ´Ù¼Ò ²Ç¼ö°¡ ¼¯¿´´Ù. ÀÌÁ¦ ½ÇÇàÇØ º¸¸é ²÷¾îÁø ¹®´Üµµ ¿¬¼ÓÀûÀ¸·Î ºí·Ï ¼±ÅÃµÉ °ÍÀÌ´Ù.

¶ó.ºí·Ï ÇÁ·¹ÀÓ

SelBlockTypeÀÇ ¼¼¹øÂ° ŸÀÔÀÎ 2¹øÀº ¼±Åà ºí·Ï¿¡ ¿Ü°û¼±À» ±×¸®´Â °ÍÀÌ´Ù. ¿Ü°û¼±ÀÇ »ö»óÀº SelFrameColor·Î ÁöÁ¤ÇÑ´Ù. 2¹ø ŸÀÔÀº 1¹ø ŸÀÔ°ú ¸¶Âù°¡Áö·Î ºí·Ï »çÀÌ¿¡ Æ´À» ÁÖÁö ¾Ê´Â´Ù. ¾Õ¿¡¼­ ÀÌ ¿É¼ÇÀ» Á¡°ËÇÒ ¶§ if (SelBlockType==0) { } else { } ·Î Äڵ带 ÀÛ¼ºÇßÀ¸¹Ç·Î 2¹ø ŸÀÔ°ú 1¹ø ŸÀÔÀÇ ºí·Ï ¸ð¾çÀÌ µ¿ÀÏÇÏ°Ô ±×·ÁÁø´Ù. 2¹ø ŸÀÔÀº ¿©±â¿¡ ¿Ü°û¼±¸¸ Ãß°¡·Î ±×¸®¸é µÈ´Ù.

ºí·Ï ÇÁ·¹ÀÓÀº ºÒ±ÔÄ¢ÇÑ ¸ð¾çÀÇ ´Ù°¢ÇüÀ̱⠶§¹®¿¡ DrawLine¿¡¼­ ó¸®ÇϱⰡ ¹«Ã´ ¾î·Æ´Ù. ÀÌÀü, ´ÙÀ½ÁÙÀÇ ¼±Åà »óűîÁö °í·ÁÇÏ¿© ¼±Åà ¿µ¿ªÀÇ °¡Àå ¿Ü°û¼±¸¸ ±×·Á¾ß Çϴµ¥ DrawLineÀº ÇÑ ÁÙÀÇ Ãâ·Â¸¸ Àü´ãÇϵµ·Ï µðÀÚÀεǾú°Ô ¶§¹®¿¡ ÇöÀç ±¸Á¶·Î´Â ÀÌ·± ¿¬»êÀ» ÇÒ ¼ö°¡ ¾ø´Ù. ±×·¡¼­ ¸ðµç Ãâ·ÂÀ» ´Ù ÇÑ ÈÄ º°µµÀÇ ÇÔ¼ö°¡ ºí·Ï ÇÁ·¹ÀÓÀ» µû·Î ±×¸®±â·Î ÇÑ´Ù.

 

void CApiEditText::DrawSelFrame(HDC hdc)

{

     HRGN hRgn;

     int x1,y,x2;

     int SelFirst, SelSecond;

     HBRUSH hBrush;

     int rs,re,i;

     int ss,se;

     RECT rt;

     HRGN rgn;

     BOOL OldbLineEnd;

     int BkExtraX;

 

     BkExtraX=ExtraX;

     ExtraX=0;

     ignoreVirt++;

 

     OldbLineEnd=bLineEnd;

     SelFirst=min(SelStart,SelEnd);

     SelSecond=max(SelStart,SelEnd);

     bLineEnd=FALSE;

     GetRCFromOff(SelFirst,rs,i);

     bLineEnd=TRUE;

     GetRCFromOff(SelSecond,re,i);

     hRgn=CreateRectRgn(0,0,0,0);

 

     for (i=rs;i<=re;i++) {

          if (bColumnMode) {

              GetSelInLine(i,ss,se);

          } else {

              if (i==rs) {

                   ss=SelFirst;

              } else {

                   ss=pLine[i].Start;

              }

              if (i==re) {

                   se=SelSecond;

              } else {

                   se=pLine[i].End;

              }

          }

          bLineEnd=FALSE;

          GetXYFromOff(ss,x1,y);

          bLineEnd=TRUE;

          GetXYFromOff(se,x2,y);

          if (!bColumnMode && pFrame->IsEnterCode(se) && se >= SelFirst && se < SelSecond) {

              if (bShowEnter) {

                   switch (ShowEnterType) {

                   case 0:

                        x2+=arChWidth[' ']*2;

                        break;

                   case 1:

                        x2+=arChWidth[' ']*3;

                        break;

                   case 2:

                        x2+=arChWidth[' ']*3;

                        break;

                   }

              } else {

                   x2+=arChWidth[' '];

              }

          }

          x1-=xPos;

          y-=yPos;

          x2-=xPos;

          SetRect(&rt,x1,y,x2,y+LineHeight);

          if (PtInRect(&frt,*(POINT *)&rt) || PtInRect(&frt,*(POINT *)&rt.right)) {

              rgn=CreateRectRgnIndirect(&rt);

              CombineRgn(hRgn,hRgn,rgn,RGN_OR);

              DeleteObject(rgn);

          }

     }

 

     hBrush=CreateSolidBrush(pFrame->SelFrameColor);

     FrameRgn(hdc,hRgn,hBrush,2,2);

     DeleteObject(hBrush);

     DeleteObject(hRgn);

     bLineEnd=OldbLineEnd;

     ignoreVirt--;

     ExtraX=BkExtraX;

}

 

ÆÄ»ý ºä¿¡¼­µµ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÒ ¼ö ÀÖÀ¸¹Ç·Î ¹Ýµå½Ã °¡»ó ÇÔ¼ö¿©¾ß ÇÑ´Ù. °¢ÁÙ¿¡ ´ëÇØ ¼±Åà ½ÃÀÛÁ¡°ú ³¡Á¡ÀÇ ÁÂÇ¥¸¦ ±¸ÇØ »ç°¢ ¿µ¿ªÀ» ¸¸µé°í ¸ðµç ÁÙÀÇ »ç°¢ ¿µ¿ªÀ» ÇÕÃÄ ¸®ÀüÀ¸·Î ¸¸µç´Ù. ¿ÀÇÁ¼ÂÀ¸·ÎºÎÅÍ ÁÂÇ¥¸¦ ±¸ÇÒ ¶§´Â bLineEndÀÇ ¿µÇâÀ» ¹Þ±â ¶§¹®¿¡ ÀÌ º¯¼ö¸¦ ÀûÀýÇÏ°Ô Á¶ÀÛÇØ¾ß ÇÑ´Ù. ÇÕÃÄÁø ¸®ÀüÀ» ¸¸µç ÈÄ FrameRgn ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ¸®Àü¿¡ ¿Ü°û¼±À» ±×¸°´Ù. ±½±â¿Í ÆøÀº 2·Î °íÁ¤Çߴµ¥ À̰͵µ ¼³Á¤ ¿É¼ÇÀ¸·Î ¸¸µé ¼ö ÀÖ´Ù.

¿­¸ðµåÀÏ ¶§´Â GetSelInLine ÇÔ¼ö·Î ÁÙ ³»ÀÇ ¼±Åà ¿ÀÇÁ¼ÂÀ» ½±°Ô ±¸ÇÒ ¼ö ÀÖ´Ù. ´Ü, ÀÌ °æ¿ì °³Çà ÄÚµå´Â ¼±Åà ¹üÀ§¿¡ Æ÷ÇÔµÇÁö ¾Ê´Â´Ù. ½ºÅ©·Ñ µî¿¡ ÀÇÇØ º¸ÀÌÁö ¾Ê´Â ¼±Åà ¿µ¿ª¿¡ ´ëÇØ¼­´Â ¸®ÀüÀ» ¸¸µé Çʿ䰡 ¾ø´Ù. frt¿¡ ÀüÇô Æ÷ÇÔµÇÁö ¾Ê´Â ÁÙÀº ¼³»ç ¼±ÅõǾî ÀÖ´õ¶óµµ ¸®ÀüÀ» ¸¸µéÁö ¾Ê´Â´Ù. GetXYFromOff ÇÔ¼ö´Â °³Çà Äڵ带 °í·ÁÇÏÁö ¾ÊÀ¸¹Ç·Î ¼±ÅÃµÈ °³Çà Äڵ尡 ÀÖÀ¸¸é Á÷Á¢ ÁÂÇ¥¿¡ Æ÷ÇÔ½ÃŲ´Ù. OnPaintÀÇ ³¡¿¡¼­ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù.

 

void CApiEditText::OnPaint(HWND hWnd)

{

     ....

     if (SelStart!=SelEnd && pFrame->SelBlockType==2) {

          DrawSelFrame(hdc);

     }

     EndPaint(hWnd,&ps);

}

 

¼±Åà ¿µ¿ªÀÌ ÀÖ°í ºí·Ï ÇÁ·¹ÀÓÀ» ±×¸®´Â ¿É¼ÇÀÌ ¼±ÅõǾî ÀÖÀ¸¸é DrawSelFrameÀ» È£ÃâÇÑ´Ù. ¼±Åà ºí·Ï ÇÁ·¹ÀÓÀº ÁÙ ´ÜÀ§·Î Ãâ·ÂµÇÁö ¾ÊÀ¸¹Ç·Î ¹«È¿ ¿µ¿ª °ü¸® ¹æ¹ýÀÌ Á¶±Ý ´Ù¸£´Ù.

 

void CApiEditText::ExpandSelection(int Start, int End)

{

     ....

    if (bColumnMode || pFrame->SelBlockType==2) {

          Invalidate(min(SelStart,SelEnd),max(SelStart,SelEnd));

     }

}

 

¿­¸ðµå¿Í ¸¶Âù°¡Áö·Î Á¶±ÝÀÌ¶óµµ ¼±Åà ¿µ¿ªÀÌ ¹Ù²î¸é ¼±Åà ¿µ¿ª Àüü¸¦ ¹«È¿È­ÇØ¾ß ÇÑ´Ù. ¸¶¿ì½º·Î ¼±ÅÃÇÒ ¶§µµ ¸¶Âù°¡Áö´Ù.

 

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

{

          ....

          Invalidate(min(OldOff,off),max(OldOff,off));

        if (bColumnMode || pFrame->SelBlockType==2) {

              Invalidate(min(SelStart,SelEnd),max(SelStart,SelEnd));

          }

 

Çí»ç ºä¿¡¼­ ºí·Ï ÇÁ·¹ÀÓÀº »ó´çÈ÷ ´Ù¸£°Ô ±¸ÇöµÈ´Ù. bLineEnd¶ó´Â °³³äÀÌ ¾ø°í pLine ¹è¿­µµ »ç¿ëÇÒ ¼ö ¾øÀ¸¸ç ¿­ ¸ðµåµµ ¾ø´Ù. µû¶ó¼­ ¾Æ¿¹ ÇÔ¼ö¸¦ ÀçÁ¤ÀÇÇÏ´Â °ÍÀÌ ÁÁ´Ù. ±â¹Ý Ŭ·¡½º¿¡¼­ °¡»óÀ¸·Î ¼±¾ðÇßÀ¸¹Ç·Î ÀçÁ¤ÀÇÇØµµ °¡»ó ÇÔ¼öÀÌ´Ù.

 

void CApiEditHexa::DrawSelFrame(HDC hdc)

{

     HRGN hRgn;

     int x1,y,x2;

     int SelFirst, SelSecond;

     HBRUSH hBrush;

     int rs,re,i;

     int ss,se;

     RECT rt;

     HRGN rgn;

 

     SelFirst=min(SelStart,SelEnd);

     SelSecond=max(SelStart,SelEnd);

     GetRCFromOff(SelFirst,rs,i);

     GetRCFromOff(SelSecond,re,i);

     hRgn=CreateRectRgn(0,0,0,0);

 

     for (i=rs;i<=re;i++) {

          if (i==rs) {

              ss=SelFirst;

          } else {

              ss=i*bpl;

          }

          if (i==re) {

              se=SelSecond;

          } else {

              se=i*bpl+bpl-1;

          }

          GetXYFromOff(ss,x1,y);

          GetXYFromOff(se,x2,y);

          if (se != SelSecond) {

              x2+=bGap;

          }

          x1-=xPos;

          y-=yPos;

          x2-=xPos;

          SetRect(&rt,x1,y,x2,y+LineHeight);

          if (PtInRect(&frt,*(POINT *)&rt) || PtInRect(&frt,*(POINT *)&rt.right)) {

              rgn=CreateRectRgnIndirect(&rt);

              CombineRgn(hRgn,hRgn,rgn,RGN_OR);

              DeleteObject(rgn);

          }

     }

 

     hBrush=CreateSolidBrush(pFrame->SelFrameColor);

     FrameRgn(hdc,hRgn,hBrush,2,2);

     DeleteObject(hBrush);

     DeleteObject(hRgn);

}

 

ºñ½ÁÇÏÁö¸¸ Á¶±Ý ´Ù¸£´Ù. ¸¶¿ì½º ¼±Åýÿ¡ ¼±Åÿµ¿ª Àüü¸¦ ¹«È¿È­ÇÑ´Ù.

 

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

{

     ....

     Invalidate(min(OldOff,off),max(OldOff,off));

    if (pFrame->SelBlockType==2) {

        Invalidate(min(SelStart,SelEnd),max(SelStart,SelEnd));

    }

     ....

 

¼³Á¤ Á¶Á¤ ±â´ÉÀÌ ¾ÆÁ÷ ÀÛ¼ºµÇÁö ¾Ê¾ÒÀ¸¹Ç·Î »ý¼ºÀÚ¿¡¼­ SelBlockTypeÀ» Á÷Á¢ 2·Î ¹Ù²ã ³õ°í Å×½ºÆ®ÇØ º¸ÀÚ. ¼±Åà ºí·ÏÀÇ »ö»óÀ» ¹àÀº »öÀ¸·Î º¯°æÇϰí ÇÁ·¹ÀÓÀÇ »ö»óÀ» Á¶±Ý ¾îµÎ¿î »öÀ¸·Î ¼³Á¤ÇÑ ÈÄ ¼±ÅÃÇØ º¸¸é Á¶±Ý ƯÀÌÇØ º¸ÀÏ °ÍÀÌ´Ù.

ºí·Ï ¿Ü°û¼±Àº ´õºí ¹öÆÛ¸µµÇÁö ¾Ê°í µû·Î ±×¸®±â ¶§¹®¿¡ ±ô¹Ú°Å¸²ÀÌ ½ÉÇÏ´Ù. Űº¸µå·Î À̵¿ÇÒ ¶§´Â ±×³ª¸¶ ºÁÁÙ¸¸ ÇÏÁö¸¸ ¸¶¿ì½º·Î À̵¿ÇÒ ¶§´Â ¹«Ã´ ½ÉÇÏ°Ô ±ô¹Ú°Å¸°´Ù. ´õºí ¹öÆÛ¸µÀº ÁÙ ´ÜÀ§·Î ÇÏÁö¸¸ ¼±Åà ÇÁ·¹ÀÓÀº Àüü¸¦ ÇѲ¨¹ø¿¡ ±×¸®±â ¶§¹®¿¡ ÇöÀç ±¸Á¶·Î¼­´Â ÀÌ ±ô¹Ú°Å¸²À» ÇØ°áÇÒ ¹æ¹ýÀÌ ¾ø´Ù. Å×½ºÆ®°¡ ³¡³­ ÈÄ ´Ù½Ã µðÆúÆ®ÀÎ 1·Î ¹Ù²ã ³õµµ·Ï ÇÏÀÚ.