2.16Áø Ãâ·Â

°¡.DrawLine

Çí»ç ºä¸¦ ¸¸µé±â À§ÇØ ±âº» ºä¸¦ ¼öÁ¤ÇÏ°í ÀÌÁø µ¥ÀÌÅ͸¦ ´Ù·ê ¼ö ÀÖµµ·Ï ±¸Á¶ Á¶Á¤À» ¸¶ÃÆÀ¸¸ç ½ÇÁ¦·Î Çí»ç ºä °´Ã¼µµ ¸¸µé¾ú´Ù. ±×·¯³ª ¾ÆÁ÷±îÁö Çí»ç ºä°¡ ±×·²µíÇÑ 16Áø ´ýÇÁ¸¦ Ãâ·ÂÇÏÁö´Â ¾Ê´Âµ¥ Áö±ÝºÎÅÍ Çí»ç ºä °´Ã¼¸¦ ÇÁ·Î±×·¡¹ÖÇØ º¸ÀÚ. óÀ½ ApiEdit¸¦ ¸¸µé ¶§ ó·³ ¼ø¼­´ë·Î ÀÛ¾÷Çϸ鼭 Äڵ带 Çϳª¾¿ ÀÛ¼ºÇ쵂 ³Ê¹« »ó¼¼ÇÏ°Ô ±â¼úÇÏÁö ¾Ê°í ¿ä¾à½ÄÀ¸·Î ÀÛ¾÷ °úÁ¤À» ±â¼úÇϱâ·Î ÇÑ´Ù. ¸ÕÀú Ãâ·Â °ü·Ã ¸â¹ö º¯¼ö¸¦ ¼±¾ðÇÑ´Ù.

 

class CApiEditHexa : public CApiEditText

{

     ....

protected:

     int bpl;

     BOOL bCapital;

     int nHexSep;

     int bCol,bGap;

 

bplÀº Bytes Per LineÀÇ ¾àÀÚÀ̸ç ÇÑ ÁÙ¿¡ ¸î ¹ÙÀÌÆ®¾¿ Ãâ·ÂÇÒ °ÍÀΰ¡¸¦ ÁöÁ¤ÇÑ´Ù. º¸Åë 8¹ÙÀÌÆ®³ª 16¹ÙÀÌÆ® ´ÜÀ§·Î Ãâ·ÂÇÏ´Â °æ¿ì°¡ ¸¹Áö¸¸ ´õ Á¼°Ô³ª ³Ð°Ô ¼³Á¤ÇÒ ¼öµµ ÀÖ´Ù. bCapitalÀº 16Áø¼ö Ç¥±â¿¡ »ç¿ëµÇ´Â A~F±îÁöÀÇ ¿µ¹®ÀÚ¸¦ ´ë¹®ÀÚ·Î º¸¿©ÁÙ °ÍÀΰ¡¸¦ ÁöÁ¤ÇÑ´Ù. nHexSepÀº ¹ÙÀÌÆ® »çÀÌÀÇ ±¸ºÐ¼±À» ¸î ¹ÙÀÌÆ® ´ÜÀ§·Î »ðÀÔÇÒ °ÍÀΰ¡¸¦ ÁöÁ¤Çϴµ¥ Çí»ç ºä´Â ºñ½ÁÇØ º¸ÀÌ´Â ¹ÙÀÌÆ®µéÀÌ °¡·Î·Î Á× ¿¬¼Ó Ãâ·ÂµÇ¾î ÀÖ¾î ¹øÁö¸¦ ÆľÇÇϱ⠽±Áö ¾ÊÀ¸¹Ç·Î Áß°£ Áß°£¿¡ ÀÏÁ¤ ¹è¼ö ´ÜÀ§·Î ±¸ºÐ¼±À» ±ß´Â °ÍÀÌ ÁÁ´Ù. OnCreate¿¡¼­ ÀÌ ¼¼ ¸â¹ö¸¦ ´ÙÀ½°ú °°ÀÌ ÃʱâÈ­ÇÑ´Ù.

 

BOOL CApiEditHexa::OnCreate(HWND hWnd, LPCREATESTRUCT lpCreateStruct)

{

    bpl=16;

    bCapital=TRUE;

    nHexSep=4;

     xMax=0;

     return CApiEditText::OnCreate(hWnd,lpCreateStruct);

}

 

ÁÙ ´ç 16¹ÙÀÌÆ®¾¿ ´ë¹®ÀÚ·Î Ãâ·ÂÇÏ¸ç ¸Å 4¹ÙÀÌÆ®¸¶´Ù ±¸ºÐ¼±À» ³Öµµ·Ï ÃʱâÈ­Çß´Ù. bpl°ªÀº SetFont¿¡¼­ »ç¿ëÇϹǷΠInitView¿¡¼­ ÃʱâÈ­ÇÏ¸é ´ÊÀ¸¹Ç·Î °´Ã¼°¡ »ý¼ºµÉ ¶§ ÃʱâÈ­ÇÑ´Ù. bColÀº ¼±µÎ·ÎºÎÅÍÀÇ ÁÖ¼Ò¸¦ ÀǹÌÇÏ´Â ¿ÀÇÁ¼Â°ªÀÌ Ãâ·ÂµÉ ¿µ¿ªÀ̸ç bGapÀº °¢ ¹ÙÀÌÆ®ÀÇ Ãâ·ÂÆøÀÌ´Ù.

 

void CApiEditHexa::SetFont(LOGFONT *alogfont)

{

     CApiEditText::SetFont(alogfont);

    bCol=FontWidth*12;

    bGap=FontWidth*4;

     if (xMax!=0) {

          UpdateScrollInfo();

          SetCaret();

          Invalidate(-1);

     }

}

 

ÁÖ¼Ò ¿µ¿ªÀº 12¹®ÀÚ ÆøÀ» °¡Áö¸ç °¢ ¹ÙÀÌÆ®´Â 4¹®ÀÚ ÆøÀ¸·Î ÃʱâÈ­Çß´Ù. bplÀÌ °áÁ¤µÇ¸é ¹®¼­ÀÇ Àüü ±æÀ̸¦ ½±°Ô ±¸ÇÒ ¼ö ÀÖ´Ù.

 

int CApiEditHexa::GetRowCount()

{

     return (pFrame->doclen)/bpl+1;

}

 

ÅؽºÆ®´Â Á¤·ÄÇØ ºÁ¾ß ÁÙ ¼ö¸¦ ¾Ë ¼ö ÀÖÁö¸¸ Çí»ç ºä´Â ÁÙ´ç Ãâ·ÂµÇ´Â ¹ÙÀÌÆ® ¼ö°¡ ÀÏÁ¤Çϱ⠶§¹®¿¡ °£´ÜÇÑ ³ª´°¼ÀÀ¸·Î ÁÙ ¼ö¸¦ Á¶»çÇÒ ¼ö ÀÖ´Ù. ¹®¼­ ±æÀ̸¦ bpl·Î ³ª´©¸é ¸¶Áö¸· ÁÙ ¹øÈ£°¡ Á¶»çµÇ¸ç ¿©±â¿¡ 1À» ´õÇϸé ÃÑ ÁÙ ¼ö°¡ µÈ´Ù. ¹®¼­ ±æÀÌ°¡ bpl·Î ³ª´©¾î ¶³¾îÁú ¶§´Â ½ÇÁ¦ ¹®¼­ ±æÀ̺¸´Ù ÇÑ ÁÙ ´õ ´Ã¾î³ª´Âµ¥ ÀÌ´Â doclen±îÁöµµ ¹®¼­ÀÇ ÀϺηΠº¸±â ¶§¹®ÀÌ´Ù. doclenÀÌ Ãâ·ÂµÇÁö ¾Ê°Å³ª ij·µÀÌ ÀÌ À§Ä¡·Î °¡Áö ¾ÊÀ¸¸é µÚÂÊ¿¡ »õ·Î¿î ¹ÙÀÌÆ®¸¦ Ãß°¡ÇÒ ¼ö°¡ ¾ø´Ù.

bplÀÌ 16ÀÌ°í doclenÀÌ 16ÀÏ ¶§ ÃÑ ÁÙ ¼ö´Â 1ÀÌ ¾Æ´Ï¶ó 2°¡ µÇ¾î¾ß ÇÑ´Ù. À߸ø »ý°¢Çϸé (pFrame->doclen-1)/bpl+1 ÀÌ·¸°Ô »ý°¢ÇÒ ¼öµµ Àִµ¥ ¸¸¾à ÀÌ·¸°Ô µÈ´Ù¸é ºó ¹®¼­´Â 0ÁÙ·Î °è»êµÇ¾î ÀÔ·ÂÇÒ ¼ö ¾øÀ» °ÍÀÌ´Ù. 16Áø Ãâ·ÂÀÇ ÇÙ½É ÇÔ¼ö´Â DrawLineÀε¥ »ó½ÄÀûÀÎ Ãâ·Â ÄÚµåÀ̱â´Â ÇÏÁö¸¸ ±æÀÌ°¡ Á» ±æ±â ¶§¹®¿¡ ´Ù¼Ò »ó¼¼ÇÏ°Ô ºÐ¼®ÇÒ ÇÊ¿ä°¡ ÀÖ´Ù.

 

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

{

     int x;

     int nPos;

     TCHAR szText[1024];

     int i;

     SIZE sz;

     HPEN hPen,OldPen;

 

     // Ãâ·Â À§Ä¡ °è»ê. ¹®¼­ ³¡À» ÃÊ°úÇÏ¸é ¸®ÅÏ

     nPos=Line*bpl;

     if (nPos > pFrame->doclen) {

          return 0;

     }

 

     // ±¸ºÐ¼± Ãâ·Â¿¡ »ç¿ëÇÒ ºê·¯½Ã »ý¼º ¹× ÅؽºÆ® »ö»ó ÁöÁ¤

     hPen=CreatePen(PS_SOLID,FontWidth/8+1,RGB(128,128,128));

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

     SetTextColor(hdc,pFrame->cFore);

     SetBkColor(hdc,pFrame->cBack);

 

     x=MarginWidth-xPos;

 

     // ¿ÀÇÁ¼Â Ãâ·Â

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

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

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

     x+=bCol;

 

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

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

          if (i < pFrame->doclen) {

              wsprintf(szText,"%.2X",(BYTE)pFrame->buf[i]);

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

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

              // ±¸ºÐ¼± Ãâ·Â. ´Ü ù ¹ÙÀÌÆ®´Â Á¦¿Ü

              if (i != nPos && nHexSep && (i-nPos) % nHexSep == 0) {

                   MoveToEx(hdc,x-FontWidth,0,NULL);

                   LineTo(hdc,x-FontWidth,LineHeight);

              }

          }

          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]='.';

                   }

              }

          }

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

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

          x+=sz.cx;

     }

 

     DeleteObject(SelectObject(hdc,OldPen));

     return 1;

}

 

