¹Ù. ¹ö±× ¼öÁ¤

ÇÁ·Î±×·¥ °³¹ß°úÁ¤À̶õ ¹ö±×¿ÍÀÇ ²÷ÀÓ¾ø´Â ÀüÀïÀ̶ó°í Ç¥ÇöÇصµ ÁÁÀ» Á¤µµ·Î ´ëºÎºÐÀÇ ½Ã°£À» µð¹ö±ë¿¡ ÇÒ¾ÖÇØ¾ß ÇÑ´Ù. ´ç±Ù °³¹ß°úÁ¤¿¡¼­µµ ¹°·Ð ¼ö¸¹Àº ¹ö±×µéÀÌ ¹ß°ßµÇ¾ú°í ¹ß°ßµÇ´Â Á·Á· ÀÌÀü ÇÁ·ÎÁ§Æ®·Î µ¹¾Æ°¡ ´Ù½Ã ¼öÁ¤ÇØ ¿Ô´Ù. ¿©±â¼­ ¼öÁ¤ÇÒ ¹ö±×µéÀº º£Å¸2 ÀÌÈÄ¿¡ ¹ß°ßµÈ °ÍµéÀε¥ °£´ÜÇÑ ¹ö±×µéÀ̹ǷΠÀÌÀü ÇÁ·ÎÁ§Æ®¸¦ ¼öÁ¤ÇÏÁö ¸»°í ¸¶Áö¸· ÇÁ·ÎÁ§Æ®¸¸ ¼öÁ¤Çϱâ·Î ÇÑ´Ù.

ù ¹ø° ¹ö±×´Â ÀÚµ¿°³Çà »óÅ·Π½ÃÀÛÇÏÁö ¾Ê°í ¸¶ÁøÀÌ º¸ÀÌ´Â »óÅÂÀÏ ¶§ ij·µÀÌ ¸¶Áø ¾È¿¡ À§Ä¡ÇÑ´Ù´Â Á¡ÀÌ´Ù. ÀÌ ¹ö±×´Â ÃʱâÈ­ °úÁ¤ÀÇ Æ¯¼öÇÔÀ¸·Î ÀÎÇØ ¹ß»ýÇÑ °ÍÀε¥ SetCaret¿¡¼­ ij·µÀ» Æ÷¸ËÆÿµ¿ª ¾ÈÀ¸·Î ³Ö¾îÁÖ´Â Äڵ忡 ¹®Á¦°¡ ÀÖ¾ú´Ù. ij·µÀÌ ¼öÆò Æ÷¸ËÆÿµ¿ªÀ» ¹þ¾î³ª¸é È­¸éÀÇ Áß¾ÓÀ¸·Î ¿Å±âµµ·Ï µÇ¾î Àִµ¥ ÀÌ Äڵ忡 ÀÛ¾÷¿µ¿ªÀÇ ÆøÀÌ 0ÀÌ ¾Æ´Ï¶ó´Â Á¶°ÇÀÌ ÇÊ¿äÇÏ´Ù.

 

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

