3.¿­¸ðµåÀÇ µ¿ÀÛ

°¡.¿­ ¼±Åà »óÅ Á¶»ç

ApiEdit´Â ¼±Åÿµ¿ª¿¡ ´ëÇØ »èÁ¦, º¹»ç, À̵¿, ´ëü, ´ë¼Ò¹®ÀÚ º¯È¯, µé¿©¾²±â µîµî ¾ÆÁÖ ´Ù¾çÇÑ ÆíÁý µ¿ÀÛÀ» Áö¿øÇÑ´Ù. ÀÌ·± ÆíÁý ÇÔ¼öµéÀº ¹®¼­¿¡¼­ ¼±ÅÃµÈ ºí·ÏÀ» ³»ºÎÀûÀÎ º¯È¯ ¾Ë°í¸®ÁòÀ¸·Î Á¶ÀÛÇÑ ÈÄ ´Ù½Ã ½á ³Ö´Â ½ÄÀ¸·Î µ¿ÀÛÇÑ´Ù. ±×·±µ¥ ¿­¸ðµå·Î ¼±ÅÃÇÑ ºí·Ï¿¡ ´ëÇؼ­´Â °ð¹Ù·Î ¾î¶² ÀÛ¾÷À» ÇÒ ¼ö°¡ ¾ø´Ù. ¿Ö³ÄÇÏ¸é ¼±Åà ¹üÀ§°¡ ¹®¼­»óÀÇ ¿¬¼ÓµÈ ±¸°£ÀÌ ¾Æ´Ï¶ó ¿©·¯ÁÙ¿¡ Èð¾îÁø Á÷»ç°¢Çü ¿µ¿ªÀ̱⠶§¹®ÀÌ´Ù.

ÀÌ »óÅ¿¡¼­ ¼±Åúí·ÏÀÇ Ã¹ÁÙ¿¡ ´ëÇØ ¾î¶² ÀÛ¾÷À» ÇÏ¸é ´Ù¸¥ ÁÙÀÇ ¼±Åà »óÅ°¡ Áï°¢ÀûÀÎ ÇüÇâÀ» ¹Þ´Â´Ù. GetSelInLine ÇÔ¼ö´Â SelStart¿Í SelEndÀÇ ¿ÜÁ¢ »ç°¢ÇüÀ» ±¸ÇÏ°í ±× Çȼ¿°ªÀ¸·ÎºÎÅÍ °¢ ÁÙÀÇ ¼±Åà ¿µ¿ªÀ» ±¸Çϴµ¥ ¹®¼­°¡ Á¶±Ý¸¸ ¹Ù²î¾îµµ ¼±Åà ¿µ¿ªÀÌ ¿ÏÀüÈ÷ ´Þ¶óÁ® ¹ö¸®´Â °ÍÀÌ´Ù. ±×·¡¼­ ¿­ ¼±Åà »óÅ´ ¾î¶² ÀÛ¾÷À» Çϱâ Àü¿¡ ¹®¼­ÀÇ ¾î¶² ºÎºÐµéÀÌ ¼±Åúí·Ï¿¡ Æ÷ÇԵǾî ÀÖ´ÂÁö ÀÏ°ýÀûÀ¸·Î Á¶»çÇØ ³õÀ» ÇÊ¿ä°¡ ÀÖ´Ù. ¿­ ¼±Åà »óÅ´ ´ÙÀ½ ±¸Á¶Ã¼¿¡ ÀúÀåµÈ´Ù. ApiEdit.h¿¡ ±¸Á¶Ã¼¸¦ ¼±¾ðÇÑ´Ù.

 

struct Ae_SelTable

{

     int Line;

     int Start;

     int End;

};

 

°¢ ÁÙ¿¡ ´ëÇØ ¼±Åà ½ÃÀÛÁ¡°ú ³¡Á¡À» ±â¾ïÇÏ´Â ±¸Á¶Ã¼À̸ç ÀÌ ±¸Á¶Ã¼ÀÇ ¹è¿­À» ¸¸µé¸é Á÷»ç°¢ÇüÀÇ ¼±Åúí·Ï¿¡ ´ëÇÑ Á¤º¸¸¦ ÀÛ¼ºÇÒ ¼ö ÀÖ´Ù. ¿­ ¼±Åà »óÅ´ ºä¿¡¼­ ÇÊ¿ä·Î ÇϹǷΠÀÌ ±¸Á¶Ã¼¿¡ ´ëÇÑ Æ÷ÀÎÅÍ¿Í °ü·Ã ÇÔ¼ö´Â ºä¿¡ ¼±¾ðÇÑ´Ù. Àá½Ã ÈÄ Ãß°¡ÇÒ ÇÔ¼öÀÇ ¿øÇü±îÁö ¹Ì¸® ÀÛ¼ºÇØ ³õ¾Ò´Ù.

 

class CApiEditText : public CWindow

{

protected:

     ....

     Ae_SelTable *SelTable;

 

public:

     ....

     virtual int MakeSelTable();

     virtual void FreeSelTable();

     virtual void PasteColumn(int nPos,int aExtra,TCHAR *data);

     virtual void ColumnCopyString(BOOL bCopy,int to,int aExtra);

     virtual void ChangeCaseColumn(int action);

};

 

°¢ ÁÙÀÇ ¾îµð¼­ºÎÅÍ ¾îµð±îÁö°¡ ¼±ÅõǾî ÀÖ´ÂÁö¸¦ SelTable ±¸Á¶Ã¼ ¹è¿­¿¡ Á¶»çÇÒ °ÍÀÌ´Ù. ¼±Åúí·ÏÀÌ ¸îÁÙ·Î ±¸¼ºµÉÁö´Â ¹Ì¸® ¾Ë¼ö ¾øÀ¸¹Ç·Î SelTableÀº Ae_SelTable ŸÀÔÀÇ Æ÷ÀÎÅÍ·Î ¼±¾ðµÇ¾ú¸ç ¼±Åúí·ÏÀÇ ¼ö¸¸Å­ µ¿ÀûÀ¸·Î ÇÒ´çÇÒ °ÍÀÌ´Ù. ´ÙÀ½ ÇÔ¼ö´Â ÇöÀç ¼±Åúí·ÏÀ» SelTable¿¡ ÀÛ¼ºÇÑ´Ù.

 

int CApiEditText::MakeSelTable()