nPos´Â Ãâ·ÂÀ» ½ÃÀÛÇÒ ¿ÀÇÁ¼ÂÀε¥ ÁÙ ¼ö¿¡ bpl¸¸ °öÇÏ¸é °£´ÜÇÏ°Ô ±¸ÇÒ ¼ö ÀÖ´Ù. bplÀÌ 16ÀÏ ¶§ 0¹ø° ÁÙÀº 0, 1¹ø° ÁÙÀº 16ºÎÅÍ Ãâ·ÂÇÏ¸é µÈ´Ù. ù ¹ø° if¹®Àº Ãâ·ÂÀ» ½ÃÀÛÇÒ ¿ÀÇÁ¼Â nPos°¡ ¹®¼­ ±æÀÌÀÎ doclenº¸´Ù ´õ Å©¸é ÀÌ ÁÙÀº ¾ø´Â ÁÙÀ̹ǷΠ¹®¼­ ³¡À̶ó´Â ÀǹÌÀÇ 0À» ¸®ÅÏÇÑ´Ù. À̶§ ºñ±³ÇÏ´Â ºÎµîÈ£°¡ >=°¡ ¾Æ´Ï·Î >ÀÓÀ» ÁÖÀÇÇÏÀÚ. doclen À§Ä¡¸¦ Ãâ·ÂÇÒ ¶§´Â ºñ·Ï °ªÀ» °¡ÁöÁö ¾ÊÁö¸¸ ¹øÁö´Â Ãâ·ÂÇØ¾ß ÇÑ´Ù. ±×·¡¾ß ¹®¼­ ³¡À¸·Î Á¦´ë·Î À̵¿ÇÒ ¼ö ÀÖ´Ù.

Ãâ·Â ½ÃÀÛ ¿ÀÇÁ¼ÂÀ» °è»êÇÑ ÈÄ Ãâ·Â Áغñ¸¦ ÇÑ´Ù. ±¸ºÐ¼± Ãâ·Â¿¡ »ç¿ëÇÒ ÆæÀ» »ý¼ºÇϴµ¥ ±¸ºÐ¼±ÀÌ ³Ê¹« ¶Ç·ÇÇÏ°Ô º¸ÀÌ´Â °ÍÀº ÁÁÁö ¾ÊÀ¸¹Ç·Î ¿¶Àº ȸ»ö ÆæÀ» »ç¿ëÇϱâ·Î ÇÑ´Ù. ÆæÀÇ ±½±â´Â ±Û²ÃÀÇ Æø°ú ºñ·ÊÇϴµ¥ ±Û²ÃÀÌ Ä¿Áö¸é Ææµµ °°ÀÌ Ä¿Áø´Ù. ÇÁ·¹ÀÓÀÇ Àü°æ, ¹è°æ»ö ¼³Á¤¿¡ µû¶ó DC¿¡ »ö»óÀ» ¼±ÅÃÇÑ´Ù. ÅؽºÆ® ºä¿¡¼­¿Í ¸¶Âù°¡Áö·Î Ãâ·Â ½ÃÀÛ À§Ä¡x´Â ¸¶ÁøÆø¿¡¼­ ¼öÆò ½ºÅ©·ÑµÈ ¾çÀ» »« ¸¸Å­ÀÌ´Ù.

ÀÌ À§Ä¡¿¡ ¹®ÀÚ ¿ÀÇÁ¼Â°ªÀ» 16Áø¼ö·Î Á¶¸³ÇÏ¿© Ãâ·ÂÇϸç Ãâ·Â ÈÄ¿¡ bCol¸¸Å­ Àû´çÈ÷ ÀÚ¸®¸¦ ¶ç¿ö ÁÖ¼Ò¿Í µ¥ÀÌÅ͸¦ ±¸ºÐÇÑ´Ù. ¹®ÀÚ¿­Àº ÀÏ´Ü ´ë¹®ÀÚ·Î Á¶¸³Ç쵂 bCapital ¿É¼ÇÀÌ ¼±ÅõǾî ÀÖÁö ¾ÊÀ¸¸é ¼Ò¹®ÀÚ·Î º¯È¯ÇÑ´Ù. ¹Ý´ë·Î ÀÏ´Ü ¼Ò¹®ÀÚ·Î Á¶¸³ÇÑ ÈÄ ´ë¹®ÀÚ·Î º¯È¯ÇÏ´Â °Íµµ °¡´ÉÇÏÁö¸¸ bCapitalÀÇ µðÆúÆ®°ªÀÌ TRUEÀÌ°í Çí»ç ´ýÇÁ´Â º¸ÆíÀûÀ¸·Î ´ë¹®ÀÚ¸¦ ¸¹ÀÌ »ç¿ëÇϹǷΠ°¡±ÞÀûÀÌ¸é ´ë¹®ÀÚ·Î Á¶¸³ÇÏ´Â °ÍÀÌ À¯¸®ÇÏ´Ù.

¹®ÀÚ À§Ä¡¿¡¼­ Á¶±Ý ¶ç¿î ÈÄ for ·çÇÁ¸¦ µ¹¸ç nPos¿¡¼­ bpl¹ÙÀÌÆ®¸¸Å­ Ãâ·ÂÇϴµ¥ ¼³»ç ÁÙ Áß°£¿¡ ¹®¼­ ³¡À» ¸¸³ª´õ¶óµµ ÀÌ ·çÇÁ´Â °è¼Ó ÁøÇàÇØ¾ß ÇÑ´Ù. ¿Ö³ÄÇϸé 16Áø°ªÀ» ´Ù Ãâ·ÂÇÑ ÈÄ¿¡ ´ëÀÀµÇ´Â ¹®ÀÚ¸¦ Ãâ·ÂÇØ¾ß Çϴµ¥ À̸¦ À§Çؼ­´Â x°¡ °è¼Ó À̵¿ÇØ¾ß Çϱ⠶§¹®ÀÌ´Ù. ±×·¡¼­ ·çÇÁ´Â °è¼Ó µ¹°í ·çÇÁ³»¿¡¼­ ¹®¼­ÀÇ ¾ÈÂÊÀÏ ¶§¸¸ 16Áø°ªÀ» Ãâ·ÂÇß´Ù. buf°¡ TCHAR *ÇüÀ̱⠶§¹®¿¡ ÀÌ °ªÀ» 16Áø¼ö·Î ¹Ù²Ü ¶§´Â ¹Ýµå½Ã BYTE·Î ij½ºÆÃÇؼ­ ºÎÈ£¾ø´Â Á¤¼ö·Î ¸¸µç ÈÄ º¯È¯ÇØ¾ß ÇÑ´Ù.

¹ÙÀÌÆ® Ãâ·Â ÈÄ¿¡ ´ëÀÀµÇ´Â ¹®ÀÚ¸¦ Ãâ·ÂÇϴµ¥ ¸¶Âù°¡Áö ¹æ¹ýÀ¸·Î ·çÇÁ¸¦ µ¹µÇ ¹®¼­ ³¡À» ¸¸³ª¸é Áï½Ã Áß´ÜÇÑ´Ù. 2¹ÙÀÌÆ®ÀÇ ÇѱÛÀº ±×³É Ãâ·ÂÇÏ¸é µÇ°í 1¹ÙÀÌÆ® ¹®ÀÚ´Â Àμ⠰¡´ÉÇÑ ¹®ÀÚ¸¸ Ãâ·ÂÇØ¾ß ÇÑ´Ù. ¿£Åͳª °³ÇàÄÚµå µûÀ§´Â ¹®ÀÚ°¡ ¾Æ´Ï¹Ç·Î Ãâ·ÂÇÒ ÇÊ¿ä°¡ ¾øÀ¸¹Ç·Î ´ë½Å Á¡À» Ãâ·ÂÇß´Ù. 2¹ÙÀÌÆ® ¹®ÀÚµµ Ãâ·ÂµÉ ¼ö ÀÖÀ¸¹Ç·Î ´ëÀÀµÇ´Â ¹®ÀÚ Ã³¸®°¡ Á¶±Ý º¹ÀâÇÏ´Ù. ÁÙ ³¡¿¡ °É¸° DBCS ¹®ÀÚ´Â ÀÌ ÁÙ¿¡ Æ÷ÇÔµÇÁö ¾Ê´õ¶óµµ °°ÀÌ Ãâ·ÂÇÏ´Â °ÍÀÌ ´õ ÁÁ´Ù. ÇÑ±Û 2¹ÙÀÌÆ®°¡ ÁÙ ³¡¿¡ °É¸° °æ¿ì µÞÁÙ ³¡¿¡´Ù Ãâ·ÂÇÏ¿© ÀÐÀ» ¼ö ÀÖ°Ô ÇÏ´Â °ÍÀÌ´Ù. ¹®Á¦´Â ù ¹ø° ¹®ÀÚ Ã³¸®Àε¥ ÀÌ °æ¿ì´Â ¾ÕÁÙ ³¡¿¡ ÀÌ¹Ì ¹®ÀÚ¸¦ Ãâ·ÂÇßÀ¸¹Ç·Î Á¡À¸·Î Ãâ·ÂÇÑ´Ù.

