3.¼¼ºÎ ±â´É ÀÛ¼º

°¡.Á¤º¸ Á¦°ø

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 ¹®ÀÚ°¡ ¾Æ´Ï´Ù.