{

    RECT crt;

     ....

     GetXYFromOff(toff,x,y);

    GetClientRect(hWnd,&crt);

    if (bScrollToCaret && crt.right) {

          SendNotify(AEN_MOVE);

          if (nWrap==0) {

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

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

                   bScroll=TRUE;

              }

          }

 

´ç±ÙÀÇ Â÷Àϵ忡¼­ CApiEdit °´Ã¼¸¦ »ý¼ºÇÑ Á÷ÈÄ¿¡ SetSetting ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ÄÁÆ®·ÑÀÇ ¿©·¯ °¡Áö ¼³Á¤»óŸ¦ Á¶Á¤ÇÑ´Ù. À̶§ SetWrap(0) È£Ãâ¹®¿¡¼­ SetCaretÀ» È£ÃâÇÏ¿© ij·µÀÇ Ãʱâ À§Ä¡¸¦ ÁöÁ¤Çϴµ¥ À̶§´Â ¾ÆÁ÷ WM_SIZE ¸Þ½ÃÁö°¡ 󸮵ÇÁö ¾Ê¾Ò±â ¶§¹®¿¡ frt°¡ Æ÷¸ËÆÿµ¿ªÀ» Á¦´ë·Î Ç¥ÇöÇÏÁö ¸øÇÏ´Â »óÅÂÀÌ´Ù. ÀÌ »óÅ´ë·Î ij·µ À§Ä¡¿Í ¼öÆò½ºÅ©·Ñ À§Ä¡¸¦ Á¶Á¤ÇÏ´Ù º¸¸é xPos°¡ MarginWidth·Î ÃʱâÈ­µÇ¾î ¸¶Ä¡ ¸¶ÁøÆø¸¸Å­ ¿À¸¥ÂÊÀ¸·Î ½ºÅ©·ÑµÇ¾î ÀÖ´Â °ÍÀ¸·Î Âø°¢ÇÏ°Ô µÈ´Ù. ±×·¡¼­ ij·µÀÌ ¸¶Áø ¾ÈÂÊ, Áï ¼öÆòÁÂÇ¥ 0¿¡ ³ªÅ¸³ª´Âµ¥ Æ÷¸ËÆÿµ¿ªÀÌ Á¶»çµÇÁö ¾Ê¾ÒÀ» ¶§´Â ij·µÀÌ ÀÖ´Â °÷À¸·Î ½ºÅ©·Ñ ÇÏÁö ¾Êµµ·Ï ÇÏ¿´´Ù. ÀÛ¾÷¿µ¿ªÀÇ Å©±â¸¦ ±¸Çغ¸°í ÆøÀÌ 0ÀÌ¸é ¾ÆÁ÷ WM_SIZE¸¦ ó¸®ÇÏÁö ¾ÊÀº °ÍÀ¸·Î ÆÇ´ÜÇÑ´Ù.

µÎ ¹ø° ¹ö±×´Â ÆÄÀÏÅÇÀÇ À̹ÌÁö °ü¸® ¹ö±×Àε¥ ¡®À̸§¾øÀ½ 1¡¯À» »õ·Î ¸¸µé¾î ÆíÁýÇϸé ÀÌ ÆÄÀÏÀÌ ¼öÁ¤µÇ¾úÀ¸¹Ç·Î »¡°£»öÀ¸·Î Ç¥½ÃµÉ °ÍÀÌ´Ù. ÀÌ »óÅ¿¡¼­ ´Ù¸¥ ÆÄÀÏÀ» ¿­¸é OpenFromFile¿¡¼­ New ÇÔ¼ö¸¦ È£ÃâÇÏ°í DGChildProcÀÇ WM_CREATE¿¡¼­ »õ·Î ¸¸µé¾îÁø â¿¡ ¡®À̸§¾øÀ½ 1¡¯À̶ó´Â ÆÄÀϸíÀ» ºÙ¿©ÁØ´Ù. NewChild¿¡¼­¸¸ g_NewNo¸¦ Áõ°¡½ÃÅ°µµ·Ï Çسõ¾Ò±â ¶§¹®¿¡ »õ·Î ¿­¸®´Â âÀÇ À̸§ÀÌ ÀϽÃÀûÀ¸·Î ¡®À̸§¾øÀ½ 1¡¯ÀÌ µÈ ÈÄ ÃʱâÈ­°¡ ¿Ï·áµÈ ÈÄ OpenFileToChild ÇÔ¼ö¿¡ ÀÇÇØ Á¤È®ÇÑ ÆÄÀϸíÀ» ´Ù½Ã ¹Þ°Ô µÈ´Ù.

ÀÌ °úÁ¤¿¡¼­ »õ·Î ¿­¸®´Â âÀÇ SetText ÇÔ¼ö°¡ AEN_CHGMODI ÅëÁö ¸Þ½ÃÁö¸¦ º¸³»¸é SetStatusText ÇÔ¼ö¿¡¼­ ¡®À̸§¾øÀ½ 1¡¯ âÀ» ã¾Æ À̹ÌÁö¸¦ ÆĶõ»öÀ¸·Î º¯°æÇÏ°Ô µÈ´Ù. Áï, FindFileTab ÇÔ¼ö°¡ ÀÓ½ÃÀûÀ¸·Î ºÙ¿©Áø À̸§À¸·ÎºÎÅÍ ´ë»ó ÅÇÀ» À߸ø ã´Â °ÍÀÌ´Ù. ÀÌ ¹®Á¦´Â ±Ùº»ÀûÀ¸·Î pSi->NowFile¿¡ ÆÄÀϸíÀ» ºÙ¿©ÁÖ´Â ½Ã±â¸¦ À߸ø ¼±ÅÃÇ߱⠶§¹®¿¡ ¹ß»ýÇÑ´Ù. NewChild ÇÔ¼ö¿¡ ´ÙÀ½ Äڵ带 Ãß°¡ÇÑ´Ù.

 

HWND NewChild()

{

     HWND hChild;

     SInfo *pSi;

 

     g_NewNo++;

     hChild=New();

     pSi=(SInfo *)GetWindowLong(hChild,0);

    wsprintf(pSi->NowFile,"À̸§¾øÀ½ %d",g_NewNo);

    SetWindowText(hChild,pSi->NowFile);

     AddFileTab(pSi->NowFile);

     return hChild;

}

 

»õ·Î ¸¸µé¾îÁø â¿¡ ÆÄÀϸíÀ» ºÙÀÌ´Â ½Ã±â¸¦ âÀÌ ¿ÏÀüÈ÷ ¸¸µé¾îÁö°í ³­ ´ÙÀ½À¸·Î À̵¿½ÃÄ×´Ù. DGChildProcÀÇ WM_CREATE¿¡¼­ pSi->NowFile¿¡ ÆÄÀϸíÀ» ´ëÀÔÇÏ°í À©µµ¿ìÀÇ Ä¸¼ÇÀ» º¯°æÇÏ´Â ÄÚµå´Â »èÁ¦ÇÑ´Ù. ´ë½Å pSi->NowFile¿¡ ºó ¹®ÀÚ¿­À» ´ëÀÔÇÏ¿© ´ëÀÀµÇ´Â ÅÇÀ» ãÁö ¸øÇϵµ·Ï ÇÏ¿´´Ù.

 

LRESULT CALLBACK DGChildProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)