Çí»ç ºäÀÇ °¢ ¹ÙÀÌÆ®µéÀº ÀÏÁ¤ÇÑ °£°ÝÀ¸·Î ¶³¾îÁ® ÀÖÀ¸¹Ç·Î Áß°£ Áß°£¿¡ ÅÇÀ» ³Ö°í ÅÇÀÇ À§Ä¡¸¦ Àû´çÈ÷ Á¶Á¤ÇÑ ÈÄ TabbedTextOutÀ̶ó´Â ÇÔ¼ö¸¦ ¾µ ¼öµµ ÀÖÀ» °Í °°´Ù. ±×·¯³ª ÀÌ ÇÔ¼ö´Â ¹®¼­°¡ ¿ÞÂÊÀ¸·Î ½ºÅ©·ÑµÇ¾î ÀÖÀ» ¶§ À½¼ö ÅÇÀ» ÀνÄÇÏÁö ¸øÇϹǷΠ¹®Á¦°¡ ÀÖ´Ù. ±×·¡¼­ ¸Å ¹ÙÀÌÆ® ´ÜÀ§·Î Ãâ·ÂÇÏ°í ´ëÀÀµÇ´Â ¹®ÀÚµµ ¹®ÀÚ ´ÜÀ§·Î Ãâ·ÂÇß´Ù. ½ÇÇàÇØ º¸ÀÚ.

¾ÆÁ÷ ¸¶ÁøÀÌ Á¦´ë·Î Ãâ·ÂµÇÁö ¾ÊÁö¸¸ 16Áø ´ýÇÁ´Â Á¦´ë·Î Ãâ·ÂµÇ¸ç ¿À¸¥ÂÊÀÇ ¹®ÀÚ¶õ¿¡ Çѱ۵µ Àß º¸ÀδÙ. ¹ÌÁ¦ ÆíÁý±â´Â ÇѱÛÀ» Á¦´ë·Î ó¸®ÇÏÁö ¾ÊÁö¸¸ ´ç±ÙÀº ±¹»ê ÇÁ·Î±×·¥À̹ǷΠƯÈ÷ ÇѱÛÀÌ Àß º¸À̵µ·Ï ó¸®Çß´Ù. Çí»ç ´ýÇÁÀÇ 4¹ÙÀÌÆ® ´ÜÀ§·Î ¼¼·Î ±¸ºÐ¼±ÀÌ ±×¾îÁ® ÀÖ¾î ¹ÙÀÌÆ®ÀÇ À§Ä¡¸¦ ÆľÇÇϱⰡ ½±´Ù. ±¸ºÐ¼±À» »ðÀÔÇÏ´Â ´ë½Å ¹ÙÀÌÆ® »çÀÌ¿¡ ¿©¹éÀ» »ðÀÔÇÏ´Â ¹æ¹ýÀ» ¾µ ¼öµµ ÀÖ´Ù. ±×·¯³ª ¿©¹éÀÌ µé¾î°¡¸é ±¸ºÐ¼± ij·µÀÇ À§Ä¡¸¦ °è»êÇÏ´Â ¹æ½ÄÀÌ ¿µÇâÀ» ¹Þ°í ¿©¹é¿¡µµ ¼±Åà ºí·ÏÀ» Ãâ·ÂÇØ¾ß ÇÏ¸ç ¿©·¯ °¡Áö·Î º¹ÀâÇÑ ¹®Á¦µéÀÌ ¸¹ÀÌ »ý±ä´Ù.

Çí»ç ºä¿¡¼­ ÅؽºÆ® ºäÀÇ OnPaint¸¦ ±×´ë·Î È£ÃâÇÔ¿¡µµ ÀÌ·¸µí Ãâ·Â ¸ð¾çÀÌ ´Ù¸¦ ¼ö ÀÖ´Â ÀÌÀ¯´Â OnPaint°¡ È£ÃâÇÏ´Â DrawLine ÇÔ¼ö°¡ °¡»ó ÇÔ¼ö·Î ¼±¾ðµÇ¾î Àֱ⠶§¹®ÀÌ´Ù. °¢ ÁÙÀ» Ãâ·ÂÇÏ´Â ¼ø¼­³ª ´õºí ¹öÆÛ¸µÀ» ÇÏ´Â ¹æ¹ýµîÀÌ µ¿ÀÏÇÏ¸ç °¢ ÁÙÀ» Ãâ·ÂÇÏ´Â DrawLine ÇÔ¼ö¸¸ ´Ù¸¥ °ÍÀÌ´Ù. ÀÌó·³ ÇÔ¼ö°¡ È£ÃâÇÏ´Â ¶Ç ´Ù¸¥ ÇÔ¼ö°¡ °´Ã¼ÀÇ Å¸ÀÔ¿¡ µû¶ó ´Þ¶óÁú ¼ö ÀÖ´Â °ÍÀ» °´Ã¼ ÁöÇâ ¿ë¾î·Î ´ÙÇü¼º(Polymorphism)À̶ó°í ÇÑ´Ù. ¸¸¾à ÀÌ ±â´ÉÀÌ ¾ø´Ù¸é Çí»çºäµµ OnPaint¸¦ ÀÏÀÏÀÌ ÀÛ¼ºÇØ¾ß ÇÒ °ÍÀÌ´Ù. OOPÀÇ À§·ÂÀ» ½Ç°¨ÇÒ ¼ö ÀÖ´Â ¼ø°£ÀÌ´Ù.

¾ÆÁ÷ ÆíÁýÀº µÇÁö ¾ÊÁö¸¸ 2ºÐÇÒ »óÅ¿¡¼­ ÇÑÂÊÀº ÅؽºÆ® ºä, ÇÑÂÊÀº Çí»ç ºä·Î ÀÛ¾÷ÇÒ ¼öµµ ÀÖ´Ù. À̶§ ÅؽºÆ® ºä¿¡¼­ ÆíÁýÇϸé Çí»ç ºä¿¡µµ º¯È­°¡ ¹Ý¿µµÇ¾î¾ß Çϳª ¾ÆÁ÷ Á¦´ë·Î °»½ÅµÇÁö ¾Ê´Â´Ù. ¿Ö³ÄÇϸé Invalidate¿¡¼­ ¹«È¿ ¿µ¿ª °è»êÀ» À§ÇØ È£ÃâÇÏ´Â GetXYFromOff µîÀÇ ÇÔ¼öµéÀÌ Á¦´ë·Î ÀÛ¼ºµÇ¾î ÀÖÁö ¾Ê±â ¶§¹®ÀÌ´Ù.

³ª.ij·µ

ij·µ À̵¿À̳ª ¼±Åà °ü¸®¸¦ À§ÇØ Çí»ç ºä¿¡µµ À¯Æ¿¸®Æ¼ ÇÔ¼ö¸¦ ÀÛ¼ºÇÑ´Ù. ÅؽºÆ® ºä¿Í ÀÎÅÍÆäÀ̽º´Â °°Áö¸¸ °è»ê ¹æ½ÄÀÌ ¿ÏÀüÈ÷ ´Ù¸£´Ù. ÁÙ´ç Ãâ·ÂµÇ´Â ±æÀÌ°¡ ÀÏÁ¤ÇÏ°í Á¤·Ä Á¤º¸°¡ ¾ø±â ¶§¹®¿¡ ¿ÀÈ÷·Á ´õ °£´ÜÇÏ´Ù. ¿øÇüÀÌ ÀÌ¹Ì ¼±¾ðµÇ¾î ÀÖ°í CPP ÆÄÀÏ¿¡µµ ÇÔ¼öµéÀÌ ÀÛ¼ºµÇ¾î ÀÖÀ¸¹Ç·Î ÄÚµå ³»¿ë¸¸ ä¿ö ³ÖÀ¸¸é µÈ´Ù.

 

void CApiEditHexa::GetRCFromOff(int nPos,int &r,int &c)

{

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

     r=nPos / bpl;

     c=nPos % bpl;

}

 

int CApiEditHexa::GetOffFromRC(int r,int c)

{

     int toff;

 

     assert(r >= 0 && r <= GetRowCount());

     toff=r*bpl+c;

     toff=min(toff,pFrame->doclen);

     return toff;

}

 

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

{

     int r,c;

 

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

     GetRCFromOff(nPos,r,c);

     y=r*LineHeight;

     x=c*bGap+bCol+MarginWidth;

}

 

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

{

     int r,c;

 

     x-=MarginWidth;

     x=max(x,bCol);

     y=max(y,0);

 

     r=y/LineHeight;

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

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

     c=min(c,bpl-1);

 

     return GetOffFromRC(r,c);

}

 

µð¹ö±ëÀ» À§ÇÑ assert ¹®ÀÌ ÀÖ±â´Â ÇÏÁö¸¸ ÅؽºÆ® ºä¿¡¼­¿Í ¸¶Âù°¡Áö·Î nPosÀÇ À¯È¿¼ºÀº Á¡°ËÇÏÁö ¾ÊÀ¸¹Ç·Î È£ÃâÇÏ´Â ÂÊ¿¡¼­ Á¤È®ÇÑ ¿ÀÇÁ¼ÂÀ» ÁÖ¾î¾ß ÇÑ´Ù. RC·ÎºÎÅÍ ¿ÀÇÁ¼ÂÀ» Á¶»çÇÒ ¶§´Â ¹®¼­ ¹üÀ§³»¿¡ ÀÖµµ·Ï Á¶Á¤Çϴµ¥ doclen-1ÀÌ ¹®¼­ÀÇ ³¡ÀÌÁö¸¸ ³¡¿¡¼­ »ðÀÔÀÌ °¡´ÉÇϱâ À§Çؼ­´Â doclen±îÁö À̵¿ÇÒ ¼ö ÀÖ¾î¾ß ÇÑ´Ù.