{

     int Size;

     int SelFirst, SelSecond;

     int c,rs,re,Line;

     int idx;

     int len=0;

 

     if (!bColumnMode || SelStart == SelEnd) return 0;

     Size=100;

     SelTable=(Ae_SelTable *)malloc(Size*sizeof(Ae_SelTable));

 

     SelFirst=min(SelStart,SelEnd);

     SelSecond=max(SelStart,SelEnd);

     GetRCFromOff(SelFirst,rs,c);

     GetRCFromOff(SelSecond,re,c);

     for (Line=rs,idx=0;Line<=re;Line++,idx++) {

          if (idx == Size-1) {

              Size+=100;

              SelTable=(Ae_SelTable *)realloc(SelTable,Size*sizeof(Ae_SelTable));

          }

          SelTable[idx].Line=Line;

          GetSelInLine(Line,SelTable[idx].Start,SelTable[idx].End);

          len+=SelTable[idx].End-SelTable[idx].Start+2;

     }

     SelTable[idx].Line=-1;

    

     return len;

}

 

void CApiEditText::FreeSelTable()

{

     if (SelTable) free(SelTable);

     SelTable=NULL;

}

 

MakeSelTableÀº ¹®¼­¸¦ ÀüÇô Á¶ÀÛÇÏÁö ¾ÊÀ¸¸ç GetSelInLineÀÌ Á¶»çÇÏ´Â °¢ ÁÙÀÇ ¼±Åà ¿µ¿ªÀ» SelTable¿¡ ±×´ë·Î ±â·ÏÇÑ´Ù. ¼±Åà ¿µ¿ªÀÇ ±æÀÌ¿¡ Á¦ÇÑÀÌ ¾øÀ¸¹Ç·Î SelTableÀÇ ±æÀ̵µ µ¿ÀûÀ¸·Î ÇÒ´çµÈ´Ù. ÀÌ ÇÔ¼ö´Â ¿­ ¸ðµå¿¡¼­ ¼±Åà ¿µ¿ªÀÌ ÀÖ´Ù´Â °¡Á¤ÇÏ¿¡¼­ µ¿ÀÛÇϹǷΠ¹Ýµå½Ã È£Ãâ¿ø¿¡¼­ ÀÌ Á¶°ÇÀÏ ¶§¸¸ È£ÃâÇØ¾ß ÇÑ´Ù.

¸®ÅÏ°ªÀº ¼±Åÿµ¿ªÀÇ ÃÑ ±æÀÌÀε¥ °¢ ÁÙ¸¶´Ù °³Çà ÄÚµå ±â·ÏÀ» À§ÇÑ 2¹ÙÀÌÆ®¾¿À» ´õ °è»êÇØ¾ß ÇÑ´Ù. Ŭ¸³º¸µå·Î º¹»çÇÒ ¶§ °¢ ÁÙÀ» °­Á¦ °³ÇàÇØ¾ß ÇϹǷΠ¿£ÅÍ Äڵ尡 ÇÊ¿äÇϸç ÀÌ ÇÔ¼ö°¡ ¸®ÅÏÇÑ ±æÀ̸¸Å­ ÇÒ´çÇÏ¸é µÈ´Ù.

FreeSelTableÀº SelTableÀ» ÇØÁ¦ÇÑ´Ù. ´Ù »ç¿ëÇßÀ¸¸é ¹Ýµå½Ã ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ÇÒ´çµÈ ¸Þ¸ð¸®¸¦ ¹Ý³³ÇØ¾ß ÇÑ´Ù. µÎ ÇÔ¼ö´Â Ç×»ó ¦À» ÀÌ·ç¾î »ç¿ëÇØ¾ß ÇÑ´Ù. Make¸¸ ºÎ¸£°í Free¸¦ »ý·«Çؼ­´Â ¾ÈµÇ¸ç Make´Â ¹«Á¶°Ç SelTableÀ» ÇÒ´çÇϹǷΠ»ý¼ºÀÚ¿¡¼­ SelTableÀ» ÃʱâÈ­ÇÏÁö ¾Ê¾Ò´Ù. ¼±Åà »óÅ¿¡¼­ »èÁ¦ÇÏ´Â ÇÔ¼ö´Â DeleteSelectionÀε¥ ÀÌ ÇÔ¼ö¿¡ ´ÙÀ½ Äڵ带 Ãß°¡ÇÑ´Ù.

 

BOOL CApiEditText::DeleteSelection()

{

     int SelFirst, SelSecond;

    int idx,Acc,linelen;

 

     if (SelStart != SelEnd) {

        if (!bColumnMode) {

               SelFirst=min(SelStart,SelEnd);

               SelSecond=max(SelStart,SelEnd);

              Delete(SelFirst,SelSecond-SelFirst);

               off=SelFirst;

        } else {

           MakeSelTable();

           pFrame->StartUndoGroup(16);

           for (idx=0,Acc=0;SelTable[idx].Line!=-1;idx++) {

               linelen=SelTable[idx].End-SelTable[idx].Start;

               Delete(SelTable[idx].Start-Acc,linelen);

               Acc+=linelen;

           }

           pFrame->EndUndoGroup();

           ExtraX=0;

           off=SelTable[0].Start;

           FreeSelTable();

        }

          SelStart=SelEnd=0;

          return TRUE;

     }

     return FALSE;

}

 

¿­ ¸ðµåÀÏ ¶§´Â SelTableÀ» ¸ÕÀú ÀÛ¼ºÇÏ°í °¢ ÁÙÀÇ ¼±Åà ¿µ¿ªÀ» ¼ø¼­´ë·Î »èÁ¦ÇÑ´Ù. À­ÁÙÀÌ »èÁ¦µÇ¸é ¾Æ·¡ÁÙÀÇ ¿ÀÇÁ¼ÂÀÌ º¯°æµÇ¹Ç·Î Acc¿¡ »èÁ¦µÈ ¹®ÀÚ¼ö¸¦ ±â¾ïÇÏ¿© ÀÌ ¿ÀÇÁ¼Â¸¸Å­ »©¸é¼­ ¾Æ·¡ÂÊÀ¸·Î »èÁ¦ÇØ¾ß ÇÑ´Ù. »èÁ¦ ÈÄ Ä³·µÀÌ ½ÇÁ¦ ¹®ÀÚ°¡ ÀÖ´Â °÷À¸·Î À̵¿ÇØ¾ß ÇϹǷΠExtraX´Â 0À¸·Î ¸¸µç´Ù. ¸ðµç »èÁ¦ µ¿ÀÛÀº ±×·ìÀ» ±¸¼ºÇÑ´Ù. ÀÌ µ¿ÀÛÀ» 16¹ø ID·Î Á¤ÀÇÇϸç Dangeun.cppÀÇ arGroupDesc ¹è¿­¿¡ ±×·ì µ¿ÀÛ¿¡ ´ëÇÑ ¼³¸íÀÌ ÀÌ¹Ì ÀÛ¼ºµÇ¾î ÀÖ´Ù.

