Çí»ç ºä¸¦ ¸¸µé±â À§ÇØ ±âº» ºä¸¦ ¼öÁ¤ÇÏ°í ÀÌÁø µ¥ÀÌÅ͸¦ ´Ù·ê ¼ö ÀÖµµ·Ï ±¸Á¶ Á¶Á¤À» ¸¶ÃÆÀ¸¸ç ½ÇÁ¦·Î Çí»ç ºä °´Ã¼µµ ¸¸µé¾ú´Ù. ±×·¯³ª ¾ÆÁ÷±îÁö Çí»ç ºä°¡ ±×·²µíÇÑ 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·µ À̵¿À̳ª ¼±Åà °ü¸®¸¦ À§ÇØ Çí»ç ºä¿¡µµ À¯Æ¿¸®Æ¼ ÇÔ¼ö¸¦ ÀÛ¼ºÇÑ´Ù. ÅؽºÆ® ºä¿Í ÀÎÅÍÆäÀ̽º´Â °°Áö¸¸ °è»ê ¹æ½ÄÀÌ ¿ÏÀüÈ÷ ´Ù¸£´Ù. ÁÙ´ç Ãâ·ÂµÇ´Â ±æÀÌ°¡ ÀÏÁ¤ÇÏ°í Á¤·Ä Á¤º¸°¡ ¾ø±â ¶§¹®¿¡ ¿ÀÈ÷·Á ´õ °£´ÜÇÏ´Ù. ¿øÇüÀÌ ÀÌ¹Ì ¼±¾ðµÇ¾î ÀÖ°í 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·µÀ» Ç¥½ÃÇÑ´Ù.
Ç¥½ÃÇÑ Ä³·µÀ» À̵¿½ÃÄÑ º¸ÀÚ. ³í¸®´Â ÅؽºÆ® ºä¿¡¼ÀÇ Ä³·µ À̵¿°ú °ÅÀÇ µ¿ÀÏÇѵ¥ ¼±ÅÃÀ» ÇØÁ¦ÇÏ°í Ŭ¸¯ÇÑ ÁöÁ¡ÀÇ ¿ÀÇÁ¼ÂÀ» ±¸ÇÑ ÈÄ 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 ÇÔ¼öÀÇ ÃÖÀûÈ Äڵ尡 À§Å·οÍÁø´Ù. ±×·¡¼ °¡Àå °£´ÜÇÑ ¿ÏÀü ´Ù½Ã Á¤·ÄÀ» Çߴµ¥ ¹ß»ý ºóµµ°¡ ±ØÈ÷ ³·±â ¶§¹®¿¡ ±¦È÷ ¼º´ÉÀ» °í·ÁÇÏ´Â °Íº¸´Ù ³í¸®ÀÇ °£´ÜÇÔÀ» ÃëÇÏ´Â °ÍÀÌ Á¤½Å °Ç°¿¡ ÁÁ´Ù.