GetOffFromXY ÇÔ¼ö´Â Á¶±Ý º¹ÀâÇÏ´Ù. x´Â bCol ÀÌ»óÀ̾î¾ß Çϴµ¥ ¿ÀÇÁ¼Â ¿µ¿ªÀº ÁÖ¼Ò¸¦ Ç¥½ÃÇϱâ À§ÇÑ ¹®ÀÚ¿­ÀÏ »ÓÀ̹ǷΠÀÌ ¿µ¿ªÀÇ Ä÷³ ¹øÈ£´Â 0À¸·Î °è»êÇØ¾ß ÇÑ´Ù. bColÀÌ ¸¶ÁøÀ» °í·ÁÇÏÁö ¾ÊÀº °ªÀ̹ǷΠx¿¡¼­ ¸¶ÁøÀº ÀÏ´Ü Á¦¿ÜÇß´Ù. ¿­ ¹øÈ£¸¦ ±¸ÇÒ ¶§ xÁÂÇ¥¿¡ FontWidth¸¦ ´õÇÏ´Â ÀÌÀ¯´Â ¹ÙÀÌÆ®ÀÇ ¾à°£ ¿ÞÂÊÀ» ÂïÀ» ¶§ ÀÌ ¿ÀÇÁ¼ÂÀ» ¼±ÅÃÇϱâ À§Çؼ­ÀÌ´Ù.

ÀÌÁ¦ 2ºÐÇÒ »óÅ¿¡¼­ ÅؽºÆ® ºäÀÇ ÆíÁý µ¿ÀÛÀÌ Çí»ç ºä¿¡ Áï½Ã ¹Ý¿µµÉ °ÍÀÌ´Ù. ÇÁ·¹ÀÓÀÇ UpdateViews°¡ ¸ðµç ºäÀÇ ¹«È¿ ¿µ¿ªÀ» ¼³Á¤Çϴµ¥ À̶§ È£ÃâµÇ´Â Invalidate°¡ ÀÌ À¯Æ¿¸®Æ¼ ÇÔ¼öµéÀ» È£ÃâÇÏ¿© °»½ÅÇØ¾ß ÇÒ ¿µ¿ªÀ» Á¤È®ÇÏ°Ô ¼³Á¤ÇÒ ¼ö ÀÖ°Ô µÇ¾ú´Ù. Çí»ç ºäÀÇ Ä³·µÀº Ãâ·ÂµÈ 16Áø¼öÀÇ Æø¸¸Å­À̾î¾ß ÇÑ´Ù. 11Àº Á¶±Ý Á¼°Ô ³ªÅ¸³¯ °ÍÀÌ°í BB³ª 88Àº Á» µÎ²¨¿î ij·µÀ» ½á¾ß ÇÒ °ÍÀÌ´Ù. ÁÖ¾îÁø ¹ÙÀÌÆ®¸¦ 16Áø¼ö·Î ¹Ù²åÀ» ¶§ÀÇ ÆøÀ» °è»êÇÏ´Â »õ·Î¿î ÇÔ¼ö¸¦ Ãß°¡ÇÑ´Ù.

 

int CApiEditHexa::GetDigitWidth(int nPos)

{

     TCHAR szDigit[3];

 

     wsprintf(szDigit,"%.2X",(BYTE)pFrame->buf[nPos]);

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

     return GetCharWidth(szDigit,1)+GetCharWidth(szDigit+1,1);

}

 

Àμö·Î ÁÖ¾îÁø nPosÀ§Ä¡ÀÇ °ªÀ» 16Áø ¹®ÀÚ¿­·Î ¹Ù²Û ÈÄ ÀÌ ¹®ÀÚ¿­ÀÇ ÆøÀ» °è»êÇÏ¿© ¸®ÅÏÇß´Ù. ¹°·Ð ´ë¼Ò¹®ÀÚ ¿É¼ÇÀ» Àû¿ëÇÏ¿© ¹®ÀÚ¿­À» Á¶¸³ÇØ¾ß ÇÑ´Ù. »óÇÏÀ§ ´Ïºí ¹®ÀÚÆøÀ» ´õÇؼ­ ¸®ÅÏÇÑ´Ù. »õ·Î¿î ¸â¹ö ÇÔ¼ö¸¦ Ãß°¡ÇßÀ¸¸é Çì´õ ÆÄÀÏ¿¡ ¿øÇüµµ ´ç¿¬È÷ ¼±¾ðÇØ¾ß ÇÑ´Ù.

 

class CApiEditHexa : public CApiEditText

{

     ....

     int GetDigitWidth(int nPos);

};

 

ÀÌ ÇÔ¼ö´Â ±âº» ºä¿¡´Â ¾øÀ¸¸ç Çí»ç ºä¿¡¼­¸¸ »ç¿ëÇÏ´Â Àü¿ë ÇÔ¼öÀ̹ǷΠ°¡»ó ÇÔ¼ö·Î ¸¸µé ÇÊ¿ä´Â ¾øÀ¸¸ç »ç½Ç ¿ÜºÎ¿¡¼­ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÏÁö ¾ÊÀ¸¹Ç·Î publicÀÏ ÇÊ¿äµµ ¾ø´Ù. SetCaret ÇÔ¼ö´Â ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÑ´Ù.

 

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

{

     int x,y;

     int caretwidth;

     RECT crt;

     BOOL bScroll=FALSE;

     int ty;

 

     // µ¤¾î¾²±â ¸ðµåÀÏ ¶§´Â ±ÛÀÚ Àüü¸¦ °¨½Ñ´Ù.

     if (bOvr==FALSE) {

          caretwidth=pFrame->CaretWidth;

     } else {

          caretwidth=GetDigitWidth(off);

     }

     CreateCaret(hWnd,NULL,caretwidth,FontHeight);

     if (GetFocus()==hWnd) {

          ShowCaret(hWnd);

     }

     GetXYFromOff(off,x,y);

     GetClientRect(hWnd,&crt);

 

     // ÀÚµ¿ ½ºÅ©·Ñ ó¸®.

     if (bScrollToCaret && crt.right) {

          pFrame->SendNotify(AEN_MOVE);

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

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

              bScroll=TRUE;

          }

 

          if (y < yPos) {

              yPos=y;

              bScroll=TRUE;

          }

 

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

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

              yPos=y-ty;

              bScroll=TRUE;

          }

 

          if (bScroll == TRUE) {

              if (IsWindowEnabled(hHorzScroll)) {

                   SetScrollPos(hHorzScroll, SB_CTL, xPos, TRUE);

              }

              if (IsWindowEnabled(hVertScroll)) {

                   SetScrollPos(hVertScroll, SB_CTL, yPos, TRUE);

              }

              Invalidate(-1);

          }

     }

 

     SetCaretPos(x-xPos,y-yPos);

}

 

ij·µ À§Ä¡°¡ È­¸é¿¡ º¸ÀÌÁö ¾ÊÀ» °æ¿ì ij·µÀÌ ÀÖ´Â °÷À¸·Î À̵¿ÇÏ´Â ÀÚµ¿ ½ºÅ©·Ñ 󸮱îÁö °°ÀÌ ±¸ÇöÇß´Ù. »ðÀÔ ¸ðµåÀÏ ¶§´Â °¡´Ã°Ô, µ¤¾î¾²±â ¸ðµåÀÏ ¶§´Â ¹ÙÀÌÆ®¸¦ ¸ðµÎ °¨½Î´Â Å©±â·Î ij·µÀ» Ç¥½ÃÇÑ´Ù.

´Ù.ij·µÀÇ À̵¿

Ç¥½ÃÇÑ Ä³·µÀ» À̵¿½ÃÄÑ º¸ÀÚ. ³í¸®´Â ÅؽºÆ® ºä¿¡¼­ÀÇ Ä³·µ À̵¿°ú °ÅÀÇ µ¿ÀÏÇѵ¥ ¼±ÅÃÀ» ÇØÁ¦ÇÏ°í Ŭ¸¯ÇÑ ÁöÁ¡ÀÇ ¿ÀÇÁ¼ÂÀ» ±¸ÇÑ ÈÄ SetCaretÀ» È£ÃâÇÏ¸é µÈ´Ù. »ó´ëÀûÀ¸·Î °£´ÜÇÑ ¸¶¿ì½º À̵¿À» ¸ÕÀú ÀÛ¼ºÇØ º¸ÀÚ. OnLButtonDown¿¡ ´ÙÀ½ Äڵ带 ÀÛ¼ºÇÑ´Ù.

 

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

{

     ....

     bFindSelect=FALSE;

     SetFocus(hWnd);

 

    ClearSelection();

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

    SelStart=SelEnd=off;

    SetCaret();

}

 

´ÙÀ½Àº Å°º¸µå À̵¿À» À§ÇØ OnKey ÇÔ¼ö¸¦ ÀÛ¼ºÇÑ´Ù. CtrlÅ°¿Í ShiftÅ° 󸮱îÁö °°ÀÌ ÀÛ¼ºÇߴµ¥ ÅؽºÆ® ºä¿Í ³í¸®´Â °ÅÀÇ µ¿ÀÏÇ쵂 ÀϺΠŰ´Â CtrlÅ°¿Í Á¶ÇյǴ ±â´ÉÀÌ ¾ø´Ù. ¿¹¸¦ µé¾î ´Ü¾î ´ÜÀ§ À̵¿Àº ´Ü¾îÀÇ °³³äÀÌ ¾ø´Â ºäÀ̹ǷΠó¸®ÇÒ ÇÊ¿ä°¡ ¾ø´Ù.

 

void CApiEditHexa::OnKey(HWND hWnd, UINT vk, BOOL fDown, int cRepeat, UINT flags)