¿­ »èÁ¦ ÈÄ off´Â ù¹ø° ¿­ÀÇ ¼±Åà ½ÃÀÛÁ¡À¸·Î À̵¿ÇÑ´Ù. ¸¶¿ì½º¸¦ ¾î´À ¹æÇâÀ¸·Î µå·¡±×ÇÏ´õ¶óµµ »ç°¢Çü ÇüÅ·Π¼±ÅõǹǷΠ¼±Åà ºí·ÏÀÇ Á»ó´ÜÁ¡Àº SelStart, SelEnd Áß ÀÛÀº °ÍÀÌ µÈ´Ù. ±×·¡¼­ off´Â SelFirst¿Í´Â ´Ù¸¥ °ªÀÌ µÉ ¼öµµ ÀÖ´Ù.

³ª.¿­ ¼±Åà Æ÷¸Ë

¿­ ¼±Åà µ¥ÀÌÅÍ´Â ÀÏ¹Ý ÅؽºÆ®¿Í´Â Æ÷¸ËÀÌ ´Ù¸£´Ù. ÅؽºÆ®À̱â´Â ÇÏÁö¸¸ ¿©·¯ Çà¿¡¼­ ÃßÃâÇÑ ºÎºÐ ¹®ÀÚ¿­ÀÇ ÁýÇÕÀ̹ǷΠÅؽºÆ®¿Í ±¸ºÐÇØ¾ß ÇÑ´Ù. ¿­ ¼±ÅÃµÈ ¹®ÀåÀ» Ŭ¸³º¸µå¸¦ ÅëÇØ º¹»ç ¹× ºÙ¿©³Ö±â ÇÏ·Á¸é º°µµÀÇ Å¬¸³º¸µå Æ÷¸ËÀ» µî·ÏÇØ¾ß ÇÑ´Ù. ´ÙÀ½ º¯¼ö¿Í ÇÔ¼ö¸¦ ¼±¾ðÇÑ´Ù.

 

class CApiEdit : public CWindow

{

private:

     ....

     static UINT AeColFormat;

 

public:

     ....