{

     switch(iMessage) {

     case WM_CREATE:

          ....

          pSi->Ae.Create(0,0,0,0,WS_CHILD | WS_VISIBLE,1,hWnd);

          SetSetting(pSi->Ae);

        wsprintf(pSi->NowFile,"");

          return 0;

 

¹®¼­Ã¢¿¡ ÆíÁýÆÄÀÏÀÇ À̸§À» ÁÖ´Â ÄÚµå´Â »õ ¹®¼­Ã¢À» ¸¸µå´Â NewChild ÇÔ¼ö¿Í ±âÁ¸ ¹®¼­¸¦ ¿ÏÀüÈ÷ ¿­¾úÀ» ¶§ÀÎ OpenFileToChild¿¡¸¸ ÀÖµµ·Ï Çß´Ù. ÀÌÁ¦ ÀÓ½ÃÀûÀÎ À̸§À¸·ÎºÎÅÍ ÅÇÀ» À߸ø ã´Â °æ¿ì°¡ ¾ø¾îÁú °ÍÀÌ´Ù.

¼¼ ¹ø° ¹ö±×´Â ´Ü¾î ã±â ÇÔ¼öÀÎ GetNowWord¿¡ Àִµ¥ ÀÌ ÇÔ¼ö´Â ¾ÕÂÊ ±¸ºÐÀÚ¸¦ ã°í ±¸ºÐÀÚ ´ÙÀ½ ¹®ÀÚºÎÅÍ ´ÙÀ½ ±¸ºÐÀÚ±îÁö¸¦ ´Ü¾î·Î °Ë»öÇÑ´Ù. ´Ü ¹®¼­ óÀ½°ú ³¡, ±¸ºÐÀÚ°¡ ¿¬¼ÓÀÎ °æ¿ì¿¡ ´ëÇؼ­´Â ¾ÕÂÊ ±¸ºÐÀÚ¿¡¼­ ´ÙÀ½ ¹®ÀÚ·Î À̵¿ÇÏÁö ¾Ê°í ´ÙÀ½ ±¸ºÐÀÚ¸¦ ãµµ·Ï ÇÏ¿´´Ù. ÀÌ ÄÚµå´Â ´ë°³ÀÇ °æ¿ì ¹®Á¦°¡ ¾øÁö¸¸ ¾ÆÁÖ Æ¯º°ÇÑ °æ¿ì¿¡ Á¦´ë·Î µ¿ÀÛÇÏÁö ¾Ê´Â´Ù. ¾î¶² °æ¿ìÀΰ¡ ÇÏ¸é ¹®¼­ óÀ½¿¡ ±¸ºÐÀÚ°¡ ÀÖ°í ´Ü¾î°¡ À̾îÁö´Â °æ¿ì, ±¸Ã¼ÀûÀÎ ¿¹¸¦ µéÀÚ¸é #include ¶ó´Â ¹®ÀÚ¿­·Î ½ÃÀÛµÉ ¶§ÀÌ´Ù.

À̶§ include¸¦ ´õºíŬ¸¯Çصµ ´Ü¾î·Î ¼±ÅõÇÁö ¾Ê´Âµ¥ ¾ÕÂÊÀ¸·Î ±¸ºÐÀÚ #À» ãÀº ÈÄ ÀÌ ÀÚ¸®¿¡¼­ ´ÙÀ½ ¹®ÀÚ·Î À̵¿ÇÏÁö ¾Ê°í ´ÙÀ½ ±¸ºÐÀÚ¸¦ ã±â ¶§¹®ÀÌ´Ù. ±×·¡¼­ ¹®¼­ÀÇ Ã³À½ÀÌ°í ù ¹®ÀÚ°¡ ±¸ºÐÀÚÀ̸é ÀÏ´Ü ÇÑ Ä­ ´ÙÀ½À¸·Î À̵¿ÇÑ ÈÄ ´Ü¾î¸¦ ãµµ·Ï ÇÏ¿´´Ù. if¹®ÀÇ nPos!=0 Á¶°Ç¿¡ ù ¹®ÀÚ°¡ ±¸ºÐÀÚÀÎÁö Á¶»çÇÏ´Â Á¶°ÇÀ» OR·Î ¿¬°áÇÑ´Ù. Áï ¹®¼­ óÀ½ÀÌ´õ¶óµµ ±× À§Ä¡ÀÇ ¹®ÀÚ°¡ ±¸ºÐÀÚÀ̸é ÀÏ´Ü ±¸ºÐÀÚ¸¦ °Ç³Ê ¶Ùµµ·Ï ÇÔÀ¸·Î½á ±¸ºÐÀÚ ´ÙÀ½ÀÇ ´Ü¾î¸¦ ¼±ÅÃÇϵµ·Ï Çß´Ù.

 

void CApiEdit::GetNowWord(int nPos, int &s, int &e)

{

     for (;;nPos--) {

          if (IsDelimiter(nPos)==TRUE || nPos==0) {

              break;

          }

     }

 

    if ((nPos != 0 || IsDelimiter(nPos)) &&

          nPos != doclen && IsDelimiter(nPos+1)==FALSE) {

          nPos++;

     }

     s=nPos;

 

³× ¹ø° ¹ö±×´Â ºñ±³Àû °£´ÜÇÑ ½Ç¼ö¿¡¼­ ºñ·ÔµÇ¾ú´Ù. UpdateLineInfo ÇÔ¼ö´Â Á¤·ÄÇÑ °á°ú ÃÑ ÁÙ ¼ö°¡ ¸¸ÁÙÀÌ ³Ñ¾î°¡°Å³ª ¶Ç´Â ¸¸ÁÙ ÀÌÇÏ·Î ÁÙ¾îµé ¶§ ¸¶Áø ÆøÀ» µ¿ÀûÀ¸·Î Á¶Á¤Çϱâ À§ÇØ WM_SIZE ¸Þ½ÃÁö¸¦ ´Ù½Ã º¸³»´Âµ¥ À̶§ GetXYFromOff°¡ ÂüÁ¶ÇÏ´Â off°¡ ¹«È¿À̱⠶§¹®¿¡ ¹«ÇÑ ·çÇÁ·Î ºüÁ®µå´Â ¹®Á¦°¡ ÀÖ´Ù. ÀÌ ¹®Á¦¸¦ ÇØ°áÇÏ·Á¸é ÀÏ´Ü UpdateLineInfo ÇÔ¼ö°¡ ¿ÏÀüÈ÷ ½ÇÇàÀ» ¸¶Ä£ ÈÄ ´Ù½Ã Á¤·ÄÇØ¾ß ÇϹǷΠSendMessage ´ë½Å PostMessage¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù.

´Ù¼¸ ¹ø° ¹ö±×µµ »ç¼ÒÇÑ ½Ç¼ö·Î ÀÎÇØ ¹ß»ýÇÑ °ÍÀε¥ ¹ö±×¶ó±âº¸´Ù´Â ÄÚµåÀÇ ¿ÀŸ¶ó°í º¸´Â °ÍÀÌ ¿ÀÈ÷·Á ¸ÂÀ» °Í °°´Ù. µ¤¾î¾²±â ¸ðµåÀÏ ¶§ SetCaret ÇÔ¼ö¿¡¼­ ij·µÀ» ÇöÀç À§Ä¡ÀÇ ¹®ÀÚÆøÀ¸·Î °è»êÇϴµ¥ ÇöÀç À§Ä¡´Â off°¡ ¾Æ´Ï¶ó ÇÑ±Û Á¶¸³ÁßÀÏ ¶§ÀÇ À§Ä¡¸¦ °í·ÁÇÑ toff¿©¾ß ÇÑ´Ù.

 

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

{

     ....

     if (bOvr) {

          if (IsDBCS(toff)) {

              if (buf[toff] == '\r') {

                   caretwidth=arChWidth[' '];

              } else {

               caretwidth=GetCharWidth(buf+toff,2);

              }

          } else {

           caretwidth=GetCharWidth(buf+toff,1);

          }

     }

 

¿©¼¸ ¹ø° ¹ö±×´Â IsDBCS ¸â¹öÇÔ¼ö¿¡ Àִµ¥ ÀÌ ÇÔ¼ö¸¦ ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇÑ´Ù. IsDBCSLeadByte ÇÔ¼ö¸¦ »ç¿ëÇÏÁö ¾Ê°í ÃÖ»óÀ§ ºñÆ®°¡ 1ÀÎÁö º¸µµ·Ï Çß´Ù.

 

inline BOOL CApiEdit::IsDBCS(int nPos)

{

     return ((buf[nPos] & 0x80) != 0/*IsDBCSLeadByte(buf[nPos])*/

          || (buf[nPos]==¡®\r¡¯ && buf[nPos+1]==¡®\n¡¯));

}

 

µÎ ¹æ½Ä°£ÀÇ Â÷ÀÌÁ¡Àº °ÅÀÇ ¾øÀ¸¸ç 0x80À¸·Î ½ÃÀ۵Ǵ ¹®ÀÚ¸¦ 2¹ÙÀÌÆ® ¹®ÀÚ·Î º¼ °ÍÀΰ¡ ¾Æ´Ï¸é 1¹ÙÀÌÆ® ¹®ÀÚ·Î º¼ °ÍÀΰ¡¸¸ ´Ù¸£´Ù. IsDBCSLeadByte ÇÔ¼ö´Â 0x80À» 1¹ÙÀÌÆ®·Î Á¶»çÇϴµ¥ ÀÌ µ¿ÀÛÀÌ ÇÑ±Û ¹®¼­¿Í´Â ¸ÂÁö ¾Ê´Â °æ¿ì°¡ ÀÖ´Ù. Á¶ÇÕÇü ¹®¼­¸¦ ÄÁ¹öÆÃÇÒ °æ¿ì 0x80¹®ÀÚ°¡ ³ªÅ¸³¯ ¼ö Àִµ¥ À̶§ ÀÌ ¹®ÀÚ¸¦ 2¹ÙÀÌÆ®·Î Á¶»çÇÏÁö ¾ÊÀ¸¸é ÇѱÛÀÇ °æ°è¿¡ °ÉÄ¡±â ¶§¹®¿¡ ´Ù¿îµÉ À§ÇèÀÌ ÀÖ´Ù. Åë»óÀÇ °æ¿ì 0x80ÄÚµå´Â ÅؽºÆ® ÆÄÀÏ¿¡ ³ªÅ¸³ªÁö ¾Ê±â ¶§¹®¿¡ Å« Â÷À̸¦ ´À³¢±â´Â ¾î·Æ´Ù.