{

     int r,c;

     int oldr;

     BOOL bShift, bControl;

     int OldOff;

 

     bShift=((GetKeyState(VK_SHIFT) & 0x8000) != 0);

     bControl=((GetKeyState(VK_CONTROL) & 0x8000) != 0);

 

     if (fDown==FALSE)

          return;

 

     bFindSelect=FALSE;

 

     switch (vk) {

     case VK_F6:

          pFrame->ChangeActiveView(this,(bShift ? 2:1));

          return;

     case VK_LEFT:

          if (off > 0) {

              OldOff=off;

              off--;

              if (bShift) {

                   ExpandSelection(OldOff,off);

              } else {

                   if (SelStart != SelEnd) {

                        off=min(SelStart, SelEnd);

                   }

              }

              SetCaret();

          }

          if (!bShift) {

              ClearSelection();

          }

          return;

     case VK_RIGHT:

          if (off < pFrame->doclen) {

              OldOff=off;

              off++;

              if (bShift) {

                   ExpandSelection(OldOff,off);

              } else {

                   if (SelStart != SelEnd) {

                        off=max(SelStart, SelEnd);

                   }

              }

              SetCaret();

          }

          if (!bShift) {

              ClearSelection();

          }

          return;

     case VK_UP:

          if (bControl && bShift)

              return;

          GetRCFromOff(off,r,c);

          if (r > 0) {

              if (bControl) {

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

                   if (r != (frt.bottom+yPos)/LineHeight)

                        return;

              }

              OldOff=off;

              r--;

              off=GetOffFromRC(r,c);

              if (bShift) {

                   ExpandSelection(OldOff,off);

              } else {

                   if (SelStart != SelEnd) {

                        off=min(SelStart, SelEnd);

                        ClearSelection();

                        SetCaret();

                        SendMessage(hWnd,WM_KEYDOWN,VK_UP,(LPARAM)0);

                   }

              }

              SetCaret();

          }

          if (!bShift) {

              ClearSelection();

          }

          return;

     case VK_DOWN:

          if (bControl && bShift)

              return;

          GetRCFromOff(off,r,c);

          if (bControl) {

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

              if (r != yPos/LineHeight-1) {

                   return;

              }

          }

          if (r < GetRowCount()-1) {

              OldOff=off;

              r++;

              off=GetOffFromRC(r,c);

              if (bShift) {

                   ExpandSelection(OldOff,off);

              } else {

                   if (SelStart != SelEnd) {

                        off=max(SelStart, SelEnd);

                        ClearSelection();

                        SetCaret();

                        SendMessage(hWnd,WM_KEYDOWN,VK_DOWN,(LPARAM)0);

                   }

              }

              SetCaret();

          }

          if (!bShift) {

              ClearSelection();

          }

          return;

     case VK_PRIOR:

          GetRCFromOff(off,r,c);

          oldr=r;

          r-=frt.bottom/LineHeight;

          r=max(r,0);

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

          yPos=max(yPos,0);

          Invalidate(-1);

          SetScrollPos(hVertScroll, SB_CTL, yPos, TRUE);

 

          OldOff=off;

          off=GetOffFromRC(r,c);

          if (bShift) {

              ExpandSelection(OldOff,off);

          } else {

              ClearSelection();

          }

          SetCaret(FALSE);

          return;

     case VK_NEXT:

          GetRCFromOff(off,r,c);

          oldr=r;

          r+=frt.bottom/LineHeight;

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

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

          yPos=max(0,min(yPos,yMax-(frt.bottom/LineHeight)*LineHeight));

          Invalidate(-1);

          SetScrollPos(hVertScroll, SB_CTL, yPos, TRUE);

 

          OldOff=off;

          off=GetOffFromRC(r,c);

          if (bShift) {

              ExpandSelection(OldOff,off);

          } else {

              ClearSelection();

          }

          SetCaret();

          return;

     case VK_HOME:

          GetRCFromOff(off,r,c);

          OldOff=off;

          if (bControl) {

              off=0;

          } else {

              off=GetOffFromRC(r,0);

          }

          if (bShift) {

              ExpandSelection(OldOff,off);

          } else {

              ClearSelection();

          }

          SetCaret();

          return;

     case VK_END:

          GetRCFromOff(off,r,c);

          OldOff=off;

          if (bControl) {

              off=pFrame->doclen;

          } else {

              off=GetOffFromRC(r,bpl-1);

          }

          if (bShift) {

              ExpandSelection(OldOff,off);

          } else {

              ClearSelection();

          }

          SetCaret();

          return;

     }

}

 

bLineEnd, PrevX µîÀÇ °³³äÀÌ ºÒÇÊ¿äÇϹǷΠÅؽºÆ® ºä¿¡ ºñÇØ ÈξÀ ´õ °£´ÜÇÏ´Ù. F6Å°·Î ºä°£ÀÇ Æ÷Ä¿½º¸¦ ÀüȯÇÒ ¼ö ÀÖ´Ù. ¿©±â±îÁö ÀÛ¾÷ÇÑ ÈÄ ½ÇÇàÇØ º¸¸é ¸¶¿ì½º³ª Å°º¸µå·Î ij·µÀ» À̵¿ÇÒ ¼ö ÀÖÀ¸¸ç ij·µÀÌ ÀÖ´Â ÂÊÀ¸·Î ½ºÅ©·Ñµµ ÀÚµ¿À¸·Î 󸮵ȴÙ.

¶ó.ÆíÁý

´ÙÀ½Àº 16Áø ÆíÁý ±â´ÉÀ» ÀÛ¼ºÇØ º¸ÀÚ. ÆíÁýÀ» À§ÇØ »ðÀÔ, »èÁ¦ ÇÔ¼öºÎÅÍ ÀÛ¼ºÇÑ´Ù. bLineEnd°°Àº º¹ÀâÇÑ º¯¼öµµ ¾ø°í Á¤·Äµµ ÇÏÁö ¾ÊÀ¸¸ç ºÏ¸¶Å©µµ °ü¸®ÇÏÁö ¾Ê±â ¶§¹®¿¡ Äڵ尡 °£´ÜÇÏ´Ù. ÇÁ·¹ÀÓÀÇ °°Àº ÇÔ¼ö¸¦ È£ÃâÇÏ¿© »ðÀÔ Ã³¸®¸¦ ÇÏ°í ´Ù¸¥ ºä¸¦ °»½ÅÇϱ⸸ ÇÏ¸é µÈ´Ù.

 

void CApiEditHexa::Insert(int nPos, TCHAR *str, int len, BOOL bRec/*=TRUE*/)

{

     if (pFrame->bReadOnly)

          return;

 

     pFrame->Insert(nPos,str,len,bRec);

     UpdateScrollInfo();

     pFrame->UpdateViews(this,nPos,len);

}

 

void CApiEditHexa::Delete(int nPos, int nCount, BOOL bRec/*=TRUE*/)

{

     if (pFrame->bReadOnly)

          return;

 

     if (nCount == 0) return;

     if (pFrame->doclen < nPos+nCount) return;

 

     pFrame->Delete(nPos,nCount,bRec);

     pFrame->UpdateViews(this,nPos,-nCount);

}

 

±ÛÀÚ°¡ »ðÀÔµÇ¸é ¹®¼­·®ÀÌ ´Ã¾î³ª¹Ç·Î ½ºÅ©·Ñ »óÅ´ °»½ÅÇØ¾ß ÇÏ¸ç ºÐÇÒµÈ ÇüÁ¦ºäµµ °ü¸®ÇØ¾ß ÇÑ´Ù. Çí»ç ºä´Â µ¥ÀÌÅ͸¦ »ðÀÔÇÏ´Â °æ¿ìº¸´Ù ±âÁ¸ µ¥ÀÌÅ͸¦ ´Ù¸¥ °ªÀ¸·Î ¼öÁ¤ÇÏ´Â °æ¿ì°¡ ´õ ¸¹À¸¹Ç·Î ±âº»ÀûÀ¸·Î µ¤¾î¾²±â ¸ðµå·Î µ¿ÀÛÇÑ´Ù. Çí»ç ºä¿¡¼­ ÀÔ·ÂÇÒ ¼ö ÀÖ´Â ¹®ÀÚ´Â 0~9, A~F, a~f ¹®ÀÚ·Î ±¹ÇѵǹǷΠÀÔ·Â ÄÚµå´Â OnChar¿¡¸¸ ÀÛ¼ºÇÏ¸é µÈ´Ù. ÇÑ±Û ¸ðµå¿¡¼­´Â Á¦´ë·Î ÆíÁýÇÒ ¼ö ¾øÀ¸¹Ç·Î IME °ü·Ã ¸Þ½ÃÁö´Â ó¸®ÇÏÁö ¾Ê¾Æµµ »ó°ü¾ø´Ù. ÇÑ ¹ÙÀÌÆ®¸¦ ÆíÁýÇϱâ À§Çؼ­´Â µÎ °³ÀÇ ´ÏºíÀ» ÀÔ·ÂÇØ¾ß ÇϹǷΠÁ¶¸³ÁßÀÇ °³³äÀÌ ÇÊ¿äÇÏ´Ù. ÅؽºÆ® ºä¿¡¼­ ÇÑ±Û Á¶¸³ÁßÀÓÀ» ±â¾ïÇÏ´Â bComp º¯¼ö¸¦ ÀÌ·± ¿ëµµ·Î »ç¿ëÇϱâ·Î ÇÑ´Ù. Áï ÀÌ °ªÀÌ TRUEÀÌ¸é »óÀ§ ´Ïºí¸¸ ÇöÀç ÀԷµǾî ÀÖ°í ÇÏÀ§ ´Ïºí ÀÔ·ÂÀ» ±â´Ù¸®°í ÀÖ´Ù´Â ¶æÀÌ´Ù. ´ÙÀ½Àº 12 ¹ÙÀÌÆ®¸¦ 34·Î º¯°æÇÏ´Â °úÁ¤ÀÌ´Ù.

