GetInfoFromOff´Â ¿ÀÇÁ¼ÂÀ» ÁÖ¸é ¿ÀÇÁ¼ÂÀÇ ¿©·¯ °¡Áö Á¤º¸¸¦ Á¶»çÇÏ´Â ÇÔ¼öÀε¥ ÅØ½ºÆ® ºä¿Í´Â Çà°ú ¿ÀÇ °³³äÀÌ ´Ù¸£¹Ç·Î ¿ÏÀüÈ÷ ´Ù½Ã ÀÛ¼ºÇØ¾ß ÇÑ´Ù.
int CApiEditHexa::GetInfoFromOff(int Type, int nPos/*=-1*/)
{
int r,c;
int ret;
if (nPos==-1) {
nPos=off;
}
GetRCFromOff(nPos,r,c);
switch (Type) {
case AE_INFO_ROW:
case AE_INFO_PARA:
ret=r;
break;
case AE_INFO_COL:
case AE_INFO_PARACOL:
ret=c;
break;
case AE_INFO_LINE:
ret=0;
break;
}
return ret;
}
¹®´Ü¿¡ ´ëÇÑ Á¤º¸¸¦ ¿ä±¸Çϸé ÁÙ Á¤º¸¸¦ ¸®ÅÏÇϴµ¥ ¾Ë´Ù½ÃÇÇ Çí»ç ºä´Â ¹®´ÜÀ̶ó´Â °³³äÀÌ ¾ø´Ù. ÀÌ ÇÔ¼ö¸¦ ÀçÁ¤ÀÇÇÏÁö ¾ÊÀ¸¸é Çí»ç ºä¿¡ ¾ø´Â pLineÀ» ÂüÁ¶Çϱ⠶§¹®¿¡ Áï»çÇØ ¹ö¸°´Ù. ÀÌ ÇÔ¼ö´Â »óŶõ¿¡ ÇöÀç ÁÙ ¹øÈ£¸¦ Ãâ·ÂÇÒ ¶§, Á٠ã¾Æ°¡±â ±â´É µî¿¡ »ç¿ëµÈ´Ù. Çí»ç ºä¿¡¼ Á٠ã¾Æ°¡±â¸¦ ÇÒ ¶§´Â ¹®´Ü ´ë½Å ÁÙÀ» ã¾Æ¾ß ÇÑ´Ù.
void OnCommand(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
....
case IDM_SEARCH_GOTOLINE:
s=DialogBox(g_hInst,MAKEINTRESOURCE(IDD_GOTOLINE),hWnd,GotoLineDlgProc);
if (s != -1) {
if (pSi->Ae.GetActiveView()->ViewType != HEXA_VIEW) {
pSi->Ae.GotoLine(s-1,0,1);
} else {
pSi->Ae.GotoLine(s-1,0,0);
}
}
break;
GetDocInfo ÇÔ¼öµµ ÀçÁ¤ÀÇÇÑ´Ù. ¹®¼¾çÀ» ÃøÁ¤ÇÏ´Â ¹æ¹ýµµ ´Ù¼Ò ´Ù¸£´Ù.
int CApiEditHexa::GetDocInfo(int type)
{
int count=0;
int han=0;
TCHAR *p=pFrame->buf;
switch (type) {
case AE_DOC_TOTALPARA:
count=GetRowCount();
break;
case AE_DOC_WORD:
case AE_DOC_EXSPACESIZE:
case AE_DOC_CHAR:
case AE_DOC_HAN:
count=CApiEditText::GetDocInfo(type);
break;
case AE_DOC_EMPTYLINE:
break;
}
return count;
}
¹®´Ü ¼ö´Â ÁÙ ¼ö·Î ´ë½ÅÇÏ°í ´Ü¾î¼ö, ±ÛÀÚ¼ö´Â ±âº»ºäÀÇ Á¶»çµÈ °á°ú¸¦ ÃëÇÏ¸ç ¹®´Ü³»ÀÇ ÁÙ ¹øÈ£´Â ¹«Á¶°Ç 0¹øÀÌ´Ù. ÀÌ ÇÔ¼öµµ »óŶõ Ãâ·Â¿¡ »ç¿ëµÇ¸ç PrintInfo ÇÔ¼ö¿¡¼ ¹®¼ Á¤º¸¸¦ Á¶»çÇÒ ¶§µµ »ç¿ëµÈ´Ù. ¾È³» ¸Þ½ÃÁöµµ Á¶±Ý ´Ù¸£°Ô Ãâ·ÂÇÑ´Ù.
void PrintInfo(CApiEdit &Ae)
{
HWND hActive;
SInfo *pSi;
hActive=(HWND)SendMessage(g_hMDIClient,WM_MDIGETACTIVE,0,NULL);
pSi=(SInfo *)GetWindowLong(hActive,0);
....
lstrcat(Mes,str);
if (pSi->Ae.GetActiveView()->ViewType == HEXA_VIEW) {
lstrcat(Mes,"\r\n\r\nÇí»ç ºä¿¡¼´Â ¹®´Ü Á¤º¸ ´ë½Å ÁÙ Á¤º¸¸¦ º¸¿©ÁÝ´Ï´Ù.");
}
MessageBox(g_hFrameWnd,Mes,"¹®¼ Á¤º¸",MB_OK);
}
Ȱ¼º ºä¸¦ Á¶»çÇÑ ÈÄ Çí»ç ºäÀÌ¸é ¹®´Ü Á¤º¸ ´ë½Å ÁÙ Á¤º¸¸¦ º¸¿©Áشٴ °ÍÀ» È®½ÇÇÏ°Ô Ç¥½ÃÇß´Ù. ÀÌ ¸Þ½ÃÁö¸¦ Ãâ·ÂÇÏÁö ¾ÊÀ¸¸é ÅØ½ºÆ® ÆÄÀÏÀ» Çí»ç ºä·Î ¿¾î ³õÀº »óÅ¿¡¼ »ç¿ëÀÚ°¡ ¹®´Ü ¼ö¸¦ À߸ø ÆÄ¾ÇÇÒ À§ÇèÀÌ ÀÖ´Ù.
ºÏ¸¶Å©¿Í °ü·ÃµÈ ÄÚµå´Â ±âº» ºä¿¡ °ÅÀÇ ¿Ïº®ÇÏ°Ô ÀÛ¼ºµÇ¾î ÀÖÀ¸¹Ç·Î ±âº» ºäÀÇ Äڵ带 ¼öÁ¤ÇÏ¿© ÀçȰ¿ëÇÏÀÚ. ±âº» ºäÀÇ ToggleBookmark, GotoBookmark ÇÔ¼ö¸¦ ´ÙÀ½°ú °°ÀÌ Á¶±Ý ¼öÁ¤ÇÑ´Ù.
void CApiEditText::ToggleBookmark(int Para, int Mark)
{
int r,c;
int i;
int state;
if (Para == -1) {
GetRCFromOff(off,r,c);
if (ViewType==HEXA_VIEW) {
Para=r;
} else {
Para=pLine[r].nPara;
}
}
....
void CApiEditText::GotoBookmark(int Mark)
{
....
if (Mark<=9) {
Para=arMark[Mark];
if (Para == -1) {
return;
}
} else {
GetRCFromOff(off,r,c);
if (ViewType==HEXA_VIEW) {
nowPara=r;
} else {
nowPara=pLine[r].nPara;
}
for (i=10;i<MAXBOOKMARK;i++) {
....
GotoLine(Para,0,(ViewType==HEXA_VIEW) ? 0:1);
}
¹®´Ü ¹øÈ£ ´ë½Å ÁÙ ¹øÈ£¸¦ »ç¿ëÇÑ´Ù´Â Â÷À̹ۿ¡ ¾ø´Ù. Çí»ç ºäÀ̸é GetRCFromOff ÇÔ¼ö·Î ±¸ÇÑ ÁÙ¹øÈ£¸¦ ¹Ù·Î »ç¿ëÇϰí ÅØ½ºÆ® ºä´Â ÀÌ ÁÙ¹øÈ£·ÎºÎÅÍ ¹®´Ü ¹øÈ£¸¦ ±¸ÇØ ºÏ¸¶Å©¸¦ Åä±ÛÇØ¾ß ÇÑ´Ù. ºÏ¸¶Å©·Î À̵¿ÇÒ ¶§µµ Çí»ç ºä´Â ÇöÀç ¿ÀÇÁ¼ÂÀÇ ÁÙ ¹øÈ£¸¦ ±âÁØÀ¸·Î ¹Ù·Î ¿øÇÏ´Â ºÏ¸¶Å©¸¦ ãÀ¸¸ç GotoLine ÇÔ¼öÀÇ µÎ¹øÂ° Àμö¸¦ 0À¸·Î ÁÖ¾î ÁÙÀ» ã¾Æ °£´Ù. GotoLine ÇÔ¼öµµ ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇÑ´Ù.
void CApiEditText::GotoLine(int Line, int Col/*=0*/, int Type/*=0*/)
{
....
switch (Type) {
case 0:
if (ViewType==TEXT_VIEW) {
tLine=min(Line,TotalLine-1);
} else {
tLine=min(Line,GetRowCount()-1);
}
off=GetOffFromRC(Line,Col);
break;
....
LineÀÌ À߸ø Àü´ÞµÇ´õ¶óµµ ¹®¼ÀÇ ³¡ ÁÙ·Î À̵¿Çϴµ¥ Çí»ç ºä´Â TotalLineÀ» °¡ÁöÁö ¾ÊÀ¸¹Ç·Î GetRowCount ÇÔ¼ö·Î ¸¶Áö¸· ÁÙ ¹øÈ£¸¦ Á÷Á¢ ã¾Æ¾ß ÇÑ´Ù. µÎ ºäÀÇ ºÏ¸¶Å© Æ÷¸ËÀÌ ´Ù¸£±â ¶§¹®¿¡ ȣȯµÇÁö´Â ¾ÊÀ¸¸ç ±×·¡¼ CloneView¿¡¼ ŸÀÔÀÌ ´Ù¸¥ ºä³¢¸®´Â ºÏ¸¶Å©¸¦ º¹Á¦ÇÏÁö ¾Ê¾Ò´Ù.
DrawLine¿¡¼ ºÏ¸¶Å©¸¦ Ç¥½ÃÇØ¾ß ÇÑ´Ù. »Ó¸¸ ¾Æ´Ï¶ó ÇöÀçÇà Ç¥½Ã, ÁÙ¹øÈ£ Ãâ·Âµµ ÇØ¾ß ÇÑ´Ù. ÀÌ Ã³¸®´Â ÅØ½ºÆ® ºä³ª Çí»ç ºä³ª ºñ½ÁÇÏ´Ù. ±×·¡¼ ±âº» ºäÀÇ DrawLine¿¡¼ ½ÇÁ¦ ¹®¼ ³»¿ëÀÌ ¾Æ´Ñ °Íµé¿¡ ´ëÇÑ Ãâ·Â¹®À» º°µµÀÇ ÇÔ¼ö·Î ºÐ¸®ÇÏ¸é¼ Çí»ç ºä¸¦ °í·ÁÇÏ¿© ¾à°£¸¸ ¼öÁ¤ÇÏÀÚ. ´ÙÀ½ ÇÔ¼ö¸¦ »õ·Î Ãß°¡ÇÑ´Ù.
void CApiEditText::DrawLineSub(HDC hdc,int Line,BOOL bCurLine)
{
HBRUSH hMarBrush;
HPEN hMarPen,OldPen;
RECT mrt;
TCHAR szLine[10];
UINT OldAlign;
UINT OldBkMode;
HFONT OldFont;
int OldExtra;
int Mark;
HBRUSH hMark, OldBrush;
RECT lrt;
int r,c,len;
POINT tri[]={{1,1},{1,0},{0,0},{1,1}};
// ¹Ú½º ¶Ç´Â ¹ØÁÙ·Î ÇöÀçÇà Ç¥½ÃÇϱâ
if ((pFrame->nShowCurLine==1 || pFrame->nShowCurLine==2 ||
pFrame->nShowCurLine==4) && bCurLine) {
if (pFrame->nShowCurLine == 1 || pFrame->nShowCurLine == 4) {
SetRect(&lrt,frt.left-1,0,frt.right+1,FontHeight);
} else {
SetRect(&lrt,frt.left-1,FontHeight,frt.right+1,FontHeight);
}
SetTextColor(hdc,RGB(0,0,0));
SetBkColor(hdc,GetSysColor(COLOR_WINDOW));
DrawFocusRect(hdc,&lrt);
}
// ÀÚµ¿ °³Çà¿ Ãâ·Â
if (ViewType==TEXT_VIEW && ColMark != 0) {
hMarPen=CreatePen(PS_SOLID,1,RGB(128,128,128));
OldPen=(HPEN)SelectObject(hdc,hMarPen);
MoveToEx(hdc,frt.left+ColMark*FontWidth-xPos,0,NULL);
LineTo(hdc,frt.left+ColMark*FontWidth-xPos,LineHeight);
SelectObject(hdc,OldPen);
DeletePen(hMarPen);
}
// ¸¶Áø Ãâ·Â
if (MarginWidth != 0) {
hMarBrush=CreateSolidBrush(pFrame->MarColor1);
SetRect(&mrt,0,0,MarginWidth-1,LineHeight);
FillRect(hdc,&mrt,hMarBrush);
hMarPen=CreatePen(PS_SOLID,1,pFrame->MarColor2);
OldPen=(HPEN)SelectObject(hdc,hMarPen);
MoveToEx(hdc,MarginWidth-2,0,NULL);
LineTo(hdc,MarginWidth-2,LineHeight);
SelectObject(hdc,OldPen);
DeleteObject(hMarPen);
DeleteObject(hMarBrush);
// ÁÙ ¹øÈ£ Ãâ·Â
if (bShowLineNum && (ViewType==HEXA_VIEW || pLine[Line].nLine==0)) {
if (ViewType==TEXT_VIEW) {
wsprintf(szLine,"%d",pLine[Line].nPara+1);
} else {
wsprintf(szLine,"%d",Line+1);
}
OldAlign=SetTextAlign(hdc,TA_RIGHT);
OldBkMode=SetBkMode(hdc,TRANSPARENT);
SetTextColor(hdc,pFrame->NumColor);
OldFont=(HFONT)SelectObject(hdc,CApiEdit::hLineNumFont);
OldExtra=SetTextCharacterExtra(hdc,-1);
TextOut(hdc,MarginWidth-4,(FontHeight-10)/2,szLine,lstrlen(szLine));
SetTextCharacterExtra(hdc,OldExtra);
SelectObject(hdc,OldFont);
SetTextAlign(hdc,OldAlign);
SetBkMode(hdc,OldBkMode);
}
// ºÏ¸¶Å© Ãâ·Â
if (ViewType==HEXA_VIEW || pLine[Line].nLine == 0) {
if (ViewType==TEXT_VIEW) {
Mark=FindBookmark(pLine[Line].nPara);
} else {
Mark=FindBookmark(Line);
}
if (Mark != -1) {
hMark=CreateSolidBrush(pFrame->MarkColor);
OldBrush=(HBRUSH)SelectObject(hdc,hMark);
RoundRect(hdc,0,0,10,FontHeight,2,2);
DeleteObject(SelectObject(hdc,OldBrush));
if (Mark >= 0 && Mark <= 9) {
wsprintf(szLine,"%d",Mark);
OldAlign=SetTextAlign(hdc,TA_LEFT);
OldBkMode=SetBkMode(hdc,TRANSPARENT);
SetTextColor(hdc,RGB(0,0,0));
OldFont=(HFONT)SelectObject(hdc,CApiEdit::hLineNumFont);
TextOut(hdc,2,0+2,szLine,lstrlen(szLine));
SelectObject(hdc,OldFont);
SetTextAlign(hdc,OldAlign);
SetBkMode(hdc,OldBkMode);
}
}
}
// ¸¶Áø¿¡ ÇöÀçÇà Ç¥½Ã
if (pFrame->nShowCurLine == 5 && bCurLine) {
OldBrush=(HBRUSH)SelectObject(hdc,GetStockObject(BLACK_BRUSH));
r=min(FontHeight,MarginWidth);
tri[1].y=r-1-r % 2;
tri[2].x=r/2;
tri[2].y=r/2;
len=FontHeight/2-tri[2].y;
if (len!=0) {
for (c=0;c<4;c++) {
tri[c].y+=len;
}
}
Polygon(hdc,tri,4);
SelectObject(hdc,OldBrush);
}
}
}
´ëºÎºÐÀÇ ÄÚµå´Â DrawLine¿¡¼ ±×´ë·Î °¡Á®¿Â °ÍÀÌ¸ç ±½°Ô Ç¥½ÃÇÑ ºÎºÐ¸¸ ¼öÁ¤ÇÏ¸é µÈ´Ù. bCurLineÀº ÆÇº°ÇÏ´Â ¹æ¹ýµµ ´Ù¸£°í Àû¿ëÇÏ´Â °÷ÀÌ Å¸ÀÔ¿¡ µû¶ó ³ª´©¾îÁ® Àֱ⠶§¹®¿¡ Àμö·Î µû·Î Àü´Þ¹Þ´Â´Ù. Çí»ç ºä¿¡´Â ÀÚµ¿ °³Çà¿À» Ç¥½ÃÇÒ Çʿ䰡 ¾øÀ¸¹Ç·Î ÀÚµ¿ °³Ç࿠ǥ½Ã´Â ÅØ½ºÆ® ºäÀÏ ¶§¸¸ Ãâ·ÂÇÑ´Ù. ÇöÀçÇà¿¡ ´ëÇÑ °³³äÀÌ Æ²¸®°í ºÏ¸¶Å©¸¦ ã´Â ¹æ¹ýÀÌ ¾à°£ ´Ù¸¦ »Ó ³ª¸ÓÁö´Â µ¿ÀÏÇÏ´Ù. ±âº» ºäÀÇ DrawLineÀº ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇÑ´Ù.
int CApiEditText::DrawLine(HDC hdc, int Line)
{
int x;
int len;
int nowoff;
BOOL bInSel;
COLORREF fore, back;
int SelFirst, SelSecond;
int r,c;
BOOL bCurLine=FALSE;
RECT lrt;
HBRUSH hCurLine;
int toff;
int nUnit;
int style;
BOOL bFindUnit;
....
DrawSegment(hdc,x,0,nowoff,len,
(nowoff+len==pLine[Line].End),fore,back);
nowoff+=len;
if (nowoff == pLine[Line].End)
break;
}
DrawLineSub(hdc,Line,bCurLine);
return 1;
}
¹®¼ ³»¿ë¸¸ Ãâ·ÂÇÏ°í ³ª¸ÓÁö´Â DrawLineSub¸¦ È£ÃâÇÑ´Ù. ´ë·®ÀÇ ÄÚµåµéÀÌ »õ·Î¿î ÇÔ¼ö·Î ¿Å°ÜÁ³±â ¶§¹®¿¡ Áö¿ª º¯¼öµéµµ ´ëÆø Á¤¸®µÇ¾ú´Ù. ÀÌ·¸°Ô µÇ¸é Çí»ç ºäÀÇ DrawLineµµ DrawLineSub¸¦ È£ÃâÇÒ ¼ö ÀÖ´Ù.
int CApiEditHexa::DrawLine(HDC hdc, int Line)
{
int r,c;
BOOL bCurLine=FALSE;
RECT lrt;
HBRUSH hCurLine;
nPos=Line*bpl;
if (nPos > pFrame->doclen) {
return 0;
}
// ÇöÀçÁ٠ǥ½Ã ¿É¼ÇÀÌ À½¿µÀÌ¸é ¹è°æ¿¡ ¹Ì¸® Ãâ·ÂÇÑ´Ù.
GetRCFromOff(off,r,c);
if (r==Line && (pFrame->bHideCurLine==FALSE || GetFocus()==hWnd)) {
bCurLine=TRUE;
}
if (bCurLine && (pFrame->nShowCurLine == 3 || pFrame->nShowCurLine == 4)) {
SetRect(&lrt,frt.left,0,frt.right,FontHeight);
hCurLine=CreateSolidBrush(pFrame->CurColor);
FillRect(hdc,&lrt,hCurLine);
DeleteObject(hCurLine);
}
....
DeleteObject(hSelBack);
DeleteObject(SelectObject(hdc,OldPen));
DrawLineSub(hdc,Line,bCurLine);
return 1;
}
ÇöÀçÇà Ç¥½Ã¿¡ À½¿µÀÌ ÀÖÀ» ¶§¸¸ ó¸®ÇÏ°í ³ª¸ÓÁö´Â DrawLineSub¿¡°Ô ¸Ã±ä´Ù. ¿©±â±îÁö ÀÛ¾÷ÇÏ¸é ¸¶Áøµµ ±ò²ûÇÏ°Ô Ãâ·ÂµÈ´Ù. ±×·¯³ª ÇöÀçÇàÀ» À½¿µÀ¸·Î Ç¥½ÃÇÒ ¶§ ±ÛÀÚÀÇ ¹è°æ»öÀÌ À½¿µÀ¸·Î Ç¥½ÃµÇÁö ¾Ê´Â ¹®Á¦°¡ ÀÖ´Ù.

Çí»ç ºä°¡ ¹è°æ»öÀ¸·Î ¹ÙÀÌÆ® »çÀ̸¦ µ¤¾î ¹ö¸®±â ¶§¹®Àε¥ ÀÌ ¹®Á¦´Â ´çºÐ°£ ³ë¿î ¹ö±×·Î ³²°Ü ³õ±â·Î ÇÑ´Ù. ³ªÁß¿¡ Åõ¸í Ãâ·ÂÇÏ°Ô µÇ¸é ÀÚ¿¬½º·´°Ô ÇØ°áµÈ´Ù. SetCaret¿¡¼ ÇöÀçÇà º¸±â¸¦ À̵¿½Ã۵µ·Ï ¼öÁ¤ÇÑ´Ù.
void CApiEditHexa::SetCaret(BOOL bUpdatePrevX/*=TRUE*/, BOOL bScrollToCaret/*=TRUE*/)
{
int x,y;
int caretwidth;
RECT crt;
BOOL bScroll=FALSE;
int ty;
POINT OldPos;
RECT InvRt;
GetCaretPos(&OldPos);
if (bOvr==FALSE || bComp) {
....
SetCaretPos(x-xPos,y-yPos);
if (pFrame->nShowCurLine != 0 && OldPos.y != y-yPos) {
InvRt.left=0;
InvRt.right=frt.right;
InvRt.top=min(OldPos.y,y-yPos);
InvRt.bottom=max(OldPos.y,y-yPos)+LineHeight;
InvalidateRect(hWnd,&InvRt,FALSE);
}
}
ºÏ¸¶Å© °ü·Ã ±â´ÉÀº ´Ù Á¤ºñµÇ¾úÀ¸¹Ç·Î OnKey¿¡¼ ºÏ¸¶Å© ´ÜÃà۸¸ Á¦°øÇÏ¸é µÈ´Ù. ÅØ½ºÆ® ºä¿¡¼¿Í µ¿ÀÏÇÑ ´ÜÃà۸¦ Á¤ÀÇÇÑ´Ù.
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;
// ºÏ¸¶Å© ´ÜÃàŰ ó¸®
if (vk>='0' && vk<='9' && bControl) {
if (bShift) {
ToggleBookmark(-1,vk-'0');
} else {
GotoBookmark(vk-'0');
}
}
// Á¶¸³À» ³¡³»´Â Ű ÀÔ·Â
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();
}
bFindSelect=FALSE;
switch (vk) {
case VK_F2:
if (bControl) {
ToggleBookmark(-1,100);
} else {
if (bShift) {
GotoBookmark(11);
} else {
GotoBookmark(10);
}
}
return;
case VK_F6:
....
Çí»çºä´Â ºÏ¸¶Å©¸¦ °ü¸®ÇÏÁö ¾Ê´Â´Ù. ÆíÁýÀ» ÇÏ´õ¶óµµ µ¤¾î ¾²±â ¸ðµå¿¡¼ ¹ÙÀÌÆ®¸¦ ġȯÇÏ´Â °æ¿ì°¡ ¸¹°í »ðÀÔ, »èÁ¦ÇÏ´Â °æ¿ì´Â ÈçÇÏÁö ¾ÊÀ¸¹Ç·Î ºÏ¸¶Å©°¡ À̵¿µÇ¾î¾ß ÇÒ ÇÊ¿ä´Â ¾ø´Ù. ¶ÇÇÑ ÅØ½ºÆ® ºäÀÇ ºÏ¸¶Å©´Â ¹®´Ü ¼±µÎÀÇ ¿ÀÇÁ¼ÂÀ» °¡¸®Å°´Â °ÍÀ¸·Î Á¤ÀǵÇÁö¸¸ Çí»ç ºäÀÇ ºÏ¸¶Å©´Â ¸» ±×´ë·Î ÁÙÀ» °¡¸®Å°´Â °ÍÀ¸·Î Á¤ÀǵDZ⠶§¹®¿¡ ¹®¼°¡ ÆíÁýµÇ¾îµµ À̵¿ÇÏÁö ¾Ê´Â´Ù. °¡¸®Å°´Â °÷ÀÌ °³³äÀûÀÎ ÁÙÀÏ »ÓÀÌ¸ç Æ¯Á¤ ¿ÀÇÁ¼ÂÀÇ À§Ä¡¸¦ ±â¾ïÇÏ´Â °ÍÀÌ ¾Æ´Ï´Ù.
°ü¸®¸¦ ÇÏÁö ¾Ê´Ùº¸´Ï »ðÀÔ, »èÁ¦½Ã¿¡µµ ºÏ¸¶Å©ÀÇ À̵¿ÀÌ ÀüÇô ¾ø´Ù. ±×·¡¼ ¹®¼ ³¡¿¡ ºÏ¸¶Å©¸¦ ¼³Á¤Çϰí ÇÑÁÙ »èÁ¦Çϸé ÀÌ ºÏ¸¶Å©°¡ »ç¶óÁø´Ù. ±×·¯³ª ¶Ç ÇÑÁÙÀ» »ðÀÔÇÏ¸é »ç¶óÁ³´ø ºÏ¸¶Å©°¡ ´Ù½Ã ³ªÅ¸³´Ù. bplÀÌ ¹Ù²î¾îµµ ºÏ¸¶Å©´Â ±×´ë·Î Àִ´Ù. ¹º°¡ ¾û¸ÁÀÎ °Í °°Áö¸¸ GotoLine¿¡¼ ¹®¼ÀÇ ¸¶Áö¸· ÁÙ ¾Æ·¡·Î´Â °¡Áö ¾Êµµ·Ï ó¸®Çϰí ÀÖÀ¸¹Ç·Î À§ÇèÇÏÁö´Â ¾Ê´Ù.
¹®¼¸¦ ȸ鿡 Ç¥½ÃÇÏ´Â ¹æ½ÄÀÌ ´Ù¸£¹Ç·Î Á¾ÀÌ·Î ÀμâÇÏ´Â ¹æ½Äµµ ºä¸¶´Ù ´Ù¸£´Ù. BeginPrint ÀÌÇÏ Àμ⠰ü·Ã ÇÔ¼ö ¼¼ °³¸¦ ÀçÁ¤ÀÇÇÑ´Ù. ¸ÕÀú Àμâ Áغñ¸¦ ÇÏ´Â BgeinPrint ÇÔ¼ö¸¦ ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÑ´Ù.
void CApiEditHexa::BeginPrint(Ae_PrintInfo *pi)
{
TEXTMETRIC tm;
SIZE sz;
pi->Origin=pi->prt.left;
if (pi->bLineNum) {
GetTextExtentPoint32(pi->pdc,"999999",6,&sz);
pi->Origin+=sz.cx;
}
GetTextMetrics(pi->pdc,&tm);
pi->LineHeight=int(tm.tmHeight*LineRatio/100);
pi->LinePerPage=(pi->prt.bottom-pi->prt.top)/pi->LineHeight;
pi->TotalPage=(GetRowCount()-1)/pi->LinePerPage+1;
pi->TabSize=tm.tmAveCharWidth;
}
Á¤·ÄÀ» ÇÏÁö ¾ÊÀ¸¸ç ¹®¹ý °Á¶ ±â´Éµµ ¾øÀ¸¹Ç·Î Áغñ °úÁ¤µµ ¾ÆÁÖ °£´ÜÇÏ´Ù. ÁÙ ¹øÈ£ Ãâ·Â ¿É¼Ç¿¡ µû¶ó pi->OriginÀ» °è»êÇϰí ÀÎ¼â ÆùÆ® Á¤º¸·ÎºÎÅÍ ÁÙ°£, ÆäÀÌÁö´ç ÁÙ ¼ö, ÃÑ ÆäÀÌÁö ¼ö µîÀ» °è»êÇØ ³õ´Â´Ù. pi->TabSize´Â Àӽ÷Π¹®ÀÚÀÇ Æò±ÕÆøÀ» ÀúÀåÇϸç ÀÌ °ªÀº PrintPage ÇÔ¼ö¿¡¼ Ä÷³ »çÀ̸¦ ¶ç¿ï ¶§ ÂüÁ¶ÇÑ´Ù. Çí»ç ºä´Â ÅÇÀ» ó¸®ÇÏÁö ¾ÊÀ¸¹Ç·Î ÀÌ º¯¼ö¸¦ ´Ù¸¥ ¿ëµµ·Î »ç¿ëÇϰí ÀÖ´Ù. ´ÙÀ½Àº ÇÑ ÆäÀÌÁö¸¦ ÀμâÇÏ´Â PrintPage ÇÔ¼öÀÌ´Ù.
BOOL CApiEditHexa::PrintPage(Ae_PrintInfo *pi,int nPage)
{
int l,Line;
int nowoff;
int i,x,y;
TCHAR szLine[32];
BOOL bEnd=FALSE;
TCHAR szText[1024];
for (l=pi->LinePerPage*(nPage-1),Line=0;l<pi->LinePerPage*nPage;l++,Line++) {
if (l==GetRowCount()) {
bEnd=TRUE;
break;
}
x=pi->Origin;
y=pi->prt.top+Line*pi->LineHeight;
nowoff=l*bpl;
// ¿ÀÇÁ¼Â Ãâ·Â
wsprintf(szText,"%.8X:",nowoff);
if (bCapital == FALSE) _strlwr(szText);
TextOut(pi->pdc,x,y,szText,lstrlen(szText));
x+=pi->TabSize*12;
// ¹ÙÀÌÆ® Ãâ·Â
for (i=nowoff;i<nowoff+bpl;i++) {
if (i < pFrame->doclen) {
wsprintf(szText,"%.2X",(BYTE)pFrame->buf[i]);
if (bCapital == FALSE) _strlwr(szText);
TextOut(pi->pdc,x,y,szText,lstrlen(szText));
}
// ±¸ºÐ¼± Ãâ·Â. ´Ü ù ¹ÙÀÌÆ®´Â Á¦¿Ü
if (i != nowoff && nHexSep && (i-nowoff) % nHexSep == 0) {
MoveToEx(pi->pdc,x-TabSize/2,y,NULL);
LineTo(pi->pdc,x-TabSize/2,y+pi->LineHeight);
}
x+=pi->TabSize*3;
}
// ¹®ÀÚ Ãâ·Â
x+=pi->TabSize;
memset(szText,0,bpl+1);
for (i=nowoff;i<nowoff+bpl;i++) {
if (i==pFrame->doclen) {
break;
}
if ((pFrame->buf[i] & 0x80) !=0 && i+1<nowoff+bpl) {
szText[lstrlen(szText)]=pFrame->buf[i++];
szText[lstrlen(szText)]=pFrame->buf[i];
} else {
if (pFrame->buf[i] >= 0x20 && pFrame->buf[i] <= 0x7e) {
szText[lstrlen(szText)]=pFrame->buf[i];
} else {
szText[lstrlen(szText)]='.';
}
}
}
TextOut(pi->pdc,x,y,szText,lstrlen(szText));
// ÁÙ¹øÈ£ Ãâ·Â
if (pi->bLineNum) {
wsprintf(szLine,"%d",l);
SetTextColor(pi->pdc,RGB(128,128,128));
TextOut(pi->pdc,pi->prt.left,pi->prt.top+l*pi->LineHeight,
szLine,lstrlen(szLine));
}
}
return bEnd;
}
±âº» ºäÀÇ PrintPage ÇÔ¼ö¿¡¼ ±¸Á¶¸¦ µû¿À°í Çí»ç ºäÀÇ DrawLine ÇÔ¼ö¿¡¼ Ãâ·Â Äڵ带 °¡Á®¿Í Á¶ÇÕÇÑ °ÍÀÌ´Ù. ¹ÙÀÌÆ®°£ÀÇ °£°ÝÀ» Æò±ÕÆøÀÇ 3¹è·Î ¶ç¿ü´Âµ¥(ȸéÀº 4¹è) ÀÌ´Â ½Ã½ºÅÛ ÆùÆ®·Î A4¿ëÁö¿¡ ÀμâÇÒ ¶§ À߸®Áö ¾Ê°í ÁÙ´ç 16¹ÙÀÌÆ®¸¦ Ãâ·ÂÇϱâ À§ÇؼÀÌ´Ù. ÀÎ¼â ³í¸®´Â ±âº» ºä¿Í µ¿ÀÏÇϹǷΠºÐ¼®ÇØ º¼ ÇÊ¿ä´Â ¾øÀ» °ÍÀÌ´Ù. ´ÙÀ½Àº Àμ⸦ Á¾·áÇÏ´Â EndPrint ÇÔ¼öÀε¥ ÀÖ´Â ±×´ë·Î ³²°Ü µÎ±â¸¸ ÇÏ¸é µÈ´Ù.
void CApiEditHexa::EndPrint(Ae_PrintInfo *pi)
{
}
Àμâ¿ë Á¤·ÄÀ» ÇÏÁö ¾Ê°í ºÐ¼®±âµµ »ý¼ºÇÏÁö ¾ÊÀ¸¹Ç·Î ºñ¾î ÀÖ´Ù. ±×·¸´Ù°í ÇØ¼ ÀÌ ÇÔ¼ö¸¦ ÀçÁ¤ÀÇÇÏÁö ¾ÊÀ¸¸é Å«Àϳª´Âµ¥ ±âº»ºäÀÇ EndPrint°¡ ¾û¶×ÇÑ ÁþÀ» ÇÏÁö ¾Êµµ·Ï ¹æÁöÇÏ´Â ¿ªÇÒÀ» ÇÑ´Ù. °´Ã¼ ÁöÇâ ÇÁ·Î±×·¡¹Ö¿¡¼´Â ºó ÇÔ¼öµµ ÀÌ·¸°Ô Àǹ̸¦ °¡Áú ¼ö ÀÖ´Ù. Àμ⠿Ϸá. ¸Ó¸®¸», ²¿¸®¸», ÆäÀÌÁö ¹øÈ£ Ãâ·Â µîÀº È£½ºÆ®°¡ ÇÑ´Ù. ´ç±Ù°ú ApiEdit´Â Àμ⸦ À§ÇØ ³ª¸§´ë·ÎÀÇ ÇÁ·¹ÀÓ¿öÅ©¸¦ Á¤ÀÇÇϱ⠶§¹®¿¡ ±ÔÄ¢¿¡ ¸Â°Ô ÇÔ¼ö¸¸ Á¦°øÇϸé ÀμâÇÒ ¼ö ÀÖ´Ù.
ApiEdit´Â ¹®¼ÀÇ Æ÷¸ËÀ» ÀÚµ¿À¸·Î ÆÇº° ¹× º¯È¯ÇÏ¿© ¿©´Â ±â´ÉÀ» Á¦°øÇÏ¿© À¯´ÏÄڵ峪 À¯´Ð½º ¹®¼µµ Àß ¿¬´Ù. ÅØ½ºÆ® ÆíÁý±â·Î¼ÀÇ ±â´É¸¸À¸·Î º»´Ù¸é ÀÌ´Â ´ç¿¬ÇÑ Ã³¸®ÀÌÁö¸¸ Çí»ç ÆíÁý±â°¡ Ãß°¡µÇ¸é ¾ê±â°¡ Á» ´Þ¶óÁø´Ù. ¹®¼ÀÇ ÅØ½ºÆ®°¡ ¾Æ´Ñ ½ÇÁ¦ ³»¿ëÀ» Á÷Á¢ º¸°í ÆíÁýÇØ¾ß ÇÏ´Â °æ¿ìµµ ÀÖ´Ù. À¯´ÏÄÚµå ¹®¼ÀÇ ¹®ÀÚ Äڵ峪 BOM °°Àº Á¦¾îÄڵ带 »ìÆìº¸°í ½ÍÀºµ¥ ´ç±ÙÀ¸·Î ÀÌ ÆÄÀÏÀ» ¿¸é À©µµ¿ìÁî Æ÷¸ËÀ¸·Î ÀÚµ¿ º¯È¯µÇ¾î ¹ö¸°´Ù. ¹®¼¸¦ ÀÖ´Â ±×´ë·Î ¿ ¼ö ÀÖµµ·Ï ÀÚµ¿ º¯È¯À» ¿É¼ÇÀ» ¸¸µç´Ù. ÀÌ ¿É¼ÇÀº ÇÁ·¹ÀÓ¿¡ ¼±¾ðÇÏ°í »ý¼ºÀÚ¿¡¼ TRUE·Î ÃʱâÈÇÑ´Ù.
class CApiEdit : public CWindow
{
private:
....
BOOL bAutoConvert;
public:
....
BOOL GetAutoConvert() { return bAutoConvert; }
void SetAutoConvert(BOOL bAuto) { bAutoConvert=bAuto; }
};
CApiEdit::CApiEdit()
{
....
bAutoConvert=TRUE;
}
Æ÷¸Ë ÀÚµ¿ º¯È¯ ¿©ºÎ´Â ¹®¼¸¦ ¿©´Â ½ÃÁ¡¿¡¸¸ »ç¿ëµÇ¹Ç·Î °ªÀÌ ¹Ù²ï´Ù°í ÇØ¼ Ưº°È÷ ´çÀå ¾î¶² ÇൿÀ» ÃëÇÒ ÇÊ¿ä´Â ¾ø´Ù. ÀÌ ¿É¼ÇÀº SetText¿¡¼ ÂüÁ¶ÇÑ´Ù.
void CApiEdit::SetText(TCHAR *TextBuf, int dwSize)
{
TCHAR *dest;
int len;
TCHAR *fixed;
InitDoc();
if (bAutoConvert==FALSE) {
dwFormat=AE_FORMAT_WIN;
GetActiveView()->Insert(0,TextBuf,dwSize,FALSE);
return;
}
....
ÀÚµ¿ º¯È¯ »óŰ¡ ¾Æ´Ï¸é ¹«Á¶°Ç À©µµ¿ìÁî Æ÷¸ËÀ¸·Î ¼³Á¤ÇÏ°í ³»¿ëÀ» ±×´ë·Î ApiEdit¿¡ ´ëÀÔÇÑ´Ù. º¯È¯À» ÇÏÁö ¾ÊÀ¸¹Ç·Î »ç½Ç Æ÷¸ËÀÌ ¹«¾ùÀΰ¡´Â Áß¿äÇÏÁö ¾ÊÀ¸¸ç ¾î¶² ÇüÅ·Πº¼ °ÍÀΰ¡´Â »ç¿ëÀÚ°¡ ½ÇÇàÁß¿¡ ¿øÇϴ´ë·Î °áÁ¤ÇÒ ¼ö ÀÖ´Ù. Àá½Ã ÈÄ ÀÌ ¿É¼ÇÀ» µ¿ÀÛ ÆäÀÌÁö¿¡ ¹èÄ¡ÇÒ °ÍÀÌ´Ù.
Çí»ç ºä´Â ÁÙ´ç ¹ÙÀÌÆ® ¼öÀÎ bpl°ú ´ë¹®ÀÚ Ãâ·Â ¿É¼ÇÀÎ bCapital, ±¸ºÐ¼± Ãâ·Â ´ÜÀ§ÀÎ nHexSep ¼¼ °³ÀÇ ¿É¼ÇÀÌ ÀÖ´Ù. ¹°·Ð ¹è°æ»ö, ±Û²Ã, ÁÙ°£ µî ±âº» ºäÀÇ ¿É¼Çµµ ±×´ë·Î »ç¿ëÇÑ´Ù. ¿ÜºÎ¿¡¼ protected ¼Ó¼ºÀÎ ÀÌ ¿É¼ÇµéÀ» ¾×¼¼½ºÇÒ ¼ö ÀÖµµ·Ï Çí»ç ºä Ŭ·¡½º¿¡ ¿É¼Ç ¾×¼¼½º ÇÔ¼ö¸¦ ÀÛ¼ºÇÑ´Ù.
class CApiEditHexa : public CApiEditText
{
....
int GetBpl() { return bpl; }
void SetBpl(int abpl);
BOOL GetCapital() { return bCapital; }
void SetCapital(int aCapital);
int GetHexSep() { return nHexSep; }
void SetHexSep(int aHexSep);
};
GetÇÔ¼ö´Â °ª¸¸ ¸®ÅÏÇÏ¸é µÇ¹Ç·Î ÀζóÀÎÀ¸·Î ÀÛ¼ºÇß´Ù. SetÇÔ¼ö´Â ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÑ´Ù.
void CApiEditHexa::SetBpl(int abpl)
{
if (bpl != abpl) {
bpl=abpl;
UpdateScrollInfo();
SetCaret();
Invalidate(-1);
}
}
void CApiEditHexa::SetCapital(int aCapital)
{
if (bCapital != aCapital) {
bCapital=aCapital;
Invalidate(-1);
}
}
void CApiEditHexa::SetHexSep(int aHexSep)
{
if (nHexSep != aHexSep) {
nHexSep=aHexSep;
Invalidate(-1);
}
}
¿É¼ÇÀ» ´ëÀÔÇÑ ÈÄ ´Ù½Ã ±×¸®±â¸¸ ÇÏ¸é µÈ´Ù. ´Ü, bplÀÌ ¹Ù²î¸é ½ºÅ©·Ñ ¹ÙÀÇ ¹üÀ§°¡ Á¶Á¤µÇ¾î¾ß ÇϹǷΠ½ºÅ©·Ñ ¹ÙÀ§ ¹üÀ§¸¦ ´Ù½Ã ¼³Á¤Çϰí ij·µÀÇ À§Ä¡µµ ¿Å±ä´Ù. ½ºÅ©·Ñ ¹ÙÀÇ ¹üÀ§´Â ´ÙÀ½°ú °°ÀÌ °è»êÇÑ´Ù.
void CApiEditHexa::UpdateScrollInfo()
{
....
xMax=(bCol+bGap*bpl)*2;
si.nMax=xMax;
si.nPage=frt.right;
si.nPos=xPos;
SetScrollInfo(hHorzScroll, SB_CTL, &si, TRUE);
}
¼öÁ÷ ½ºÅ©·Ñ ¹üÀ§´Â GetRowCount¿¡¼ bplÀ» ÂüÁ¶ÇÏ¿© °è»ê ÁÙ ¼öÀÇ ¿µÇâÀ» ¹Þ°í ¼öÆò ½ºÅ©·Ñ ¹üÀ§´Â 16Áø Ãâ·Â ¿µ¿ªÀÇ µÎ ¹è·Î ´ëÃæ °è»êÇß´Ù. Çí»ç ºä¿¡ ¿É¼ÇÀÌ Ãß°¡µÇ¾úÀ¸¹Ç·Î ApiEdit ÇÁ·¹ÀÓ Å¬·¡½º¿¡µµ Set ÇÔ¼ö¸¦ ÀÛ¼ºÇØ¾ß ÇÑ´Ù. È£½ºÆ®ÀÇ ÀÔÀå¿¡¼´Â ºäÀÇ ¼³Á¤À» Á÷Á¢ ¹Ù²Ù´Â °ÍÀÌ ¾Æ´Ï¶ó ApiEdit ÄÁÆ®·ÑÀÇ ¿É¼ÇÀ» ¹Ù²Ù´Â °ÍÀ̱⠶§¹®¿¡ ÄÁÆ®·Ñ ÀÚü°¡ ÀÌ ¼³Á¤À» Áö¿øÇØ¾ß ÇÑ´Ù.
void CApiEdit::SetBpl(int abpl)
{
CApiEditHexa *pHexaView;
for (int aet=0;aet<4 && arView[aet];aet++) {
if (arView[aet]->ViewType == HEXA_VIEW) {
pHexaView=(CApiEditHexa *)arView[aet];
pHexaView->SetBpl(abpl);
}
}
}
void CApiEdit::SetCapital(int aCapital)
{
CApiEditHexa *pHexaView;
for (int aet=0;aet<4 && arView[aet];aet++) {
if (arView[aet]->ViewType == HEXA_VIEW) {
pHexaView=(CApiEditHexa *)arView[aet];
pHexaView->SetCapital(aCapital);
}
}
}
void CApiEdit::SetHexSep(int aHexSep)
{
CApiEditHexa *pHexaView;
for (int aet=0;aet<4 && arView[aet];aet++) {
if (arView[aet]->ViewType == HEXA_VIEW) {
pHexaView=(CApiEditHexa *)arView[aet];
pHexaView->SetHexSep(aHexSep);
}
}
}
Çí»çºä¿¡ ´ëÇØ¼¸¸ ¼³Á¤À» º¯°æÇßÀ¸¹Ç·Î ºä Áß¿¡ Çí»ç ºä°¡ ¾øÀ¸¸é ÀÌ ÇÔ¼öµéÀº ¾Æ¹«°Íµµ ÇÏÁö ¾Ê´Â´Ù. Get ÇÔ¼ö´Â ¿ÜºÎ¿¡¼ ÀÌ °ªÀ» ¾Ë¾Æ¾ß ÇÒ °æ¿ì°¡ ¸¹Áö ¾ÊÀ¸¹Ç·Î Á¦°øÇÏÁö ¾Ê¾Ò´Ù. Áï, ÀÌ ¿É¼ÇÀº ¿ÜºÎ¿¡¼ ÀÐÀ» ¼ö´Â ¾ø°í ¼³Á¤¸¸ ÇÒ ¼ö ÀÖ´Â ¾²±â Àü¿ëÀÇ ¿É¼ÇÀÌ´Ù. ÀÌÁ¦ ÄÁÆ®·ÑÀÇ Ãß°¡µÈ ¿É¼ÇµéÀ» È£½ºÆ®°¡ º¯°æÇÏ´Â Äڵ带 ÀÛ¼ºÇÑ´Ù. SOption ±¸Á¶Ã¼¿¡ ¶È°°Àº ¿É¼Ç º¯¼öµéÀ» Ãß°¡ÇÑ´Ù. ´ç±Ù 1.2¿¡¼ óÀ½À¸·Î Ãß°¡µÇ´Â ¿É¼ÇµéÀÌ´Ù.
struct SOption
{
....
int GetBpl();
int GetHexSep();
....
int bpl;
BOOL bCapital;
int nHexSep;
BOOL bAutoConvert;
};
¿É¼Ç °ü¸®ÀÇ ÆíÀǸ¦ À§ÇØ bpl°ú nHexSepÀº ÄÞº¸ ¹Ú½ºÀÇ À妽º·Î °ªÀ» ±â¾ïÇϱâ·Î ÇÑ´Ù. Init¿¡¼ ÀÌ º¯¼öµéÀ» ÃʱâÈÇϰí GetBpl, GetHexSep ÇÔ¼ö¸¦ Á¤ÀÇÇÑ´Ù. Load, Save ÇÔ¼ö¿¡¼´Â ÀÌ µÎ º¯¼öµµ ·¹Áö½ºÆ®¸®¿¡ ÀÐ°í ½á¾ß ÇÑ´Ù.
void SOption::Init()
{
....
bpl=2;
bCapital=TRUE;
nHexSep=1;
bAutoConvert=TRUE;
}
int SOption::GetBpl()
{
static int arBpl[]={4,8,16,24,32,48,64};
return arBpl[bpl];
}
int SOption::GetHexSep()
{
static int arHexSep[]={2,4,8,16};
return arHexSep[nHexSep];
}
void SOption::Load(TCHAR *Key)
{
....
SHRegReadString(SHCU,szKey,"prtBkText","",prtBkText,64);
// 1.2¿¡¼ Ãß°¡µÈ ¿É¼Çµé
bpl=SHRegReadInt(SHCU,szKey,"bpl",0);
bCapital=SHRegReadInt(SHCU,szKey,"bCapital",0);
nHexSep=SHRegReadInt(SHCU,szKey,"nHexSep",1);
bAutoConvert=SHRegReadInt(SHCU,szKey,"bAutoConvert",TRUE);
....
void SOption::Save(TCHAR *Key)
{
....
SHRegWriteString(SHCU,szKey,"prtBkText",prtBkText);
// 1.2¿¡¼ Ãß°¡µÈ ¿É¼Çµé
SHRegWriteInt(SHCU,szKey,"bpl",bpl);
SHRegWriteInt(SHCU,szKey,"bCapital",bCapital);
SHRegWriteInt(SHCU,szKey,"nHexSep",nHexSep);
SHRegWriteInt(SHCU,szKey,"bAutoConvert",bAutoConvert);
....
Load, Save ÇÔ¼ö´Â szKey¶ó´Â Áö¿ª º¯¼ö·Î ¼³Á¤°ªÀÌ ÀúÀåµÉ À§Ä¡¸¦ ±¸ºÐÇϴµ¥ ÀÌ Áö¿ª º¯¼ö°¡ SettingÀ϶§ °ªÀ» ÀÐ°í ½á¾ß ÇÑ´Ù. ¾Æ·¡ÂÊ¿¡´Â ±¸¹® ºÐ¼®±â¿Í Ftp ¼³Á¤ ¿É¼ÇÀ» ÀúÀåÇÏ´Â ÄÚµåµéÀÌ Àִµ¥ ÀÌ ÄÚµå¾Õ¿¡ »õ ¿É¼ÇÀ» ÀúÀåÇØ¾ß ÇÑ´Ù. ÀÌ ¿É¼ÇµéÀº ¼³Á¤ ´ëÈ»óÀÚÀÇ º¸±â ÆäÀÌÁö¿¡¼ °ü¸®ÇÑ´Ù. ViewDlgProc¿¡ ÀÌ ¿É¼ÇÀ» °ü¸®ÇÏ´Â Äڵ带 ÀÛ¼ºÇÑ´Ù.
BOOL CALLBACK ViewDlgProc(HWND hDlg,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
switch(iMessage) {
case WM_INITDIALOG:
....
hCon=GetDlgItem(hDlg,IDC_CBBPL);
SendMessage(hCon,CB_ADDSTRING,0,(LPARAM)"4");
SendMessage(hCon,CB_ADDSTRING,0,(LPARAM)"8");
SendMessage(hCon,CB_ADDSTRING,0,(LPARAM)"16");
SendMessage(hCon,CB_ADDSTRING,0,(LPARAM)"24");
SendMessage(hCon,CB_ADDSTRING,0,(LPARAM)"32");
SendMessage(hCon,CB_ADDSTRING,0,(LPARAM)"48");
SendMessage(hCon,CB_ADDSTRING,0,(LPARAM)"64");
hCon=GetDlgItem(hDlg,IDC_CBHEXSEP);
SendMessage(hCon,CB_ADDSTRING,0,(LPARAM)"2");
SendMessage(hCon,CB_ADDSTRING,0,(LPARAM)"4");
SendMessage(hCon,CB_ADDSTRING,0,(LPARAM)"8");
SendMessage(hCon,CB_ADDSTRING,0,(LPARAM)"16");
....
case WM_COMMAND:
....
case IDC_WRAP:
case IDC_CBBPL:
case IDC_CBHEXSEP:
switch (HIWORD(wParam)) {
case CBN_SELCHANGE:
case CBN_EDITCHANGE:
PropSheet_Changed(GetParent(hDlg),hDlg);
break;
}
return TRUE;
....
case IDC_NOFIRSTSPACE:
case IDC_CHKCAPITAL:
PropSheet_Changed(GetParent(hDlg),hDlg);
return TRUE;
....
case WM_NOTIFY:
switch (((LPNMHDR)lParam)->code) {
case PSN_SETACTIVE:
....
CheckDlgButton(hDlg,IDC_NOFIRSTSPACE,NewOption.bNoFirstSpace);
CheckDlgButton(hDlg,IDC_CHKCAPITAL,NewOption.bCapital);
....
SendDlgItemMessage(hDlg,IDC_CARETWIDTH,CB_SETCURSEL,NewOption.CaretWidth-1,0);
SendDlgItemMessage(hDlg,IDC_CBBPL,CB_SETCURSEL,NewOption.bpl,0);
SendDlgItemMessage(hDlg,IDC_CBHEXSEP,CB_SETCURSEL,NewOption.nHexSep,0);
....
case PSN_KILLACTIVE:
....
NewOption.bNoFirstSpace=IsDlgButtonChecked(hDlg,IDC_NOFIRSTSPACE);
NewOption.bCapital=IsDlgButtonChecked(hDlg,IDC_CHKCAPITAL);
....
NewOption.CaretWidth=SendDlgItemMessage(hDlg,IDC_CARETWIDTH,CB_GETCURSEL,0,0)+1;
NewOption.bpl=SendDlgItemMessage(hDlg,IDC_CBBPL,CB_GETCURSEL,0,0);
NewOption.nHexSep=SendDlgItemMessage(hDlg,IDC_CBHEXSEP,CB_GETCURSEL,0,0);
NewOption.RightWrap=GetDlgItemInt(hDlg,IDC_RIGHTWRAP,NULL,FALSE);
NewOption.ColMark=GetDlgItemInt(hDlg,IDC_COLMARK,NULL,FALSE);
return TRUE;
}
break;
}
return FALSE;
}
Æ÷¸Ë ÀÚµ¿ º¯È¯ ¿É¼ÇÀº µ¿ÀÛ ÆäÀÌÁö¿¡ ÀÛ¼ºÇÑ´Ù. ÇöÀç ½ÃÀÛÇÒ ¶§ ÀÚµ¿ °³Çà, ÇÑ±Û ÀÔ·Â »óÅ·ΠµÎ °³ÀÇ ¿É¼Ç¸¸ Àִµ¥ Æ÷¸Ë ÀÚµ¿ º¯È¯À» Ãß°¡ÇÑ´Ù.
BOOL CALLBACK OperationDlgProc(HWND hDlg,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
switch(iMessage) {
case WM_INITDIALOG:
return TRUE;
case WM_COMMAND:
switch (LOWORD(wParam)) {
case IDC_WORDWRAP:
case IDC_HANGUL:
case IDC_AUTOCONVERT:
PropSheet_Changed(GetParent(hDlg),hDlg);
break;
}
return TRUE;
case WM_NOTIFY:
LPNMHDR hdr;
hdr=(LPNMHDR)lParam;
switch (hdr->code) {
case PSN_SETACTIVE:
g_StartPage=10;
CheckDlgButton(hDlg,IDC_WORDWRAP,NewOption.bWrap);
CheckDlgButton(hDlg,IDC_HANGUL,NewOption.Hangul);
CheckDlgButton(hDlg,IDC_AUTOCONVERT,NewOption.bAutoConvert);
return TRUE;
case PSN_APPLY:
ApplyNow();
return TRUE;
case PSN_KILLACTIVE:
NewOption.bWrap=IsDlgButtonChecked(hDlg,IDC_WORDWRAP);
NewOption.Hangul=IsDlgButtonChecked(hDlg,IDC_HANGUL);
NewOption.bAutoConvert=IsDlgButtonChecked(hDlg,IDC_AUTOCONVERT);
return TRUE;
}
break;
}
return FALSE;
}
ApplyNow¿¡¼ ¿É¼ÇÀÌ º¯°æµÇ¸é Àû¿ëÇÑ´Ù.
void ApplyNow()
{
....
if (Option.bpl != NewOption.bpl) {
pSi->Ae.SetBpl(NewOption.GetBpl());
}
if (Option.bCapital != NewOption.bCapital) {
pSi->Ae.SetCapital(NewOption.bCapital);
}
if (Option.nHexSep != NewOption.nHexSep) {
pSi->Ae.SetHexSep(NewOption.GetHexSep());
}
hChild=GetWindow(hChild,GW_HWNDNEXT);
}
±âº» ¼³Á¤À» º¯°æÇÏ¸é ¿·Á ÀÖ´Â Çí»ç ºä¿¡ Áï½Ã Àû¿ëµÉ °ÍÀÌ´Ù. ´Ü, Æ÷¸Ë ÀÚµ¿ º¯È¯ ¿É¼ÇÀº ÀÌ¹Ì »ý¼ºµÈ ÄÁÆ®·Ñ¿¡´Â ¿µÇâÀ» ¹ÌÄ¡Áö ¾ÊÀ¸¹Ç·Î SetSetting ÇÔ¼ö¿¡¼ ÄÁÆ®·ÑÀÌ ¸¸µé¾îÁú ¶§¸¸ Àû¿ëÇÏ¸é µÈ´Ù.
void SetSetting(CApiEdit &Ae)
{
....
if (Option.bAutoConvert != Ori.bAutoConvert) {
Ae.SetAutoConvert(Option.bAutoConvert);
}
}
³ª¸ÓÁö ¿É¼ÇÀº Àû¿ë ½ÃÁ¡ÀÌ Á¶±Ý ¾Ö¸ÅÇѵ¥ ´ÙÀ½ Ç׿¡ °ü·Ã Äڵ带 ÀÛ¼ºÇÒ °ÍÀÌ´Ù.
ApiEdit°¡ »õ·Î »ý¼ºµÇ¸é ¹«Á¶°Ç ±âº» ºäÀÎ ÅØ½ºÆ® ºä Çϳª°¡ »ý¼ºµÈ´Ù. ÀÌÁø ÆÄÀÏÀ» ¿ ¶§´Â ÀÚµ¿À¸·Î Çí»ç ºä·Î º¯È¯ÇØ º¸ÀÚ.
void CApiEdit::SetText(TCHAR *TextBuf, int dwSize)
{
....
switch (dwFormat) {
case AE_FORMAT_WIN:
if (TestEnterCode(TextBuf,dwSize)==FALSE) {
len=FixEnterCode(TextBuf,dwSize,fixed);
GetActiveView()->Insert(0,fixed,len,FALSE);
free(fixed);
} else {
GetActiveView()->Insert(0,TextBuf,dwSize,FALSE);
}
break;
case AE_FORMAT_BINARY:
GetActiveView()->Insert(0,TextBuf,dwSize,FALSE);
if (dwFormat==AE_FORMAT_BINARY) {
ChangeViewType(0,HEXA_VIEW);
}
break;
default:
....
Æ÷¸ËÀ» Á¡°ËÇØ º¸°í ÀÌÁø ÆÄÀÏÀÌ¸é ºäÀÇ Å¸ÀÔÀ» ÀÚµ¿À¸·Î Çí»ç ºä·Î ¹Ù²Û´Ù. ÀÌ ÇÔ¼ö´Â »õ·Î ¸¸µé¾îÁø ApiEdit¿¡ ´ëÇØ È£ÃâµÇ¹Ç·Î ´ë»ó ºä´Â Ç×»ó 0¹øÀÌ´Ù. ÀÌÁ¦ ÀÌÁø ÆÄÀϵµ ¹Ù·Î ÆíÁýÇÒ ¼ö ÀÖÀ¸¹Ç·Î Àбâ Àü¿ëÀ¸·Î ¿ Çʿ䰡 ¾ø¾îÁ³´Ù. ÀÌÀü ¹öÀü¿¡¼´Â ÀÌÁø ÆÄÀÏÀ» Á¦´ë·Î ÆíÁýÇÒ ¼ö ¾øÀ¸¹Ç·Î ¹æ¾îÀûÀÎ Â÷¿ø¿¡¼ Àбâ Àü¿ëÀ¸·Î ¼³Á¤Çߴµ¥ ÀÌÁ¦´Â ±×·¸°Ô ÇÏÁö ¾Ê¾Æµµ µÈ´Ù.
BOOL OpenFromFile(TCHAR *Path, BOOL bReadOnly/*=FALSE*/, BOOL bBrowse/*=FALSE*/)
{
....
if (pSi->Ae.GetFormat() == AE_FORMAT_BINARY) {
pSi->Ae.SetReadOnly(TRUE);
}
»õ·Î »ý¼ºµÇ´Â ºä¿¡ ´ëÇÑ ¼³Á¤Àº SetSetting ÇÔ¼ö¿¡ ÀÛ¼ºÇØ¾ß Çϴµ¥ ¹®Á¦°¡ ¸¹´Ù. SetSettingÀº ApiEdit¸¦ »ý¼ºÇÏ´Â Áï½Ã È£ÃâµÇ¸ç ºä ŸÀÔ ÀüȯÀº SetText¿¡¼ ÇÑ´Ù. ±×·¡¼ SetSetting È£Ãâ ½ÃÁ¡¿¡¼ ApiEdit´Â ¹«Á¶°Ç ÅØ½ºÆ® ºä »óÅÂÀÌ¸ç ¿É¼ÇÀ» Àû¿ëÇÒ Çí»ç ºä°¡ ¾ÆÁ÷ ¸¸µé¾îÁ® ÀÖÁö ¾Ê´Ù. ´õ ½É°¢ÇÑ ¹®Á¦´Â »ý¼º Á÷ÈÄ »Ó¸¸ ¾Æ´Ï¶ó ChangeViewTypeÀÌ È£ÃâµÉ ¶§³ª SplitView·Î »õ ºä°¡ »ý¼ºµÉ¸¶´Ù ¸Å¹ø ¼³Á¤À» Àû¿ëÇØ¾ß ÇÑ´Ù´Â Á¡ÀÌ´Ù. ±×·¡¼ ±âº» ºä°¡ ¾Æ´Ñ ºäÀÇ ¼³Á¤À» Àû¿ëÇÏ´Â º°µµÀÇ ÇÔ¼ö°¡ ÇÊ¿äÇÏ´Ù. Config.cpp¿¡ ´ÙÀ½ ÇÔ¼ö¸¦ Ãß°¡ÇÑ´Ù.
// ±âº» ºä°¡ ¾Æ´Ñ ÆÄ»ý ºäÀÇ ¿É¼ÇÀ» ¼³Á¤ÇÑ´Ù.
void SetSettingView(CApiEditText *pView)
{
SOption Ori;
if (pView->ViewType == HEXA_VIEW) {
CApiEditHexa *pHexaView=(CApiEditHexa *)pView;
if (Option.bpl != Ori.bpl) {
pHexaView->SetBpl(Option.GetBpl());
}
if (Option.bCapital != Ori.bCapital) {
pHexaView->SetCapital(Option.bCapital);
}
if (Option.nHexSep != Ori. nHexSep) {
pHexaView->SetHexSep(Option. nHexSep);
}
}
}
ÀÌ ÇÔ¼ö´Â ºäÀÇ Å¸ÀÔÀ» ÀüȯÇÒ ¶§¸¶´Ù È£Ãâ °¡´ÉÇÏ´Ù. È£Ãâ ½ÃÁ¡Àº ºä°¡ »ý¼ºµÈ Á÷ÈÄÀÎ CreateView¿©¾ß Çϴµ¥ ÄÁÆ®·ÑÀº ÀÚ½ÅÀÌ Á÷Á¢ ºäÀÇ ¼³Á¤À» º¯°æÇÒ ¼ö ¾ø´Ù. ÄÁÆ®·ÑÀº ¼³Á¤ »óÅ¿¡ ´ëÇØ ¾Æ´Â ¹Ù°¡ ¾øÀ¸¸ç È£½ºÆ®¿¡°Ô ¼³Á¤À» ¹Ù²ã ÁÙ °ÍÀ» ¿äÃ»ÇØ¾ß ÇÑ´Ù. ÄÁÆ®·ÑÀÌ È£½ºÆ®ÀÇ ÇÔ¼ö¸¦ Á÷Á¢ È£ÃâÇÒ ¼ö´Â ¾ø´Âµ¥ ¿Ö³ÄÇϸé ÄÁÆ®·ÑÀº È£½ºÆ®¿¡ Á¾¼ÓÀûÀÌÁö ¾Ê±â ¶§¹®ÀÌ´Ù. ¿¹¸¦ µé¾î ChangeViewSettingÀ̶ó´Â ÇÔ¼ö¸¦ Á¦°øÇÑ´Ù¸é ÀÌ ÇÔ¼ö¸¦ Á¦°øÇÏÁö ¾Ê´Â È£½ºÆ®¿Í´Â »ç¿ëÇÒ ¼ö ¾ø°Ô µÈ´Ù.
±×·¡¼ ¼³Á¤ º¯°æ ¿äûÀ» ¸Þ½ÃÁö·Î º¸³»±â·Î ÇÑ´Ù. È£½ºÆ®°¡ ¸Þ½ÃÁö¸¦ ¹«½ÃÇÏ´õ¶óµµ ¼³Á¤¸¸ ¹Ù²îÁö ¾ÊÀ» »Ó µ¿ÀÛ¿¡´Â ÀÌ»óÀÌ ¾øÀ¸¹Ç·Î ÄÁÆ®·ÑÀÌ È£½ºÆ®¿¡ Á¾¼ÓµÇÁö´Â ¾Ê´Â´Ù. ¼³Á¤ ´ë»ó ºäÀÇ Æ÷ÀÎÅ͸¦ Àü´ÞÇØ¾ß Çϴµ¥ ÅëÁö ¸Þ½ÃÁö´Â ¿©ºÐÀÇ Á¤º¸¸¦ ½ÇÀ» °ø°£ÀÌ ¾øÀ¸¹Ç·Î »ç¿ëÇÒ ¼ö ¾ø´Ù. ±×·¡¼ WM_USER+1À» Á¤ÀÇÇϱâ·Î ÇÑ´Ù.
CApiEditText *CApiEdit::CreateView(int Type)
{
....
pView->Create(0,0,0,0,WS_CHILD | WS_VISIBLE,0,hWnd);
SendMessage(GetParent(hWnd),WM_USER+1,0,(LPARAM)pView);
return pView;
}
»õ·Î¿î ºä¸¦ ¸¸µç Á÷ÈÄ¿¡ ºÎ¸ð À©µµ¿ì¿¡°Ô WM_USER+1À» º¸³½´Ù. À̶§ lParamÀ¸·Î »ý¼ºµÈ ºäÀÇ Æ÷ÀÎÅ͸¦ Àü´ÞÇÑ´Ù. DgChildProc¿¡¼ ÀÌ ¸Þ½ÃÁö¸¦ ó¸®ÇÑ´Ù.
LRESULT CALLBACK DGChildProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
....
case WM_USER+1:
SetSetting2((CApiEditText *)lParam);
return 0;
SetSetting2 ÇÔ¼ö¸¸ È£ÃâÇÏ¸é µÈ´Ù. ChangeViewType, SplitView¿¡¼ CreateView¸¦ È£ÃâÇϹǷΠºÐÇÒ ¶Ç´Â ŸÀÔ º¯°æ½Ã Çí»ç ºäÀÇ ¼³Á¤ÀÌ Àû¿ëµÉ °ÍÀÌ´Ù.
ÄÁÆ®·ÑÀÌ È£½ºÆ®¿¡ Á¾¼ÓµÇÁö ¾Ê±â À§ÇØ WM_USER+1 »ç¿ëÀÚ Á¤ÀÇ ¸Þ½ÃÁö¸¦ »ç¿ëÇÏ´Â °ÍÀº ±×·° Àú·° ±¦ÂúÀº »ý°¢ÀÌ´Ù. ±×·±µ¥ ¿©±â¿¡µµ ¹®Á¦°¡ Àִµ¥ È£½ºÆ®°¡ ÀÌ¹Ì ÀÌ ¸Þ½ÃÁö¸¦ ¾²°í ÀÖÀ¸¸é ¾ÈµÈ´Ù. ¹ü¿ë¼ºÀ» ³ôÀ̱â À§ÇØ »ç¿ëÀÚ Á¤ÀÇ ¸Þ½ÃÁöÀÇ º£À̽º¸¦ º¯°æÇÒ ¼ö ÀÖ°Ô ÇÏ´Â °ÍÀÌ ÁÁ´Ù.
class CApiEdit : public CWindow
{
private:
....
UINT UserBase;
public:
....
UINT GetUserBase() { return UserBase; }
void SetUserBase(UINT aValue) { UserBase=aValue; }
};
»ý¼ºÀÚ¿¡¼ ÀÌ °ªÀ» ´ÙÀ½°ú °°ÀÌ ÃʱâÈÇÑ´Ù.
CApiEdit::CApiEdit()
{
....
UserBase=WM_USER+629;
}
WM_USER+629·Î ÃʱâÈÇߴµ¥ Áߺ¹ÀÇ À§ÇèÀÌ °ÅÀÇ ¾ø´Â ¼ýÀÚ¸¦ »ç¿ëÇßÀ¸¹Ç·Î È£½ºÆ®ÀÇ »ç¿ëÀÚ Á¤ÀÇ ¸Þ½ÃÁö¿Í Ãæµ¹µÇÁö ¾ÊÀ» °ÍÀÌ´Ù. Ȥ½Ã Ãæµ¹ÀÌ ¹ß»ýÇÑ´Ù¸é SetUserBase·Î º£À̽º¸¦ º¯°æÇÒ ¼ö ÀÖÀ¸¹Ç·Î ¿ª½Ã ¹®Á¦°¡ µÇÁö ¾Ê´Â´Ù. ¹Ù·Î ¾Õ¿¡¼ ÀÛ¼ºÇß´ø CreateView ÇÔ¼ö¸¦ ´Ù½Ã ¼öÁ¤ÇÑ´Ù.
CApiEditText *CApiEdit::CreateView(int Type)
{
....
pView->Create(0,0,0,0,WS_CHILD | WS_VISIBLE,0,hWnd);
SendMessage(GetParent(hWnd),UserBase+1,0,(LPARAM)pView);
return pView;
}
WM_USER+1 ´ë½Å UserBase+1 ¸Þ½ÃÁö¸¦ º¸³½´Ù. ¹Þ´Â Âʵµ ¼öÁ¤
LRESULT CALLBACK DGChildProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
....
pSi=(SInfo *)GetWindowLongPtr(hWnd,0);
if (pSi && iMessage > WM_USER) {
if (iMessage == pSi->Ae.GetUserBase()+1) {
SetSettingView((CApiEditText *)lParam);
return 0;
}
}
switch(iMessage) {
case WM_CREATE:
....
SetWindowLongPtr(hWnd,0,(LONG_PTR)pSi);
....
case WM_SETFOCUS:
pSi=(SInfo *)GetWindowLong(hWnd,0);
....
case WM_DESTROY:
pSi=(SInfo *)GetWindowLong(hWnd,0);
¸Þ½ÃÁö ID°¡ »ó¼ö°¡ ¾Æ´Ï¹Ç·Î switch¹®¿¡ Æ÷ÇÔ½Ãų ¼ö ¾øÀ¸¸ç if¹®À¸·Î Àü´ÞµÈ ¸Þ½ÃÁö°¡ »ç¿ëÀÚ Á¤ÀÇ ¸Þ½ÃÁöÀÎÁö ÆÇ´ÜÇØ¾ß ÇÑ´Ù. ÀÌ ÆÇ´ÜÀ» À§ÇØ pSi¸¦ ¹Ì¸® ±¸ÇßÀ¸¹Ç·Î ¾Æ·¡ÂÊÀÇ µÎ ¸Þ½ÃÁö¿¡¼´Â pSi¸¦ ±¸ÇÒ Çʿ䰡 ¾ø´Ù. pSi && iMessage > WM_USER Á¶°ÇÀº ÀÌ À©µµ¿ì°¡ ÀÌ¹Ì ¸¸µé¾îÁ® ÀÖ°í ¾ÆÁ÷ Á¸ÀçÇϰí Àִ°¡¿¡ ´ëÇÑ Áú¹®ÀÌ´Ù. Áï, WM_CREATE³ª WM_NCDESTROY¸¦ ¹Þ¾ÒÀ» ¶§´Â ¾ÆÁ÷ À©µµ¿ì ÃʱâȰ¡ ¾ÈµÇ¾ú°Å³ª ÆÄ±«°¡ ÁøÇàÁßÀ̱⠶§¹®¿¡ Ae°¡ ¿ÂÀüÈ÷ ÀÖ´Ù°í º¸ÀåÇÒ ¼ö ¾ø´Ù.
WM_CREATE¿¡¼ pSi¸¦ ÃÖÃÊ·Î ´ëÀÔÇÏ´Â ÇÔ¼ö°¡ SetWindowLongPtr·Î ¹Ù²î¾ú´Âµ¥ ÀÌ ÇÔ¼ö´Â SetWindowLong°ú ±â´ÉÀº ¶È°°Áö¸¸ 64ºñÆ®¸¦ Áö¿øÇÑ´Ù´Â Á¡ÀÌ ´Ù¸£´Ù. pSi Æ÷ÀÎÅͰ¡ 64ºñÆ® ½Ã½ºÅÛ¿¡¼´Â 64ºñÆ®·Î È®ÀåµÇ¹Ç·Î Àå·¡¸¦ À§ÇØ ¹Ì¸® 64ºñÆ® Áö¿ø Äڵ带 ¸¸µé¾î ³õ´Â °ÍÀÌ ÁÁ´Ù. À̸¦ À§ÇØ WinMainÀÇ DgChild À©µµ¿ì Ŭ·¡½º Á¤Àǹ®µµ ¼öÁ¤ÇØ¾ß ÇÑ´Ù.
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance
,LPSTR lpszCmdParam,int nCmdShow)
{
....
WndClassEx.lpszClassName="DGChild";
....
WndClassEx.cbWndExtra=sizeof(LONG_PTR);
RegisterClassEx(&WndClassEx);
sizeof(DWORD)´Â 4¹ÙÀÌÆ®ÀÇ °íÁ¤ ±æÀÌÁö¸¸ sizeof(LONG_PTR)Àº Ç÷§Æû¿¡ µû¶ó °¡º¯ÀûÀÎ ±æÀ̸¦ °¡Áø´Ù. ´çÀå ÇÊ¿äÄ¡´Â ¾ÊÁö¸¸ 64ºñÆ® À̽ļº È®º¸¸¦ À§ÇØ ÇÁ·ÎÁ§Æ®ÀÇ ¸ðµç GetWindowLong, SetWindowLongÀ» °Ë»öÇØ µÚ¿¡ PtrÀ» µ¡ºÙÀδÙ. ¶§·Î´Â ÀμöÀÇ À̸§ÀÌ ¹Ù²î´Â °æ¿ìµµ Àִµ¥ GWL_ID´Â GWLP_ID·Î ¹Ù²î°í DWL_MSGRESULT´Â DWLP_MSGRESULT·Î ¹Ù²ï´Ù. ÃÑ 40±ºµ¥°¡ Àִµ¥ Á¶±Ý ¹ø°Å·ÓÁö¸¸ ÀÌ Á¤µµ ³ë·ÂÀ¸·Î 64ºñÆ®·Î À̽ÄÇÒ ¼ö ÀÖ´Ù¸é ÃæºÐÈ÷ ÇÒ¸¸ÇÑ ÀÛ¾÷ÀÌ´Ù.
UserBase¸¦ ¹Ù²Ù¾î¾ß ÇÒ °æ¿ì´Â »ç½Ç °ÅÀÇ ¾ø´Ù. ±×·¯³ª °íÁ¤µÈ ¸Þ½ÃÁö ID¸¦ ÇÒ´çÇØ¾ß ÇÏ´Â °ÍÀº ÁÁÁö ¾Ê´Ù. Á¤ ÇÊ¿äÇϸé ÄÁÆ®·Ñ »ý¼º Á÷ÈÄ¿¡ SetUserBase ÇÔ¼ö·Î º¯°æÇÒ ¼ö ÀÖ´Ù. 629´Â ´Ü¼øÇÑ ÀÓÀÇÀÇ °ªÀÌµÇ ²À Àǹ̸¦ ¼³¸íÇÏÀÚ¸é ³ªÀÇ À½·Â »ýÀÏÀÌ´Ù.
ºäÀÇ Å¸ÀÔÀÌ ¹Ù²î¾úÀ» ¶§ È£½ºÆ®´Â »óŶõ¿¡ Á¤º¸¸¦ °»½ÅÇØ¾ß ÇÑ´Ù. ¼¼ °¡Áö °æ¿ì°¡ Àִµ¥ 1.â ºÐÇÒ 2.ºä ŸÀÔ Àüȯ 3.Æ÷Ä¿½º Àüȯ½ÃÀÌ´Ù. ºÐÇÒ ÇØÁ¦½Ã´Â ÇÊ¿äÇÒ ¶§ Æ÷Ä¿½º ÀüȯÀÌ ¹ß»ýÇϹǷΠµû·Î ó¸®ÇÏÁö ¾Ê¾Æµµ µÈ´Ù. ÀÌ ¼¼ °æ¿ì¿¡ ÄÁÆ®·ÑÀº ÅëÁö ¸Þ½ÃÁö¸¦ º¸³» Ȱ¼º ºä°¡ ¹Ù²î¾úÀ½À» È£½ºÆ®¿¡°Ô ¾Ë¸°´Ù.
#define AEN_CHANGE 1
#define AEN_MOVE 2
#define AEN_INSMODE 3
#define AEN_CHGMODI 4
#define AEN_CHGVIEW 5
´ÙÀ½ ¼¼ ÇÔ¼ö¿¡¼ ºäÀÇ Å¸ÀÔÀ» º¯°æÇÑ ÈÄ ÀÌ ÅëÁö ¸Þ½ÃÁö¸¦ È£½ºÆ®·Î º¸³½´Ù.
void CApiEdit::SplitView(int SplitType, int Ratio)
{
....
SendNotify(AEN_CHGVIEW);
}
void CApiEdit::ChangeActiveView(CApiEditText *pAe,int Who)
{
....
SendNotify(AEN_CHGVIEW);
}
void CApiEdit::ChangeViewType(int nView,int Type)
{
....
SendNotify(AEN_CHGVIEW);
}
È£½ºÆ®´Â ÀÌ ÅëÁö ¸Þ½ÃÁö¸¦ ¹Þ¾ÒÀ» ¶§ »óŶõÀ» °»½ÅÇÑ´Ù. ¹°·Ð À̿ܿ¡µµ ºäÀÇ Å¸ÀÔÀÌ º¯°æµÉ ¶§¸¶´Ù ÇØ¾ß ÇÒ ÀÏÀÌ ÀÖ´Ù¸é ¿øÇÏ´Â ÀÛ¾÷À» ´õ ÇÒ ¼ö ÀÖ´Ù.
LRESULT CALLBACK DGChildProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
....
case WM_COMMAND:
switch (LOWORD(wParam)) {
case 1:
switch (HIWORD(wParam)) {
....
case AEN_CHGVIEW:
SetStatusText(0xffff);
}
break;
}
return 0;
´ç±ÙÀº ÀÌ ÅëÁö ¸Þ½ÃÁö¸¦ ¹Þ¾ÒÀ» ¶§ »óŶõ Àüü¸¦ ¿ÏÀüÈ÷ ´Ù½Ã Ãâ·ÂÇÑ´Ù. ÇöÀç ÆíÁý À§Ä¡, °ãħ/»ðÀÔ ¸ðµå µîÀÇ Á¤º¸µéÀÌ È°¼º ºäÀÇ Á¤È®ÇÑ Á¤º¸´ë·Î °»½ÅµÈ´Ù.
Çí»ç ºä¿¡¼µµ Ŭ¸³º¸µå¸¦ »ç¿ëÇÒ ¼ö Àִµ¥ À̶§ º¹»çÇϰųª ºÙ¿© ³Ö´Â ´ë»óÀº ¿©ÀüÈ÷ ¼±ÅÃµÈ ºÎºÐÀÇ ¹®¼ÀÌ´Ù. ±×·±µ¥ ÀÌÁø ÆÄÀÏ ´ýÇÁ ¹®¼¸¦ ÀÛ¼ºÇÒ ¶§´Â Çí»ç ºäÀÇ ´ýÇÁ¸¦ ´«¿¡ º¸ÀÌ´Â ±×´ë·Î ÅØ½ºÆ®·Î º¹»çÇØ¾ß ÇÑ´Ù. ¹®¼ º¹»ç¿Í´Â ´Ù¸¥ ¸í·ÉÀ̹ǷΠº°µµÀÇ ÆË¾÷ Ç׸ñÀÌ ÇÊ¿äÇÏ´Ù. ApiEdit.h¿¡ ÆË¾÷ ¸Þ´º ID¸¦ Çϳª ´õ Ãß°¡ÇÑ´Ù.
#define IDM_AE_CUT 40001
#define IDM_AE_COPY 40002
#define IDM_AE_PASTE 40003
#define IDM_AE_SELALL 40004
#define IDM_AE_COPYAPPEND 40005
#define IDM_AE_CUTAPPEND 40006
#define IDM_AE_COPYDUMP 40007
ÆË¾÷ ¸Þ´º¸¦ Ãâ·ÂÇÏ´Â °ÍÀº ±âº» ºä¿¡¼ Çϱâ·Î ÇÑ´Ù. ¹°·Ð Á¶°Ç¿¡ ÀÇÇØ ÇöÀç ºä°¡ Çí»çÀÏ ¶§¸¸ ÀÌ ÆË¾÷ ¸Þ´º¸¦ Ãâ·ÂÇØ¾ß ÇÑ´Ù. Çí»ç ºä¿¡¼ ±âº» ºäÀÇ OnContextMenu¸¦ È£ÃâÇϹǷΠ¿©±â¼ ¸Þ´º Ç׸ñÀ» Ãâ·ÂÇÏ¸é µÈ´Ù.
void CApiEditText::OnContextMenu(HWND hWnd, HWND hwndContext, UINT xPos, UINT yPos)
{
HMENU hPopup;
POINT pt;
hPopup=CreatePopupMenu();
AppendMenu(hPopup,MF_STRING,IDM_AE_CUT,"Àß¶ó³»±â(&T)");
AppendMenu(hPopup,MF_STRING,IDM_AE_COPY,"º¹»ç(&C)");
if (ViewType == HEXA_VIEW) {
AppendMenu(hPopup,MF_STRING,IDM_AE_COPYDUMP,"´ýÇÁº¹»ç(&D)");
}
AppendMenu(hPopup,MF_STRING,IDM_AE_PASTE,"ºÙ¿©³Ö±â(&P)");
AppendMenu(hPopup,MF_STRING,IDM_AE_SELALL,"¸ðµÎ¼±ÅÃ(&A)");
....
¾îÂ÷ÇÇ ÅØ½ºÆ® ºä°¡ ´ëÇ¥À̹ǷΠ¿©±â¼ ÆË¾÷ ¸Þ´º¸¦ ÅëÇÕ °ü¸®ÇÏ´Â °ÍÀÌ ´õ Æí¸®ÇÏ´Ù. ´Ü, ÀÌ ¸í·É¿¡ ´ëÇÑ Ã³¸®´Â Çí»ç ºä°¡ Á÷Á¢ ÇØ¾ß ÇÑ´Ù. OnCommand¿¡¼ ±âº» ºä·Î 󸮸¦ ³Ñ±â±â Àü¿¡ ´ýÇÁ º¹»ç ¸í·ÉÀ̸é CopyDump¶ó´Â Çí»ç ºäÀÇ ¸â¹ö ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù.
void CApiEditHexa::OnCommand(HWND hWnd, int id, HWND hwndCtl, UINT codeNotify)
{
EndComp();
switch (id) {
case IDM_AE_COPYDUMP:
CopyDump();
return;
}
CApiEditText::OnCommand(hWnd,id,hwndCtl,codeNotify);
}
CHexaView Ŭ·¡½º¿¡ CopyDump¶ó´Â ¸â¹ö ÇÔ¼ö¸¦ ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÑ´Ù.
void CApiEditHexa::CopyDump()
{
HGLOBAL hmem;
TCHAR *ptr;
int SelFirst, SelSecond;
int st,ed;
TCHAR szText[1024];
int i,Line,nPos;
// º¹»ç ´ë»óÀº Ç×»ó ÁÙ ´ÜÀ§·Î ¼±Á¤ÇÑ´Ù.
if (SelStart == SelEnd) {
st=ed=off/bpl;
} else {
SelFirst=min(SelStart,SelEnd);
SelSecond=max(SelStart,SelEnd);
st=SelFirst/bpl;
ed=SelSecond/bpl;
}
hmem=GlobalAlloc(GHND, (ed-st+1)*bpl*10+1024);
ptr=(TCHAR *)GlobalLock(hmem);
// ¹üÀ§³»ÀÇ ÁÙ Ãâ·Â
for (Line=st;Line<=ed;Line++) {
nPos=Line*bpl;
wsprintf(szText,"%.8X ",nPos);
if (bCapital) _strlwr(szText);
lstrcat(ptr,szText);
// ¹ÙÀÌÆ® Ãâ·Â
for (i=nPos;i<nPos+bpl;i++) {
if (i < pFrame->doclen) {
wsprintf(szText,"%.2X ",(BYTE)pFrame->buf[i]);
if (bCapital==FALSE) _strlwr(szText);
lstrcat(ptr,szText);
}
}
// ¹®ÀÚ Ãâ·Â
lstrcat(ptr," ");
for (i=nPos;i<nPos+bpl;i++) {
if (i < pFrame->doclen) {
memset(szText,0,3);
if (i==nPos && pFrame->IsInDBCS(i)) {
szText[0]='.';
} else {
if (pFrame->IsDBCS(i) && !pFrame->IsEnterCode(i)) {
// Áß°£¿¡ 0ÀÌ ³ª¿Í¼´Â ¾ÈµÈ´Ù.
if (pFrame->buf[i+1] == 0) {
lstrcpy(szText,"..");
} else {
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]='.';
}
}
}
lstrcat(ptr,szText);
}
}
lstrcat(ptr,"\r\n");
}
GlobalUnlock(hmem);
if (OpenClipboard(hWnd)) {
EmptyClipboard();
SetClipboardData(CF_TEXT,hmem);
CloseClipboard();
}
}
Çí»ç ´ýÇÁ´Â ÁÙ ´ÜÀ§·Î ÇØ¼®Çϰųª Ãâ·ÂÇÏ´Â °ÍÀÌ º¸ÅëÀ̹ǷΠ´ýÇÁ º¹»ç´Â ¹Ýµå½Ã ÁÙ ´ÜÀ§·Î ¼öÇàÇÑ´Ù. ¼±Åà ¿µ¿ªÀÌ ÀÖÀ¸¸é ÀÌ ¿µ¿ªÀ» ÃëÇÏ°í ¾øÀ¸¸é ÇöÀç ÁÙÀ» ÃëÇÑ´Ù. ¹üÀ§³»ÀÇ ¸ðµç ÁÙ¿¡ ÇØ´ë ·çÇÁ¸¦ µ¹¸ç ¿ÀÇÁ¼Â, ¹ÙÀÌÆ®, ¹®ÀÚ¸¦ Â÷·Ê´ë·Î Ãâ·ÂÇÏ¸é µÈ´Ù. Ãâ·Â ÄÚµå´Â DrawLineÀÇ ÄÚµå¿Í ºñ½ÁÇÏµÇ È¸éÀ¸·Î Ãâ·ÂµÇÁö ¾Ê°í ÅØ½ºÆ® ¹öÆÛ·Î Ãâ·ÂµÈ´Ù´Â Á¡ÀÌ ´Ù¸£´Ù. ¼±Åà ºí·Ïµµ ¾ø°í »ö»óÀ» ½Å°æ¾µ Çʿ䵵 ¾ø´Ù.
ÅØ½ºÆ® ÇüÅ·ΠŬ¸³º¸µå¿¡ º¹»çÇØ¾ß ÇϹǷΠÁß°£¿¡ ³Î ¹®ÀÚ°¡ ³ª¿ÀÁö ¾Êµµ·Ï °¢º°È÷ ½Å°æ½á¾ß ÇÑ´Ù. Áß°£¿¡ ³ÎÀÌ ³ª¿À¸é ÀÌ´Â ´õ ÀÌ»ó ÅØ½ºÆ®°¡ ¾Æ´Ï¸ç Ŭ¸³º¸µå¿¡ CF_TEXT·Î º¹»çÇÒ ¼ö ¾ø´Ù. ÀÌÁø ÆÄÀÏ¿¡´Â 00À¸·Î µÈ ¹ÙÀÌÆ®°¡ ¾ÆÁÖ ÈçÇÏ´Ù. ¿ÀÇÁ¼ÂÀ̳ª ¹ÙÀÌÆ®¸¦ Ãâ·ÂÇÒ ¶§´Â ¹®ÀÚ¿·Î ¹Ù²î¹Ç·Î ³Î ¹®ÀÚ°¡ ³ª¿Ã¸®°¡ ¾ø´Ù. ÇÏÁö¸¸ ¿À¸¥ÂÊÀÇ ¹®ÀÚ¸¦ Ãâ·ÂÇÒ ¶§´Â ¹®ÀÚÄڵ带 ±×´ë·Î Ãâ·ÂÇϹǷΠ³Î ¹®ÀÚ°¡ ³ª¿Ã ¼öµµ ÀÖ´Ù. 00°¡ È¥ÀÚ ¿À´Â °æ¿ì´Â SBCSÀ̹ǷΠ. À¸·Î ´ëüµÇ¾î Ç¥½ÃµÇÁö¸¸ 0xc800ó·³ DBCSÀÇ µÚ¿¡ µû¶ó¿À´Â 00¸¦ ¹öÆÛ·Î ±×´ë·Î º¸³»¼´Â ¾ÈµÈ´Ù. DBCSÀÇ µÞ ¹ÙÀÌÆ®°¡ 0À̸é ..À¸·Î ´ëüÇß´Ù. »ç½Ç µÞ ¹ÙÀÌÆ®°¡ 00À̸é ÀÌ´Â Á¦´ë·Î µÈ DBCS ¹®ÀÚ°¡ ¾Æ´Ï´Ù.