     static void RegisterAeColFormat();

 

°¢°¢ÀÇ CApiEdit °´Ã¼°¡ Æ÷¸ËÀ» µî·ÏÇÒ ÇÊ¿ä´Â ¾øÀ¸¹Ç·Î Æ÷¸Ë ID°ª°ú µî·Ï ÇÔ¼ö ¸ðµÎ ½ºÅÂƽÀ¸·Î ¼±¾ðÇÏ¿´´Ù. ApiEdit.cpp¿¡ ´ÙÀ½ Äڵ带 ÀÛ¼ºÇÑ´Ù.

 

UINT CApiEdit::AeColFormat;

 

void CApiEdit::RegisterAeColFormat()

{

     AeColFormat=RegisterClipboardFormat("ApiEdit_Column_Format");

}

 

Á¤Àû º¯¼ö¸¦ ¿ÜºÎ¿¡¼­ Á¤ÀÇÇÏ°í RegisterAeColFormat¿¡¼­ »õ·Î¿î Ŭ¸³º¸µå Æ÷¸ËÀ» µî·ÏÇÑ ÈÄ ±× ID¸¦ AeColFormat Á¤Àû º¯¼ö¿¡ ´ëÀÔÇÏ¿´´Ù. ÀÌ ÇÔ¼ö´Â µµ¿ì¹ÌÀÇ »ý¼ºÀÚ¿¡¼­ µü Çѹø¸¸ È£ÃâµÈ´Ù.

 

CRegisterHelper::CRegisterHelper()

{

     ....

     CApiEdit::RegisterAeColFormat();

}

 

µµ¿ì¹ÌÀÇ »ý¼ºÀÚ°¡ Æ÷¸ËÀ» µî·ÏÇϹǷΠCApiEdit °´Ã¼µéÀº Ç×»ó AeColFormat Æ÷¸ËÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù. ¿­ ¼±Åà Æ÷¸ËÀº ³Î Á¾·á ¹®ÀÚ¿­µéÀÇ ÁýÇÕÀ¸·Î Á¤ÀÇµÇ¸ç ³¡ Ç¥½Ã·Î 0xff¸¦ »ç¿ëÇÑ´Ù. º¹¼ö°³ÀÇ ¹®ÀÚ¿­À» Ç¥ÇöÇÒ ¶§ º¸Åë µÎ °³ÀÇ ³Î Á¾·á ¹®ÀÚ¿­·Î ³¡³ª´Â Æ÷¸ËÀ» ¸¹ÀÌ »ç¿ëÇϴµ¥ ÀÌ °æ¿ì´Â ºó ¹®ÀÚ¿­ÀÌ Áß°£¿¡ ÀÖÀ» ¼ö Àֱ⠶§¹®¿¡ µÎ °³ÀÇ ³Î·Î ³¡À» Ç¥½ÃÇÒ ¼ö ¾ø´Ù. ±×·¡¼­ ÅؽºÆ® ¹®¼­¿¡´Â Àß ³ª¿ÀÁö ¾Ê´Â 0xff ƯÀÌ°ªÀ» ³¡ Ç¥½ÄÀ¸·Î »ç¿ëÇß´Ù.

´Ù.º¹»ç

¿­ ¼±ÅÃµÈ ºí·ÏÀ» º¹»çÇÏ´Â Äڵ带 ÀÛ¼ºÇØ º¸ÀÚ. IDM_AE_COPY¿¡ ´ÙÀ½ Äڵ带 ÀÛ¼ºÇÑ´Ù.

 

void CApiEditText::OnCommand(HWND hWnd, int id, HWND hwndCtl, UINT codeNotify)

{

     HGLOBAL hmem;

     TCHAR *ptr;

     int SelFirst, SelSecond;

     TCHAR *ptr2;

    HGLOBAL hmem2;

    int len,idx,linelen,len2;

 

     switch (id) {

     case IDM_AE_CUT:

          ....

     case IDM_AE_COPY:

          if (SelStart != SelEnd) {

           if (!bColumnMode) {

                   SelFirst=min(SelStart,SelEnd);

                   SelSecond=max(SelStart,SelEnd);

                   hmem=GlobalAlloc(GHND, SelSecond-SelFirst+1);

                   ptr=(TCHAR *)GlobalLock(hmem);

                   memcpy(ptr,pFrame->buf+SelFirst,SelSecond-SelFirst);

                   GlobalUnlock(hmem);

                   if (OpenClipboard(hWnd)) {

                        EmptyClipboard();

                        SetClipboardData(CF_TEXT,hmem);

                        CloseClipboard();

                   }

           } else {

               len=MakeSelTable();

               hmem=GlobalAlloc(GHND, len+1);

               ptr=(TCHAR *)GlobalLock(hmem);

               for (idx=0;SelTable[idx].Line!=-1;idx++) {

                   linelen=SelTable[idx].End-SelTable[idx].Start;

                   memcpy(ptr,pFrame->buf+SelTable[idx].Start,linelen);

                   ptr+=linelen;

                   *ptr++='\r';

                   *ptr++='\n';

               }

               *ptr=0;

               GlobalUnlock(hmem);

 

               hmem2=GlobalAlloc(GHND, len+1);

               ptr2=(TCHAR *)GlobalLock(hmem2);

               for (idx=0;SelTable[idx].Line!=-1;idx++) {

                   linelen=SelTable[idx].End-SelTable[idx].Start;

                   memcpy(ptr2,pFrame->buf+SelTable[idx].Start,linelen);

                   ptr2+=linelen;

                   *ptr2++=0;

               }

 

               *ptr2=(TCHAR)0xff;

               GlobalUnlock(hmem2);

               FreeSelTable();

               if (OpenClipboard(hWnd)) {

                   EmptyClipboard();

                   SetClipboardData(CF_TEXT,hmem);

                   SetClipboardData(CApiEdit::AeColFormat,hmem2);

                   CloseClipboard();

               }

           }

          }

          return;

 

¿­ ¸ðµåÀÏ ¶§´Â ÅؽºÆ® Æ÷¸Ë°ú ¿­ Æ÷¸ËÀ» °°ÀÌ µî·ÏÇÑ´Ù. ÅؽºÆ® Æ÷¸Ëµµ ¿­ ¼±Åà »óÅ¿¡¼­´Â ±¸ÇÏ´Â ¹æ¹ýÀÌ ´Ù¸£´Ù. °¢ ÁÙÀÇ ¼±Åà ºÎºÐÀ» ÃëÇÕÇ쵂 °¢ ÁÙ ³¡¿¡´Â °³Çà Äڵ带 ºÙÀδÙ. ±×·¡¼­ ¿­ ¼±Åà »óÅ¿¡¼­ º¹»çÇÑ ÈÄ ´Ù¸¥ ÆíÁý±â¿¡ ºÙ¿© ³ÖÀ¸¸é °¢ ÁÙÀÌ °³ÇàµÈ »óÅ·ΠºÙ¿©Áø´Ù. ¿­ Æ÷¸ËÀº °¢ ÁÙ »çÀÌ¿¡ 0¸¦ ³Ö°í ¸¶Áö¸·¿¡ 0xff¸¦ ³Ö´Â´Ù. µÎ °³ÀÇ ºóÁÙÀÌ ¿¬´Þ¾Æ ³ª¿À¸é 0ÀÌ µÎ °³ ³ªÅ¸³¯ ¼ö ÀÖÀ¸¹Ç·Î ´õºí 0´Â »ç¿ëÇÒ ¼ö ¾ø´Ù. ´ÙÀ½Àº º¹»çÇؼ­ Ãß°¡Çϱ⸦ ÀÛ¼ºÇÑ´Ù.

 

     case IDM_AE_COPYAPPEND:

          if (!IsClipboardFormatAvailable(CF_TEXT)) {

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

              return;

          }

          if (SelStart != SelEnd) {

              OpenClipboard(hWnd);

              hmem=GetClipboardData(CF_TEXT);

              ptr=(TCHAR *)GlobalLock(hmem);

              GlobalUnlock(hmem);

              CloseClipboard();

 

           if (!bColumnMode) {

                   SelFirst=min(SelStart,SelEnd);

                   SelSecond=max(SelStart,SelEnd);

                   hmem=GlobalAlloc(GHND, lstrlen(ptr)+SelSecond-SelFirst+1);

                   ptr2=(TCHAR *)GlobalLock(hmem);

                   lstrcpy(ptr2,ptr);

                   memcpy(ptr2+lstrlen(ptr2),pFrame->buf+SelFirst,SelSecond-SelFirst);

                   GlobalUnlock(hmem);

                   if (OpenClipboard(hWnd)) {

                        EmptyClipboard();

                        SetClipboardData(CF_TEXT,hmem);

                        CloseClipboard();

                   }

           } else {

               len2=lstrlen(ptr);

               len=MakeSelTable();

 

               hmem=GlobalAlloc(GHND,len2+len+1);

               ptr2=(TCHAR *)GlobalLock(hmem);

               lstrcpy(ptr2,ptr);

               ptr2+=len2;

               for (idx=0;SelTable[idx].Line!=-1;idx++) {

                   linelen=SelTable[idx].End-SelTable[idx].Start;

                   memcpy(ptr2,pFrame->buf+SelTable[idx].Start,linelen);

                   ptr2+=linelen;

                   *ptr2++='\r';

                   *ptr2++='\n';

               }

               *ptr2=0;

               GlobalUnlock(hmem);

 

               if (IsClipboardFormatAvailable(CApiEdit::AeColFormat)) {

                   OpenClipboard(hWnd);

                   hmem2=GetClipboardData(CApiEdit::AeColFormat);

                   ptr=(TCHAR *)GlobalLock(hmem2);

                   GlobalUnlock(hmem2);

                   CloseClipboard();

                   len2=0;

                   ptr2=ptr;

                   while (*ptr2!=(TCHAR)0xff) {

                       len2++;

                       ptr2++;

                   }

 

                   hmem2=GlobalAlloc(GHND,len2+len+1);

                   ptr2=(TCHAR *)GlobalLock(hmem2);

                   memcpy(ptr2,ptr,len2);

                   ptr2+=len2;

                   for (idx=0;SelTable[idx].Line!=-1;idx++) {

                       linelen=SelTable[idx].End-SelTable[idx].Start;

                       memcpy(ptr2,pFrame->buf+SelTable[idx].Start,linelen);

                       ptr2+=linelen;

                       *ptr2++=0;

                   }

                   *ptr2=(TCHAR)0xff;

                   GlobalUnlock(hmem2);

               } else {

                   hmem2=NULL;

               }

               FreeSelTable();

               if (OpenClipboard(hWnd)) {

                   EmptyClipboard();

                   SetClipboardData(CF_TEXT,hmem);

                   if (hmem2) {

                       SetClipboardData(CApiEdit::AeColFormat,hmem2);

                   }

                   CloseClipboard();

               }

           }

          }

          return;

 

³í¸®´Â µ¿ÀÏÇÏÁö¸¸ ÄÚµå´Â ÈξÀ ´õ º¹ÀâÇÏ´Ù. ÀÌ ÇÔ¼ö°¡ È£ÃâµÇ¾úÀ» ¶§ÀÇ »óȲÀº ¼¼ °¡Áö »óÅ Áß ÇϳªÀÌ´Ù.

 

1.ÅؽºÆ®°¡ ¾ø´Ù. ÀÌ ¶§´Â IDM_AE_COPY¿Í µ¿ÀÏÇØÁø´Ù.

2.ÅؽºÆ®¿Í ¿­ Æ÷¸ËÀÌ ¸ðµÎ ÀÖ´Ù. µÎ Æ÷¸Ë ¸ðµÎ Ãß°¡ÇØ¾ß ÇÑ´Ù.

3.ÅؽºÆ®¸¸ ÀÖ°í ¿­ Æ÷¸ËÀº ¾ø´Ù. ApiEdit°¡ ¾Æ´Ñ ´Ù¸¥ ÇÁ·Î±×·¥À¸·Î ÅؽºÆ®¸¦ º¹»çÇØ ³õÀº °æ¿ìÀÌ´Ù. ÅؽºÆ®´Â Ãß°¡ÇÏ°í ¿­ Æ÷¸ËÀº »õ·Î ÀÛ¼ºÇØ ³Ö´Â´Ù.

 

¿­ Æ÷¸Ë¸¸ ÀÖ°í ÅؽºÆ®´Â ¾ø´Â °æ¿ì´Â Àý´ë·Î ¾ø´Ù. º¹»ç ÇÔ¼ö°¡ ¿­ Æ÷¸ËÀ» ³Ö±â Àü¿¡ ¹Ýµå½Ã ÅؽºÆ®¸¦ ¸ÕÀú ³Ö±â ¶§¹®ÀÌ´Ù. ±×·¡¼­ CF_TEXT°¡ ÀÖ´Ù°í Çؼ­ AeColFormatÀÌ ÀÖ´ÂÁö Á¡°ËÇÏÁö ¾Ê¾Æ¼­´Â °ï¶õÇÏ´Ù. Ãß°¡ÇÏ´Â ¹æ¹ýÀº ¿ø·ÐÀûÀÌ´Ù. À߶󳻱â, Àß¶ó¼­ Ãß°¡Çϱâ´Â °³³äÀûÀ¸·Î º¹»ç ÈÄ »èÁ¦À̸ç ÀÌ °³³äÀº ¿­ Æ÷¸Ë¿¡µµ ±×´ë·Î Àû¿ëµÇ¹Ç·Î ¼öÁ¤ÇÒ ÇÊ¿ä°¡ ¾ø´Ù.

¶ó.ºÙ¿© ³Ö±â

ºÙ¿© ³Ö´Â ÇÔ¼ö´Â º¹ÀâÇϹǷΠ¾Æ¿¹ µû·Î ¸¸µç´Ù. µå·¡±×Çؼ­ º¹»çÇÒ ¶§µµ ÀÌ ·çƾÀÌ ±×´ë·Î »ç¿ëµÈ´Ù. nPos¿ÀÇÁ¼ÂÀÇ aExtra À§Ä¡¿¡ data¸¦ »ðÀÔÇÑ´Ù. ¸®ÅÏ°ªÀº ÃÖÁ¾ »ðÀÔµÈ ¹®ÀÚ¿­ÀÇ ³¡ ¿ÀÇÁ¼ÂÀÌ´Ù.

 

void CApiEditText::PasteColumn(int nPos,int aExtra,TCHAR *data)

{

     int PasteX,Line,dummy,y;

     int nLine;

     int toff;

     int BkVirtualPos;

 

     BkVirtualPos=bVirtualPos;

     bVirtualPos=TRUE;

 

     GetXYFromOff(nPos,PasteX,dummy);

     GetRCFromOff(nPos,Line,dummy);

 

     for (nLine=Line;;nLine++) {

          if (*data==(TCHAR)0xff) {

              break;

          }

          if (nLine == TotalLine) {

              Insert(pFrame->doclen,"\r\n",2);

          }

          GetXYFromOff(pLine[nLine].Start,dummy,y);

          toff=GetOffFromXY(PasteX,y);

 

          if (lstrlen(data)) {

              InputExtraSpace(toff);

              Insert(toff,data,lstrlen(data));

          }

          data+=lstrlen(data)+1;

     }

     bVirtualPos=BkVirtualPos;

}

 

ÀÌ ÇÔ¼ö°¡ ºÙ¿©³Ö´Â ¿­ Æ÷¸ËÀº ¾È½Ã ¹®ÀÚ¿­ Æ÷¸Ë»ÓÀ̹ǷΠÀ¯´ÏÄڵ峪 À¯´Ð½º ½ºÅ¸ÀÏ µîÀ» °í·ÁÇÒ ÇÊ¿ä´Â ¾ø´Ù. ¿Ö³ÄÇÏ¸é ¿­ Æ÷¸ËÀ» ¸¸µé¾î ³»´Â ApiEditÀÇ ³»ºÎ Æ÷¸ËÀÌ ¾È½Ã Æ÷¸Ë»ÓÀ̱⠶§¹®ÀÌ´Ù. ¿­ Æ÷¸ËÀ» ºÙ¿© ³ÖÀ» ¶§´Â ºÙÀÏ ÁÙ¿¡ ´ëÀÀµÇ´Â ÁÙÀÌ ¾øÀ» ¼öµµ ÀÖÀ¸¸ç À̶§´Â Ãß°¡ ¿©¹éÀ» »ðÀÔÇÑ ÈÄ ¹®ÀÚ¿­À» ºÙ¿©¾ß ÇÑ´Ù. ±×·¡¼­ ÇÔ¼ö ¼±µÎ¿¡¼­ ÀÓ½ÃÀûÀ¸·Î °¡»ó À§Ä¡ ¿É¼ÇÀ» Àá½Ã Çã¿ëÇÑ´Ù. ½ÉÁö¾î ¹®¼­ ³¡¿¡¼­ ºÙ¿©³ÖÀ» ¶§´Â Á¸ÀçÇÏÁö ¾Ê´Â ºóÁÙÀ» ¸¸µç ÈÄ ÀÌ ÁÙ¿¡ ºÙ¿© ³Ö±â¸¦ ÇØ¾ß ÇÏ´Â °æ¿ìµµ ÀÖ´Ù. ºÙÀÏ ÁÙÀÌ TotalLineÀÌ¸é °³Çà Äڵ带 »ðÀÔÇÏ¿© ÇÑ ÁÙÀ» ´Ã¸° ÈÄ ºÙ¿© ³Ö±â¸¦ ÇÑ´Ù. ÀÌ ÇÔ¼ö´Â ºÙ¿© ³Ö±â ÇÔ¼ö°¡ ¿­ Æ÷¸ËÀ» ºÙÀ̱â À§ÇØ È£ÃâÇÑ´Ù. ºÙ¿© ³Ö±â ÄÚµå´Â ´ÙÀ½°ú °°´Ù.

 

     case IDM_AE_PASTE:

          BOOL bPrevSel;

          TCHAR *dest;

          int Format;

          if (IsClipboardFormatAvailable(CF_TEXT) && pFrame->bReadOnly==FALSE &&

              bCapture==FALSE) {

           if (IsClipboardFormatAvailable(CApiEdit::AeColFormat)) {

               OpenClipboard(hWnd);

               hmem=GetClipboardData(CApiEdit::AeColFormat);

               ptr=(TCHAR *)GlobalLock(hmem);

               pFrame->StartUndoGroup(17);

               DeleteSelection();

               PasteColumn(off,ExtraX,ptr);

               pFrame->EndUndoGroup();

               GlobalUnlock(hmem);

               CloseClipboard();

               Invalidate(pFrame->FindParaStart(off));

           } else {

                   InputExtraSpace(off);

                    if (SelStart != SelEnd) {

                        pFrame->StartUndoGroup(2);

                   }

                   bPrevSel=DeleteSelection();

                   OpenClipboard(hWnd);

                   hmem=GetClipboardData(CF_TEXT);

                   ptr=(TCHAR *)GlobalLock(hmem);

                   Format=pFrame->AnalyzeFormat(ptr, -1);

                   if (Format != AE_FORMAT_WIN) {

                        pFrame->ConvertFormat(Format,AE_FORMAT_WIN,ptr,dest);

                        Insert(off,dest,lstrlen(dest));

                        free(dest);

                   } else {

                        Insert(off,ptr,lstrlen(ptr));

                   }

                   if (bPrevSel) {

                        pFrame->EndUndoGroup();

                   }

                   GlobalUnlock(hmem);

                   CloseClipboard();

                   Invalidate(pFrame->FindParaStart(off));

                   off += lstrlen(ptr);

           }

              SetCaret();

          }

          return;

 

Ŭ¸³º¸µå¿¡¼­ ¿­ Æ÷¸Ë µ¥ÀÌÅ͸¦ ¸ÕÀú Á¶»çÇÏ°í ¼±Åà ¿µ¿ªÀÌ ÀÖÀ¸¸é ¸ÕÀú »èÁ¦ÇÑ ÈÄ ºÙ¿© ³Ö´Â´Ù. ¸ðµç µ¿ÀÛÀº ±×·ìÀ» ±¸¼ºÇÑ´Ù. ÆíÁý À§Ä¡(off)´Â °Çµå¸®Áö ¾Ê´Â´Ù.

¸¶.µå·¡±× Çϱâ

¿­ ¼±Åà ¿µ¿ªÀ» µå·¡±×Çؼ­ º¹»ç ¹× À̵¿½Ãų ¼öµµ ÀÖ´Ù. ÀÌ Ã³¸®´Â CopyString°ú´Â ¿ÏÀüÈ÷ ´Ù¸£´Ù. ¹®ÀÚ¿­À» À̵¿, º¹»çÇÏ´Â °úÁ¤µµ Ʋ¸®°í Ãë¼Ò ·¹Äڵ带 ÀÛ¼ºÇÏ´Â °Íµµ ´Ù¸£´Ù. À̵¿ ·¹Äڵ尡 ¾Æ´Ï¶ó ¿©·¯ °³ÀÇ »ðÀÔ, »èÁ¦ ·¹Äڵ尡 ¸¸µé¾îÁø´Ù. ±×·¡¼­ ¾Æ¿¹ ÇÔ¼ö¸¦ µû·Î ÀÛ¼ºÇß´Ù.

 

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

{

     if (bDragSel) {

          bDragSel=FALSE;

          if (IsInSelection(x+xPos, y+yPos)==TRUE) {

              ....

          } else {

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

                   SelLen=abs(SelStart-SelEnd);

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

               if (bColumnMode) {

                   ColumnCopyString(bControl,toff,ExtraX);

                   return;

               } else {

                        CopyString(bControl,min(SelStart,SelEnd),toff,SelLen);

               }

 

¿­¸ðµå¿¡¼­ µå·¡±×ÇÒ ¶§´Â ColumnCopyString ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù.

 

void CApiEditText::ColumnCopyString(BOOL bCopy,int to,int aExtra)

{

     TCHAR *Src,*ptr;

     int len,idx,linelen;

     int Acc;

 

     len=MakeSelTable();

     Src=(TCHAR *)malloc(len+1);

     ptr=Src;

     for (idx=0;SelTable[idx].Line!=-1;idx++) {

          linelen=SelTable[idx].End-SelTable[idx].Start;

          memcpy(ptr,pFrame->buf+SelTable[idx].Start,linelen);

          ptr+=linelen;

          *ptr++=0;

     }

     *ptr=(TCHAR)0xff;

 

     if (bCopy) {

          pFrame->StartUndoGroup(18);

     } else {

          pFrame->StartUndoGroup(19);

          for (idx=0,Acc=0;SelTable[idx].Line!=-1;idx++) {

              linelen=SelTable[idx].End-SelTable[idx].Start;

              Delete(SelTable[idx].Start-Acc,linelen);

              if (SelTable[idx].Start < to) {

                   to-=linelen;

              }

              Acc+=linelen;

          }

     }

     FreeSelTable();

 

     PasteColumn(to,aExtra,Src);

     pFrame->EndUndoGroup();

     free(Src);

 

     SelStart=SelEnd=off=to+aExtra;

     SetCaret();

     Invalidate(-1);

}

 

ÀÌ ÇÔ¼öÀÇ µ¿ÀÛ ¹æ½ÄÀº Ŭ¸³º¸µå·Î º¹»ç-ºÙ¿© ³Ö±â-(»èÁ¦) ¹æ½Ä°ú µ¿ÀÏÇÏ´Ù. ´Ü, Ŭ¸³º¸µå¸¦ Æı«Çؼ­´Â ¾ÈµÇ¹Ç·Î Src¶ó´Â º°µµÀÇ ¸Þ¸ð¸® ¿µ¿ªÀ» Ŭ¸³º¸µå ´ë½Å »ç¿ëÇÑ´Ù. º¹»ç ¹× À̵¿ ÈÄ »õ·Î º¹»çµÈ ºí·°À» ´Ù½Ã ¼±ÅÃÇÏÁö ¾Ê´Â´Ù. ¿Ö³ÄÇϸé ApiEdit´Â SelStart¿Í SelEnd¸¸À¸·Î ¸ðµç ¼±Åà ¿µ¿ªÀ» ±â¾ïÇÏ°í ¿­ ¼±Åà ºí·°Àº Çȼ¿ ÁÂÇ¥¸¦ ±âÁØÀ¸·Î Çϴµ¥ ºí·°ÀÇ À§Ä¡°¡ ¹Ù²î¸é ¸ð¾çµµ ¹Ù²î±â ¶§¹®ÀÌ´Ù. ¿¹¸¦ µé¾î ´ÙÀ½°ú °°ÀÌ ¼±ÅõǾî ÀÖ´Ù°í ÇØ º¸ÀÚ.

 

iiiii

WW

 

ÀÌ ºí·°ÀÌ À§Ä¡°¡ ¹Ù²î¸é ¹Ì¼¼ÇÑ Çȼ¿ Â÷ÀÌ¿¡ ÀÇÇØ ºí·°ÀÇ ¸ð¾çµµ ¹Ù²ð ¼ö ÀÖ´Ù. °íÁ¤ÆøÀ̶ó¸é ´Ù½Ã ¼±ÅÃÇÏ´Â °ÍÀÌ °¡´ÉÇÏÁö¸¸ °¡º¯Æø ±Û²Ã »óÅ¿¡¼­ ¿­ ¸ðµå°¡ °¡´ÉÇϱ⠶§¹®¿¡ ¿ø·¡ ¸ð¾çÀ» ±×´ë·Î º¹¿øÇÒ ¼ö°¡ ¾ø´Ù.

¹Ù.´ë¼Ò¹®ÀÚ º¯È¯

ÆíÁý ¸Þ´º¿¡ ¼±Åÿµ¿ª¿¡ ´ëÇØ µ¿ÀÛÇÏ´Â ¸¹Àº ¸í·ÉµéÀÌ ÀÖ´Ù. ´ëºÎºÐÀº ¹®´Ü¿¡ ´ëÇØ Àû¿ëµÇ´Â °ÍµéÀ̹ǷΠ¿­¸ðµå¿¡¼­ º°´Ù¸¥ 󸮸¦ ÇÒ ÇÊ¿ä°¡ ¾ø´Ù. ±×·¯³ª ´ë¼Ò¹®ÀÚ º¯È¯Àº ¿­¸ðµå·Î ¼±ÅÃÇÑ ¿µ¿ª¿¡ ´ëÇؼ­¸¸ Á¤È®ÇÏ°Ô º¯È¯ÇØ¾ß ÇÑ´Ù. ´ë¹®ÀÚ·Î, ¼Ò¹®ÀÚ·Î, ¹Ý´ë·Î ¼¼ µ¿ÀÛ¿¡ ´ëÇؼ­¸¸ º¯È¯ÇÏ°í ù±ÛÀÚ¸¸, ¹®Àå óÀ½¸¸Àº ±ÛÀÚ ´ÜÀ§ÀÇ ¾×¼ÇÀÌ ¾Æ´Ï¹Ç·Î ó¸®ÇÒ ÇÊ¿ä¾ø´Ù.

 

void CApiEditText::ChangeCase(int action)

{

     ....

     if (pFrame->bReadOnly) {

          return;

     }

 

    if (bColumnMode && SelStart != SelEnd) {

        if (action < 3) {

           ChangeCaseColumn(action);

        }

        return;

    }

 

     if (SelStart == SelEnd) {

     ....

 

¿­¸ðµåÀÌ°í ¼±Åÿµ¿ªÀÌ ÀÖÀ¸¸é º°µµÀÇ ÇÔ¼ö¸¦ µû·Î È£ÃâÇÑ´Ù. ¹°·Ð actionÀÌ 3ÀÌ»óÀÌ¸é ¾Æ¹«°Íµµ ÇÒ ÇÊ¿ä°¡ ¾ø´Ù. ¿­ÀÇ °¢ ÁÙ¿¡ ´ëÇØ ´ë¼Ò º¯È¯À» ÇØ¾ß ÇϹǷΠÁ÷Á¢ Çϱâ´Â ¾î·Æ°í º°µµÀÇ ÇÔ¼ö¸¦ µû·Î È£ÃâÇÑ´Ù. ÀÌ ÇÔ¼ö´Â ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÑ´Ù.

 

void CApiEditText::ChangeCaseColumn(int action)

{

     int idx;

     int bkSelStart,bkSelEnd;

 

     MakeSelTable();

     bColumnMode=FALSE;

     bkSelStart=SelStart;

     bkSelEnd=SelEnd;

     pFrame->StartUndoGroup(20);

 

     for (idx=0;SelTable[idx].Line!=-1;idx++) {

          SelStart=SelTable[idx].Start;

          SelEnd=SelTable[idx].End;

          if (SelStart!=SelEnd) {

              ChangeCase(action);

          }

     }

    

     pFrame->EndUndoGroup();

     bColumnMode=TRUE;

     SelStart=bkSelStart;

     SelEnd=bkSelEnd;

     FreeSelTable();

}

 

MakeSelTable·Î ¼±Åÿµ¿ªÀ» ±¸ÇØ ³õ°í °¢ÁÙ¿¡ ´ëÇØ ´Ù½Ã ChangeCase¸¦ È£ÃâÇÑ´Ù. À̶§ ChangeCase¸¦ Àá½Ã ¼ÓÀ̱â À§ÇØ ¼¼ °³ÀÇ ¸â¹ö º¯¼ö°ªÀ» »ì¦ ¹Ù²ã ³õ´Â´Ù. °¢ ÁÙ´ÜÀ§ÀÇ ¼±Åà ¿µ¿ª¿¡ ´ëÇØ ´ë¼Ò¹®ÀÚ º¯È¯À» ÇÒ °ÍÀÌ´Ù. ¹°·Ð ¸ðµç ÁÙ¿¡ ´ëÇÑ º¯È¯Àº °°Àº ÆíÁý ±×·ìÀ¸·Î ¹­¾î¾ß ÇÑ´Ù.

A°¡ B¸¦ ºÎ¸£°í B´Â ´Ù½Ã A¸¦ ºÎ¸£´Â »óÈ£ È£ÃâÀÇ ¿¹Àε¥ ½ÇÀü¿¡¼­ ÀÌ·± °æ¿ì´Â Á¤¸»·Î ÈçÇÏÁö ¾Ê´Ù. ¼­·Î È£ÃâÇÒ ¶§ÀÇ Á¶°ÇÀÌ ´Þ¶óÁö±â ¶§¹®¿¡ ¹«ÇÑ ·çÇÁ¿¡ ºüÁöÁö ¾Ê´Â´Ù. Áï A°¡ B¸¦ ºÎ¸¦ ¶§´Â Á¶°Ç K¸¦ ¸¸Á·Çϴµ¥ B°¡ ´Ù½Ã A¸¦ ºÎ¸¦ ¶§´Â Á¶°Ç K¸¦ ¾ø¾Ö°í ºÎ¸£±â ¶§¹®¿¡ A°¡ ´Ù½Ã B¸¦ ºÎ¸£Áö´Â ¾Ê´Â´Ù. ¿©±â¼­ K´Â bColumnMode¿¡ ÇØ´çÇÑ´Ù.

¸¸¾à ÀÌ·± »óÈ£ È£ÃâÀ» ÇÏÁö ¾Ê´Â´Ù¸é ¾öû³ª°Ô º¹ÀâÇØÁø´Ù. º¯È¯ ´ë»ó °í¸£°í Àӽà ¹öÆÛ¸¦ ÇÒ´çÇؼ­ º¹»çÇÏ°í, ¹öÆÛ ³¡±îÁö º¯È¯ÇÑ ÈÄ, Delete·Î Áö¿ì°í, Insert·Î »ðÀÔÇØ¾ß ÇÑ ÁÙ º¯È¯ÀÌ µÈ´Ù. ÀÌ·± 󸮸¦ ¿­ ¼±ÅÃµÈ ¸ðµç ÁÙ¿¡ ´ëÇØ ¹Ýº¹ÇØ¾ß ÇÏ°í ÆíÁý ±×·ì±îÁö ±¸¼ºÇØ¾ß ÇÑ´Ù. ÀÌ¹Ì ´Ù ¿Ï¼ºµÈ ÄÚµåÀ̹ǷΠÃÖ´ëÇÑ ÀçÈ°¿ëÇϱâ À§ÇØ »óÈ£ È£Ãâ ±â¹ýÀ» »ç¿ëÇß´Ù.

´ë¼Ò¹®ÀÚ º¯°æ ÈÄ ¼±Åà ¿µ¿ªÀÌ ¹Ù²ï´Ù. ¿Ö³ÄÇÏ¸é ±ÛÀÚÀÇ ÆøÀÌ ´Þ¶óÁö±â ¶§¹®ÀÌ´Ù. ºí·Ï º¹»ç ¹× À̵¿ÇÒ ¶§¿Í ¸¶Âù°¡Áö ÀÌÀ¯´Ù. Á¤ ÀÌ»óÇÏ´Ù¸é ChangeCaseColumn È£Ãâ ÈÄ¿¡ ClearSelectionÀ» È£ÃâÇÏ¸é µÈ´Ù. ±×·¯³ª Åë»ó ¾Æ·¡À§·Î ºñ½ÁÇÑ ´Ü¾îµéÀ» ¿­ ¸ðµå·Î ¼±ÅÃÇϱ⠶§¹®¿¡ Á¶±Ý ÀÌ»óÇØ º¸¿©µµ Å©°Ô ¹®Á¦°¡ µÇÁö´Â ¾ÊÀ» °Í °°´Ù. ¿­¸ðµå¿¡¼­ Àüü ¼±Åà ÀÚü°¡ Àǹ̰¡ ¾ø´Ù. °­Á¦·Î ¿­ ¸ðµå¸¦ Ǭ ÈÄ Àüü ¼±ÅÃÇÑ´Ù.

 

void CApiEditText::OnCommand(HWND hWnd, int id, HWND hwndCtl, UINT codeNotify)

{

     ....

     case IDM_AE_SELALL:

        if (bColumnMode) {

           SetColumnMode(FALSE);

        }

          SelStart=0;

          SelEnd=pFrame->doclen;

          off=SelEnd;

          Invalidate(-1);

          SetCaret();

          return;

 

°­Á¦·Î ¸ðµå¸¦ Ǭ´Ù´Â Á¡¿¡¼­ ¾à°£ÀÇ °í¹ÎÀÌ ÇÊ¿äÇÏÁö¸¸ º° ´Ù¸¥ ¹æ¹ýÀÌ ¾ø´Ù. Àüü ¼±ÅÃÀ̶ó´Â ¸í·É ÀÚü°¡ ¿­¸ðµå¿Í´Â ¾î¿ï¸®Áö ¾ÊÀ¸¹Ç·Î »ç¿ëÀÚ°¡ ÀÌ ¸í·ÉÀ» ³»·ÈÀ» ¶§ ¿­¸ðµå¸¦ ÇØÁ¦Ç϶ó´Â ¶æÀ¸·Î Çؼ®Çصµ ¹«¸®°¡ ¾ø´Ù.