ÇÑ ¹ÙÀÌÆ®¸¦ ÀÔ·ÂÇϱâ À§ÇØ »èÁ¦, »ðÀÔÀÌ µÎ ¹ø¾¿ ¼öÇàµÇ´Âµ¥ ¸ðµÎ ÇÑ ¹ÙÀÌÆ®¸¦ º¯°æÇϱâ À§ÇÑ µ¿ÀÛÀ̹ǷΠÃë¼Ò ·¹ÄÚµå 4°³¸¦ ¸ðµÎ ±×·ìÀ¸·Î ¹­¾î¾ß ÇÑ´Ù. Çí»ç ºä¿¡¼­ ÀÔ·ÂÀ» ¹ÞÀ» ¶§´Â ¹Ýµå½Ã 2°³ÀÇ ´ÏºíÀÌ ¸ðµÎ ÀԷµǾî¾ß ÇÏ´Â °ÍÀº ¾Æ´Ï¸ç Áß°£¿¡ Ãë¼ÒÇÒ ¼öµµ ÀÖ´Ù´Â Á¡ÀÌ ¹®Á¦ÀÌ´Ù. 12¸¦ 3À¸·Î ¹Ù²Ù°í ½Í´Ù°í ÇÒ ¶§ 03À» ÀÔ·ÂÇÏÁö ¾Ê°í 3Çϳª¸¸ ´©¸¥ ÈÄ ´Ù¸¥ °÷À¸·Î À̵¿ÇØ ¹ö¸± ¼öµµ ÀÖ´Ù. ±×·¡¼­ Á¶¸³ÁßÀÎ »óŸ¦ bComp º¯¼ö¿¡ º°µµ·Î ±â¾ï½ÃÄÑ ³õ¾Ò´Ù°¡ Á¶¸³Áß¿¡ À̵¿ÀÏ ¶§ º°µµÀÇ Ã³¸®°¡ ÇÊ¿äÇÏ´Ù. OnChar¿¡ ÀÌ ¸ðµç °úÁ¤À» ÀÛ¼ºÇØ º¸ÀÚ.

 

void CApiEditHexa::OnChar(HWND hWnd, TCHAR ch, int cRepeat)

{

     int Value=-1;

     TCHAR szDigit[1];

 

     if (ch == 1) {

          SendMessage(hWnd,WM_COMMAND,MAKEWPARAM(IDM_AE_SELALL,0),0);

          return;

     }

     if (ch == 3) {

          SendMessage(hWnd,WM_COMMAND,MAKEWPARAM(IDM_AE_COPY,0),0);

          return;

     }

     if (ch == 22) {

          SendMessage(hWnd,WM_COMMAND,MAKEWPARAM(IDM_AE_PASTE,0),0);

          return;

     }

     if (ch == 24) {

          SendMessage(hWnd,WM_COMMAND,MAKEWPARAM(IDM_AE_CUT,0),0);

          return;

     }

 

     if (ch == 25) {

          if (pFrame->CanRedo())

              pFrame->Redo();

          return;

     }

     if (ch == 26) {

          if (pFrame->CanUndo())

              pFrame->Undo();

          return;

     }

 

     // ÀÔ·ÂµÈ ¹®ÀÚ¸¦ ¼ýÀÚ·Î º¯È¯

     if (ch >= '0' && ch <= '9')

          Value=ch-'0';

     if (ch >= 'A' && ch <= 'F')

          Value=ch-'A'+10;

     if (ch >= 'a' && ch <= 'f')

          Value=ch-'a'+10;

 

     // 16Áø ¼ýÀÚ°¡ ¾Æ´Ï¸é ÀÔ·ÂÀ» °ÅºÎÇÑ´Ù.

     if (Value==-1) {

          return;

     }

 

     // Á¶¸³ÁßÀÌ ¾Æ´Ï¸é ÀÔ·ÂµÈ ¼ýÀÚ ±â·Ï

     if (bComp==FALSE) {

          pFrame->StartUndoGroup();

          DeleteSelection();

          szDigit[0]=Value;

          if (bOvr) {

              Delete(off,1);

          }

          Insert(off,szDigit,1);

          bComp=TRUE;

     // »óÀ§ ´ÏºíÀÌ ÀÌ¹Ì ÀԷµǾî ÀÖÀ¸¸é ÇÕÃļ­ ±â·Ï

     } else {

          szDigit[0]=pFrame->buf[off] << 4 | Value;

          Delete(off,1);

          Insert(off,szDigit,1);

          EndComp();

          if (off < pFrame->doclen) {

              off++;

          }

     }

 

     Invalidate(off-1);

     SetCaret();

}

 

ÅؽºÆ® ºä¿¡¼­¿Í ¸¶Âù°¡Áö·Î Ŭ¸³º¸µå¿Í Ãë¼Ò °ü·Ã ´ÜÃàÅ°¸¦ ó¸®Çϴµ¥ È£½ºÆ®ÀÎ ´ç±ÙÀÌ ÀÌ ´ÜÃàÅ°¸¦ ¸ÕÀú ó¸®Çϱ⠶§¹®¿¡ »ç½Ç ²À ó¸®ÇÏÁö ¾Ê¾Æµµ »ó°ü¾ø´Ù. ±×·¯³ª È£½ºÆ®°¡ ¹Ù²î´õ¶óµµ ½º½º·Î ´ÜÃàÅ° 󸮸¦ Çϱâ À§Çؼ­ ÀÏ´ÜÀº ÇÊ¿äÇÏ´Ù. ´ÜÃàÅ°¸¦ ó¸®ÇÑ ÈÄ ÀÔ·ÂµÈ Å°°¡ À¯È¿ÇÑ ÀÔ·ÂÀÎÁö¸¦ Á¡°ËÇϴµ¥ ¾Æ¶óºñ¾Æ ¼ýÀÚ¿Í ¾ËÆĺª A~F±îÁö¸¸ À¯È¿ÇÏ´Ù. ¸¸¾à À¯È¿ÇÏÁö ¸øÇÑ ÀÔ·ÂÀ̶ó¸é ¸®ÅÏÇÏ¿© ÀÔ·ÂÀ» °ÅºÎÇÑ´Ù.

À¯È¿ÇÑ °ªÀ̶ó¸é ÀÔ·ÂµÈ °ªÀ» »ðÀÔÇϴµ¥ Á¶¸³ÁßÀΰ¡ ¾Æ´Ñ°¡¿¡ µû¶ó 󸮰¡ ´Þ¶óÁø´Ù. Á¶¸³ÁßÀÌ ¾Æ´Ï¶ó¸é ÀÌ °ªÀ» ÇÏÀ§ 4ºñÆ®¿¡ Áý¾î ³Ö°í ÇöÀç À§Ä¡ÀÇ °ªÀ» ´ëüÇÑ´Ù. ´ëüÇÏ´Â µ¿ÀÛÀÌ¶óµµ Ãë¼Ò ·¹ÄÚµå °ü¸®¸¦ À§ÇØ ¹Ýµå½Ã Insert, Delete ÇÔ¼ö¸¦ ÅëÇØ¾ß Çϸç ÆíÁý ±×·ìÀ» ½ÃÀÛÇØ¾ß ÇÑ´Ù. Á¶¸³ÁßÀÏ ¶§´Â ÀÌ¹Ì ÀÔ·ÂµÈ 4ºñÆ®¸¦ »óÀ§·Î ¿Ã·Á »óÀ§ ´Ïºí·Î ¸¸µé°í »õ·Î ÀÔ·ÂµÈ ´ÏºíÀ» ORÇÏ¿© ÇÏÀ§ ´Ïºí·Î ¸¸µç ÈÄ °ªÀ» ½á ³Ö´Â´Ù.

³ª¸ÓÁö µÞ 󸮴 EndComp ÇÔ¼ö¿¡°Ô ¸Ã±â°í ¿¬¼ÓÀûÀÎ ÆíÁýÀ» À§ÇØ ´ÙÀ½ ¹ÙÀÌÆ®·Î À̵¿ÇÑ´Ù. ¹«È¿ ¿µ¿ªÀº ÆíÁýÇÑ À§Ä¡ÀÇ ¹Ù·Î ¾ÕÂÊ ¿ÀÇÁ¼ÂÀÌ ¼ÓÇÑÁÙºÎÅÍ ³¡±îÁöÀÌ´Ù. Á¶¸³À» ¸¶¹«¸®ÇÏ´Â EndComp ÇÔ¼ö´Â ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÑ´Ù.

 

void CApiEditHexa::EndComp()

{

     if (bComp) {

          bComp=FALSE;

          pFrame->EndUndoGroup();

     }

}

 

Á¶¸³ÁßÀ̾úÀ¸¸é Á¶¸³Áß Ç÷¡±×¸¦ ¸®¼ÂÇÏ°í ÆíÁý ±×·ìÀ» ³¡³»¸ç Á¶¸³ÁßÀÌ ¾Æ´Ï¾ú´Ù¸é ¾Æ¹« °Íµµ ÇÒ ÇÊ¿ä°¡ ¾ø´Ù. ÀÌ ÇÔ¼ö´Â ÅؽºÆ® ºäÀÇ WM_IME_COMPOSITION/GCS_RESULT ¸Þ½ÃÁöÀÇ ¿ªÇÒÀ» Çϴµ¥ ÀÌ Ã³¸®¸¦ OnChar¿¡¼­ ¹Ù·Î ÇÏÁö ¸øÇÏ´Â ÀÌÀ¯´Â Á¶¸³À» ³¡³»¾ß ÇÒ »óȲÀÌ ¾ÆÁÖ ´Ù¾çÇϱ⠶§¹®ÀÌ´Ù.

 

µÎ ´ÏºíÀ» ¸ðµÎ ÀÔ·ÂÇÑ °æ¿ì : OnChar

Á¶¸³Áß¿¡ ij·µ À̵¿ : OnKey

½ºÅ©·Ñ : OnHScroll, OnVScroll

¸¶¿ì½º Ŭ¸¯ : OnLButtonDown

Æ÷Ä¿½º ÀÑÀ½ : OnKillFocus

±âŸ Á¶¸³À» ÁßÁöÇÒ ¸¸ÇÑ ¸Þ½ÃÁö : OnCommand, OnContextMenu, OnMouseWheel

 

ÀÌ·± ¿©·¯ °¡Áö »çÀ¯¿¡ ÀÇÇØ Á¶¸³À» ÁßÁöÇØ¾ß ÇϹǷΠº°µµÀÇ ÇÔ¼ö·Î Á¶¸³ ³¡ 󸮸¦ ºÐ¸®ÇØ µÎ¾ú´Ù. »ó±â °¢ ÇÔ¼ö¿¡¼­ EndComp¸¦ È£ÃâÇØ¾ß Çϴµ¥ OnChar¿¡¼­´Â ÀÌ¹Ì È£ÃâÇÏ°í ÀÖ´Ù. OnKey¿¡¼­ ij·µÀ» À̵¿ÇÒ ¶§µµ EndComp¸¦ È£ÃâÇÑ´Ù.

 

void CApiEditHexa::OnKey(HWND hWnd, UINT vk, BOOL fDown, int cRepeat, UINT flags)

{

     ....

     if (fDown==FALSE)

          return;

 

     // Á¶¸³À» ³¡³»´Â Å° ÀÔ·Â

     if (vk==VK_LEFT || vk==VK_RIGHT || vk==VK_UP || vk==VK_DOWN ||

          vk==VK_PRIOR || vk==VK_NEXT || vk==VK_HOME || vk==VK_END ||

          vk==VK_INSERT || vk==VK_DELETE) {

          EndComp();

     }

 

°¢ Å°¿¡¼­ EndComp¸¦ È£ÃâÇصµ µÇÁö¸¸ ÄÚµå °ü¸®ÀÇ ÆíÀÇ»ó ¼±µÎ¿¡¼­ È£ÃâÇß´Ù. Á¶¸³Áß¿¡ Æ÷Ä¿½º¸¦ ÀÒÀ» ¶§µµ Á¶¸³À» ³¡³»¾ß ÇϹǷΠOnKillFocus¿¡¼­µµ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù.

 

void CApiEditHexa::OnKillFocus(HWND hWnd, HWND hwndNewFocus)

{

     EndComp();

     CApiEditText::OnKillFocus(hWnd,hwndNewFocus);

}

 

OnHScroll, OnVScroll, OnCommand, OnContextMenu, OnLButtonDown, OnMouseWheel ÀÇ ¼±µÎ¿¡¼­µµ EndComp¸¦ È£ÃâÇÑ´Ù. EndComp´Â Á¶¸³ÁßÀÌ ¾Æ´Ò ¶§´Â ¾Æ¹« µ¿ÀÛµµ ÇÏÁö ¾ÊÀ¸¹Ç·Î º°´Ù¸¥ Á¶°ÇÀ» Á¡°ËÇÒ ÇÊ¿ä¾øÀÌ ¹«Á¶°Ç È£ÃâÇÏ¸é µÈ´Ù. Á¶¸³ÁßÀÏ ¶§´Â ij·µÀÇ ¸ð¾çÀ» Á¶±Ý ¹Ù²Ùµµ·Ï ÇÏÀÚ.

 

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

{

     int x,y;

     int caretwidth;

     RECT crt;

     BOOL bScroll=FALSE;

     int ty;

 

     if (bOvr==FALSE || bComp) {

          caretwidth=pFrame->CaretWidth;

     } else {

          caretwidth=GetDigitWidth(off);

     }

     CreateCaret(hWnd,NULL,caretwidth,FontHeight);

     if (GetFocus()==hWnd) {

          ShowCaret(hWnd);

     }

     GetXYFromOff(off,x,y);

    if (bComp) {

        x+=GetDigitWidth(off);

    }

     GetClientRect(hWnd,&crt);

 

ÀÔ·ÂÁßÀÏ ¶§´Â ij·µÀ» ÆøÀ» °¡´Ã°Ô ¸¸µé°í ÀÔ·ÂµÈ »óÀ§ ´Ïºí µÚÂÊÀ¸·Î º¸³» ÇÑ ´Ïºí ´õ ÀÔ·ÂÀ» ¿ä±¸ÇÑ´Ù. ¿©±â±îÁö ÀÛ¾÷Çϸé Çí»ç ºä¿¡¼­ ¹ÙÀÌÆ®¸¦ ÆíÁýÇÒ ¼ö ÀÖÀ¸¸ç ºÐÇÒµÈ Ã¢¿¡ ´ëÇؼ­µµ Àß °»½ÅµÉ °ÍÀÌ´Ù.

¸¶.¼±ÅÃ

Çí»ç ºäµµ Ŭ¸³º¸µå µ¿ÀÛÀ» À§ÇØ ¼±ÅÃÀ» ó¸®ÇØ¾ß ÇÑ´Ù. Å°º¸µå·Î ¼±ÅÃÀ» ÇÏ´Â ÄÚµå´Â OnKeyDown¿¡ ÀÌ¹Ì ÀÛ¼ºÇØ ³õ¾Ò´Ù. ±×·¯³ª ¾ÆÁ÷ ¼±Åà ¿µ¿ªÀ» Ç¥½ÃÇÏ´Â Äڵ尡 ÀÛ¼ºµÇÁö ¾Ê¾Ò±â ¶§¹®¿¡ ¼±ÅÃÀ» Çصµ ºí·ÏÀÌ º¸ÀÌÁö´Â ¾Ê´Â´Ù. DrawLine¿¡ ¼±Åÿµ¿ªÀ» º¸¿©ÁÖ´Â Äڵ带 ÀÛ¼ºÇÑ´Ù.

 

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

{

     int x;

     int nPos;

     TCHAR szText[1024];

     int i;

     SIZE sz;

     HPEN hPen,OldPen;

    int SelFirst, SelSecond;

    COLORREF OldFore,OldBack;

    RECT srt;

    COLORREF fore,back;

    HBRUSH hSelBack;

 

     // Ãâ·Â À§Ä¡ °è»ê. ¹®¼­ ³¡À» ÃÊ°úÇÏ¸é ¸®ÅÏ

     nPos=Line*bpl;

     if (nPos > pFrame->doclen) {

          return 0;

     }

 

    // ¼±Åà ºí·Ï Ç¥½Ã¿¡ »ç¿ëÇÒ ºê·¯½Ã »ý¼º

    SelFirst=min(SelStart,SelEnd);

    SelSecond=max(SelStart,SelEnd);

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

        fore=pFrame->cSelFore;

        back=pFrame->cSelBack;

    } else {

        fore=RGB(0,0,0);

        back=RGB(192,192,192);

    }

    hSelBack=CreateSolidBrush(back);

 

     // ±¸ºÐ¼± Ãâ·Â¿¡ »ç¿ëÇÒ ºê·¯½Ã »ý¼º ¹× ÅؽºÆ® »ö»ó ÁöÁ¤

     hPen=CreatePen(PS_SOLID,FontWidth/8+1,RGB(128,128,128));

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

     SetTextColor(hdc,pFrame->cFore);

     SetBkColor(hdc,pFrame->cBack);

 

     x=MarginWidth-xPos;

 

     // ¿ÀÇÁ¼Â Ãâ·Â

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

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

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

     x+=bCol;

 

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

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

          if (i < pFrame->doclen) {

              wsprintf(szText,"%.2X",(BYTE)pFrame->buf[i]);

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

 

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

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

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

               OldFore=SetTextColor(hdc,fore);

               OldBack=SetBkColor(hdc,back);

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

               FillRect(hdc,&srt,hSelBack);

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

               SetTextColor(hdc,OldFore);

               SetBkColor(hdc,OldBack);

           } else {

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

           }

             

              // ±¸ºÐ¼± Ãâ·Â. ´Ü ù ¹ÙÀÌÆ®´Â Á¦¿Ü

              if (i != nPos && nHexSep && (i-nPos) % nHexSep == 0) {

                   MoveToEx(hdc,x-FontWidth,0,NULL);

                   LineTo(hdc,x-FontWidth,LineHeight);

              }

          }

          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]='.';

                   }

              }

          }

        // ¹®ÀÚ Ãâ·Â

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

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

           OldFore=SetTextColor(hdc,fore);

           OldBack=SetBkColor(hdc,back);

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

           SetTextColor(hdc,OldFore);

           SetBkColor(hdc,OldBack);

        } else {

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

        }

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

          x+=sz.cx;

     }

 

    DeleteObject(hSelBack);

     DeleteObject(SelectObject(hdc,OldPen));

     return 1;

}

 

¼±Åÿµ¿ª¾È¿¡ ÀÖ´Â ¹ÙÀÌÆ®´Â ¹è°æ»ö°ú Àü°æ»öÀ» ¹Ù²Ù±â¸¸ ÇÏ¸é µÈ´Ù. ÅÇ ¹®ÀÚ¸¦ ó¸®ÇÏÁö ¾ÊÀ¸¸ç ¹®¹ý °­Á¶¸¦ ÇÏÁö ¾ÊÀ¸¹Ç·Î ¼¼±×¸ÕÆ® °³³äÀº ÇÊ¿ä°¡ ¾ø°í DrawSegment ÇÔ¼ö¸¦ È£ÃâÇÒ ÇÊ¿äµµ ¾ø´Ù. Shift+Ä¿¼­ À̵¿Å°·Î ¼±ÅÃÇØ º¸¸é ¼±Åà ºí·ÏÀÌ º¸ÀÏ °ÍÀÌ´Ù. ¸¶¿ì½º·Î ¼±ÅÃÇϱâ´Â ÅؽºÆ® ºä¿Í ³í¸®°¡ µ¿ÀÏÇÏ´Ù. ´Ù¸¸ ¸¶Áø ¾×¼Ç, µå·¡±×, ´õºíŬ¸¯ µîÀ» ó¸®ÇÒ ÇÊ¿ä°¡ ¾øÀ¸¹Ç·Î Äڵ尡 ÈξÀ ´õ °£´ÜÇÏ´Ù.

 

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

{

     RECT crt;

     POINT pt;

    BOOL bShift;

    int toff;

     ....

     bFindSelect=FALSE;

     SetFocus(hWnd);

 

    bShift=((GetKeyState(VK_SHIFT) & 0x8000) != 0);

    if (bShift) {

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

        ExpandSelection(off,toff);

        off=toff;

    } else {

        ClearSelection();

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

        SelStart=SelEnd=off;

    }

 

    SetCapture(hWnd);

    bCapture=TRUE;

     SetCaret();

}

 

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

{

     BOOL bInstTimer;

     int OldOff;

 

     if (bCapture == FALSE) {

          return;

     }

     if (Spliting(hWnd,x,y)) {

          return;

     }

 

     OldOff=off;

     off=SelEnd=GetOffFromXY(x+xPos,y+yPos);

     SetCaret();

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

 

     bInstTimer=FALSE;

     if (y>frt.bottom) {

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

          bInstTimer=TRUE;

     }

     if (y <0) {

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

          bInstTimer=TRUE;

     }

     if (bInstTimer==TRUE) {

          SetTimer(hWnd, 1, 100, NULL);

     } else {

          KillTimer(hWnd, 1);

     }

}

 

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

{

     bCapture=FALSE;

     ReleaseCapture();

     KillTimer(hWnd,1);

 

     if (EndSplit(hWnd,x,y)) {

          return;

     }

}

 

ÀÌÁ¦ ¸¶¿ì½º·Îµµ ¼±ÅÃÀÌ µÉ °ÍÀÌ´Ù. Çí»ç ºä´Â ¼±Åÿµ¿ª µå·¡±× ±â´ÉÀÌ ¾øÀ¸¹Ç·Î IsInSelection ÇÔ¼ö´Â Ç×»ó FALSE¸¦ ¸®ÅÏÇÑ´Ù. ¼±ÅÃµÈ ¿µ¿ª¿¡ ´ëÇØ Å¬¸³º¸µå ¾×¼Çµµ °¡´ÉÇѵ¥ ±âº» ºäÀÇ OnCommand¿¡¼­ Ŭ¸³º¸µå °ü·Ã ¸í·ÉÀ» ó¸®ÇÏ°í Àֱ⠶§¹®ÀÌ´Ù.

¹Ù.»ðÀÔ, »èÁ¦

¾ÆÁ÷ InsÅ°¿Í DelÅ°¸¦ ó¸®ÇÏÁö ¾Ê°í Àִµ¥ ÀÌ µÎ Å°¿¡´Â ±â´ÉÀÌ ¾ÆÁÖ ¸¹´Ù. InsÅ°´Â »ðÀÔ¸ðµå¿Í µ¤¾î¾²±â ¸ðµå¸¦ Åä±ÛÇϸç DelÅ°´Â ÇöÀç ¹ÙÀÌÆ®¸¦ »èÁ¦ÇÏ´Â °ÍÀÌ ±âº» ±â´ÉÀÌ°í ÀÌ ¿Ü¿¡ Ctrl+Ins, Shift+Ins, Shift+Del µîÀÇ Å¬¸³º¸µå ´ÜÃàÅ°°¡ Á¤ÀǵǾî¾ß ÇÑ´Ù. BSÅ°´Â Çí»ç ºä¿¡¼­´Â ¾Æ¹«·± ±â´ÉÀ» °¡ÁöÁö ¾Ê´Â´Ù. OnKey¿¡ ÀÌ µÎ Å°¿¡ ´ëÇÑ Ã³¸®¸¦ ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÑ´Ù.

 

void CApiEditHexa::OnKey(HWND hWnd, UINT vk, BOOL fDown, int cRepeat, UINT flags)

{

     ....

     case VK_DELETE:

          if (pFrame->bReadOnly || bCapture)

              return;

          if (bShift) {

              SendMessage(hWnd,WM_COMMAND,MAKEWPARAM(IDM_AE_CUT,0),0);

              return;

          }

          if (DeleteSelection()==FALSE) {

              Delete(off, 1);

          }

          Invalidate(off);

          SetCaret();

          return;

     case VK_INSERT:

          if (bShift) {

              SendMessage(hWnd,WM_COMMAND,MAKEWPARAM(IDM_AE_PASTE,0),0);

          } else if (bControl) {

              SendMessage(hWnd,WM_COMMAND,MAKEWPARAM(IDM_AE_COPY,0),0);

          } else {

              bOvr = !bOvr;

              pFrame->SendNotify(AEN_INSMODE);

              SetCaret();

          }

          return;

     }

}

 

´ÙÀ½Àº Çí»ç ºäÀÇ ¶Ç ´Ù¸¥ °ñÄ¡¾ÆÇ ¹®Á¦ÀÎ CR/LF µû·Î ÀÔ·ÂÀÇ ¹®Á¦¸¦ ÇØ°áÇØ º¸ÀÚ. abcdefghijk¶ó´Â ¹®ÀÚ¿­À» °¡Áö´Â ¹®¼­¸¦ ¸¸µé°í ÀÌ ¹®¼­¸¦ Çí»ç ºä¿Í ÅؽºÆ® ºä·Î ºÐÇÒÇØ ³õÀº »óÅ¿¡¼­ Áß°£ÀÇ efÀÇ °ªÀÎ 65 66À» 0D 0A·Î º¯°æÇØ º¸ÀÚ. ÅؽºÆ® ºä°¡ Á¦´ë·Î Á¤·ÄµÇÁö ¾ÊÀ» °ÍÀÌ´Ù.

abcd ´ÙÀ½¿¡ °³ÇàµÇ°í ghijk°¡ ±× ´ÙÀ½ ÁÙ·Î ³»·Á¿Í¾ß Çϴµ¥ ±×·¸Áö ¸øÇÑ °ÍÀÌ´Ù. ¿Ö³ÄÇϸé 0A¸¦ »ðÀÔÇÒ ¶§ UpdateViews°¡ È£ÃâµÇ´Âµ¥ À̶§ ÅؽºÆ® ºä´Â ÀçÁ¤·ÄÀ» À§ÇØ ¹æ±Ý º¯°æµÈ 0AÀÚ¸®ºÎÅÍ Á¤·ÄÀ» ½ÃÀÛÇÑ´Ù. FindParaStart ÇÔ¼ö´Â ¹æ±Ý ¼öÁ¤µÈ ¹®´ÜÀÇ ¼±µÎ¸¦ ã´Âµ¥ ÀÌ ¹®´ÜÀÇ ¼±µÎ°¡ ghijkÀÇ gÀÚ¸®°¡ µÇ¹Ç·Î À­ÁÙÀº Á¤·ÄµÇÁö ¾Ê´Â °ÍÀÌ´Ù.

¹®Á¦ÀÇ ±Ùº» ¿øÀÎÀº CR, LF¸¦ µû·Î ³ª´©¾î ÀÔ·ÂÇÏ´Â °ÍÀÌ °¡´ÉÇØÁ³´Ù´Â µ¥ ÀÖ´Ù. ÅؽºÆ® ºä¿¡¼­´Â EnterÅ° ÀÔ·ÂÀ¸·Î CR, LF¸¦ µ¿½Ã¿¡ ÀÔ·ÂÇϱ⠶§¹®¿¡ ÀÌ·± °æ¿ì°¡ ¾ø¾ú´Ù. Çí»ç ºä¿¡¼­¸¸ ¹ß»ýÇÒ ¼ö ÀÖ´Â ¾ÆÁÖ Æ¯¼öÇÑ °æ¿ìÀ̹ǷΠƯ¼öÇÏ°Ô ÇØ°áÇØ¾ß ÇÑ´Ù. Çí»çºäÀÇ Insert ÇÔ¼ö¿¡¼­ ó¸®ÇÒ ¼öµµ ÀÖ°í UpdateViews¿¡¼­ ó¸®ÇÒ ¼öµµ ÀÖ°í UpdateLineInfo¿¡¼­µµ ó¸®ÇÒ ¼ö ÀÖ´Ù. UpdateViews¿¡¼­ ó¸®ÇÏ´Â °ÍÀÌ °¡Àå ½¬¿îµ¥ ³ª¸ÓÁö ÇÔ¼ö¿¡¼­ nPos³ª nCount¸¦ Á¶ÀÛÇÒ °æ¿ì ºÎÀÛ¿ëÀÌ ¸¹±â ¶§¹®ÀÌ´Ù.

 

void CApiEdit::UpdateViews(CApiEditText *pView,int nPos,int nCount)

{

                   ....

                   if (arView[i]->ViewType != HEXA_VIEW) {

                   // CR, LF°¡ µû·Î ÀÔ·ÂµÈ °æ¿ì Àüü Á¤·ÄÇÑ´Ù.

                   if (buf[nPos]=='\n' && nPos > 0 && buf[nPos-1]=='\r') {

                       arView[i]->UpdateLineInfo();

                   } else {

                            arView[i]->UpdateLineInfo(nPos,nCount);

                   }

                   }

                   arView[i]->UpdateScrollInfo();

                   ....

 

¹æ±Ý »ðÀÔµÈ ¼±µÎ ¹®ÀÚ°¡ LFÀÌ°í ¹Ù·Î ¾Õ ¹®ÀÚ°¡ CRÀ̸é Àüü Á¤·ÄÇÑ´Ù. ¹Ù·Î ±× ¾Õ ¹®´ÜÀ» ã¾Æ Á¤·ÄÇÒ ¼öµµ ÀÖÀ¸³ª À̶§ nPos³ª nCount¸¦ À߸ø Á¶ÀÛÇϸé UpdateLineInfo ÇÔ¼öÀÇ ÃÖÀûÈ­ Äڵ尡 À§Å·οÍÁø´Ù. ±×·¡¼­ °¡Àå °£´ÜÇÑ ¿ÏÀü ´Ù½Ã Á¤·ÄÀ» Çߴµ¥ ¹ß»ý ºóµµ°¡ ±ØÈ÷ ³·±â ¶§¹®¿¡ ±¦È÷ ¼º´ÉÀ» °í·ÁÇÏ´Â °Íº¸´Ù ³í¸®ÀÇ °£´ÜÇÔÀ» ÃëÇÏ´Â °ÍÀÌ Á¤½Å °Ç°­¿¡ ÁÁ´Ù.