1.ÀÌÁø ÆíÁý Áö¿ø

°¡.ÀÌÁø µ¥ÀÌÅÍÀÇ ±æÀÌ

´ç±Ù 1.0Àº ÅؽºÆ®¸¸À» ´Ù·ç¾ú´Ù. ±×·¯³ª ½ÇÁ¦·Î ÅؽºÆ® ÆÄÀÏÀ̶ó ÇÏ´õ¶óµµ ¹®ÀÚ°¡ ¾Æ´Ñ ´Ù¸¥ Á¤º¸, ¿¹¸¦ µé¾î ÆùÆ®¿¡ ¾ø´Â ±×·¡ÇÈ ¹®ÀÚ³ª ÅؽºÆ® ÆÄÀÏ¿¡´Â ³ª¿Ã ¼ö ¾ø´Â Äڵ尡 ÀÖÀ» °¡´É¼ºÀº Ç×»ó ÀÖ´Ù. °³¹ßÁß¿¡ À߸ø ¸¸µé¾îÁø ÆÄÀÏ, ´Ù¿î·Îµå ¹Þ´Ù°¡ Áß°£¿¡ À߸° ÆÄÀÏ, ÇÏµå µð½ºÅ©ÀÇ ¹°¸®ÀûÀÎ ¿À·ù·Î ÀÎÇØ ¼Õ»óµÈ ÆÄÀÏ µîÀÇ °æ¿ì ¿ÂÀüÇÑ ÅؽºÆ® ÆÄÀÏÀÌ ¾Æ´Ï´Ù. ÀÌ·± ÆÄÀÏÀÌ ±×¸® ÈçÇÏÁö´Â ¾ÊÁö¸¸ ¹®Á¦´Â ÀÌ·± ÆÄÀÏÀ» ¿­¸é ´ç±ÙÀÌ ´Ù¿îµÈ´Ù´Â Á¡ÀÌ´Ù.

´ç±ÙÀº Àμ⠰¡´ÉÇÑ ¹®ÀÚ¸¸ ´ã°í ÀÖ°í Áß°£¿¡ ³Î ¹®ÀÚ°¡ ¾øÀ¸¸ç Á¦¾î Äڵ嵵 Á¤È®ÇÏ°Ô ÀÛ¼ºµÇ¾î ÀÖ´Â ÆÄÀϸ¸ ¿­ ¼ö ÀÖ´Ù. ÀÌ°ÍÀº 1.0ÀÇ ¹ö±×¶ó±âº¸´Ù´Â ÇÑ°è¶ó°í Ç¥ÇöÇØ¾ß ¿ÇÀ» °ÍÀÌ´Ù. ¹®Á¦°¡ µÈ´Ù´Â °ÍÀº ¾Ë¾ÒÁö¸¸ ÅؽºÆ® ÆíÁý±â´ä°Ô ÆíÁý µ¥ÀÌÅ͸¦ ¿ÂÀüÇÑ ÅؽºÆ®·Î¸¸ ±¹ÇÑÇß´ø °ÍÀÌ´Ù. ±×·¯³ª ÇÁ·Î±×·¥Àº ¾î¶°ÇÑ ±¸Á¶ÀÇ µ¥ÀÌÅÍ°¡ ÀԷµǴõ¶óµµ ÃÖ¼ÒÇÑ Á×Áö´Â ¸»¾Æ¾ß ÇÑ´Ù. ±×°ÍÀÌ Á¦´ë·Î º¸À̴°¡ ¾Æ´Ñ°¡´Â »ó°üÇÒ ÇÊ¿ä¾øÀÌ ÀÖ´Â ±×´ë·Î Ãâ·ÂÇϱ⸸ ÇÏ¸é µÈ´Ù.

ÅؽºÆ® ÆíÁý±â°¡ ´Ù·ç¾î¾ß ÇÒ µ¥ÀÌÅÍ´Â ¹®ÀÚ¿­ÀÌ ¾Æ´Ï¶ó ÀÓÀÇÀÇ ÀÌÁø ¹ÙÀÌÆ® ½ºÆ®¸²ÀÌ´Ù. ÀÌ Àå¿¡¼­´Â Çí»ç ºä¸¦ À§ÇØ ÀÌÁø µ¥ÀÌÅ͸¦ ÆíÁýÇÒ ¼ö ÀÖµµ·Ï ´ç±ÙÀÇ ±¸Á¶¸¦ ¹Ù²Ü °ÍÀÌ´Ù. NULLÀÌ ¹®¼­ÀÇ ³¡ÀÌ ¾Æ´Ï¸ç ¹®¼­ Áß°£¿¡ NULLÀº ¹°·Ð ÀÓÀÇÀÇ ¾î¶² ¹ÙÀÌÆ®¶óµµ ³ªÅ¸³¯ ¼ö ÀÖ´Ù. ÇöÀç±îÁö ÀÛ¼ºµÈ ´ç±ÙÀ¸·Î Arches.bmp ÆÄÀÏÀ» ¿­¸é "BMv("±îÁö¹Û¿¡ ³ª¿ÀÁö ¾Ê´Âµ¥ ÀÌ ¹®ÀÚ ´ÙÀ½¿¡ 0ÀÌ Àֱ⠶§¹®ÀÌ´Ù.

¹®ÀÚ¿­Àº Ç×»ó NULL·Î ³¡³ª±â ¶§¹®¿¡ lstrlen ÇÔ¼ö·Î ¾ðÁ¦µçÁö Á¤È®ÇÑ ±æÀ̸¦ ±¸ÇÒ ¼ö ÀÖ´Ù. ±×·¯³ª ÀÌÁø µ¥ÀÌÅÍ´Â ÀÌ·± °¡Á¤ÀÌ ¾ø±â ¶§¹®¿¡ µ¥ÀÌÅ͸¸ Àü´Þ¹Þ¾Æ¼­´Â ±æÀ̸¦ Á¤È®ÇÏ°Ô ¾Ë ¼ö ¾ø´Ù. Áß°£¿¡µµ NULL¹®ÀÚ°¡ ¿Ã ¼ö ÀÖÀ¸¸ç ³¡¿¡ ¹Ýµå½Ã NULLÀÌ ÀÖ´Ù´Â º¸Àåµµ ¾ø´Ù. ±×·¡¼­ µ¥ÀÌÅ͸¦ ´Ù·ç´Â ¸ðµç ÇÔ¼ö°¡ µ¥ÀÌÅÍ »Ó¸¸ ¾Æ´Ï¶ó ±æÀÌ¿¡ ´ëÇÑ Á¤º¸¸¦ º°µµ·Î Àü´Þ¹Þ¾Æ¾ß ÇÑ´Ù.

¹®¼­ ÀÚü¸¦ ±â¾ïÇÏ´Â buf ¸â¹ö´Â ÇöÀç TCHAR *ÇüÀ¸·Î µÇ¾î Àִµ¥ ÀÓÀÇÀÇ µ¥ÀÌÅ͸¦ ´Ù·ç·Á¸é ¿øÄ¢ÀûÀ¸·Î BYTE * ŸÀÔÀ̾î¾ß ÇÑ´Ù. ±×·¯³ª ±âº» ºäÀÇ ÆíÀǸ¦ À§ÇØ ÀÌ Å¸ÀÔÀº ±×´ë·Î À¯ÁöÇϱâ·Î ÇÑ´Ù. buf¸¦ BYTE *·Î º¯°æÇÒ °æ¿ì ÀÌ ¸â¹ö¸¦ ÀÐ°í ¾²´Â ¸ðµç ÇÔ¼öµéÀ» ¼öÁ¤ÇØ¾ß ÇϹǷΠ½Ã°£ ³¶ºñ°¡ ½ÉÇÏ´Ù. TCHAR *·Î ŸÀÔÀ» À¯ÁöÇ쵂 ÇÊ¿äÇÒ ¶§¸¸ BYTE *·Î ij½ºÆÃÇÒ °ÍÀÌ´Ù. ¾îÂ÷ÇÇ µÑ ´Ù 1¹ÙÀÌÆ® ±æÀ̸¦ °¡Áö°í ¸Þ¸ð¸® °ü¸® ÇÔ¼öµéÀº void *¸¦ Àμö·Î ÃëÇϱ⠶§¹®¿¡ Á¤È®ÇÑ Å¸ÀÔÀ» °¡Áú ÇÊ¿ä±îÁö´Â ¾ø´Ù.

±×·³ Áö±ÝºÎÅÍ buf¸¦ ´Ù·ç´Â ¸ðµç ÇÔ¼ö¸¦ ¼öÁ¤ÇØ º¸ÀÚ. °¡Àå ¸ÕÀú ¼öÁ¤ÇØ¾ß ÇÒ ´ë»óÀº ¹®¼­¿¡ µ¥ÀÌÅ͸¦ »ðÀÔ, »èÁ¦ÇÏ´Â Insert, Delete ÇÔ¼öÀÌ´Ù. Insert´Â »ðÀÔ À§Ä¡¿Í ´ë»ó ¹®ÀÚ¿­À» Àμö·Î Àü´Þ¹Þ´Âµ¥ ¿©±â¿¡ ±æÀÌ Á¤º¸¸¦ Ãß°¡ÇÏ¿© ÀÌÁø ½ºÆ®¸²µµ »ðÀÔÇϵµ·Ï ¼öÁ¤ÇØ¾ß ÇÑ´Ù. ApiEdit Ŭ·¡½ºÀÇ Insert ÇÔ¼ö¸¦ ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇÑ´Ù. ±¸Çö ÆÄÀÏÀÇ ÇÔ¼ö º»Ã¼»Ó¸¸ ¾Æ´Ï¶ó Çì´õ ÆÄÀÏÀÇ ¿øÇü ¼±¾ðµµ ¹°·Ð ¼öÁ¤ÇØ¾ß ÇÑ´Ù.

 

void CApiEdit::Insert(int nPos, TCHAR *str, int len, BOOL bRec/*=TRUE*/)

{

    int len;

     ....

    needlen=doclen+len;

     if (needlen > buflen) {

          buflen = needlen+1024;

          buf=(TCHAR *)realloc(buf,buflen);

          if (buf == NULL) {

          }

     }

 

    len=lstrlen(str);

     if (len==0) return;

    movelen=doclen-nPos;

     ....

 

Insert ÇÔ¼ö´Â »ðÀÔÇÒ ¹®ÀÚ¿­ strÀÇ ±æÀ̸¦ lenÀ̶ó´Â º°µµÀÇ Àμö·Î Àü´Þ¹Þ´Â´Ù. strÀÌ ´õ ÀÌ»ó ¹®ÀÚ¿­ÀÌ ¾Æ´Ï¹Ç·Î lstrlenÀ¸·Î »ðÀ﵃ µ¥ÀÌÅÍÀÇ ±æÀ̸¦ ±¸ÇÒ ¼ö ¾ø´Ù. Áö¿ª º¯¼ö lenÀº »èÁ¦ÇÏ°í len=lstrlen(str); ´ëÀÔ¹®µµ »èÁ¦ÇÑ´Ù. ÇÊ¿äÇÑ ¸Þ¸ð¸®¾çÀÎ needlenÀº ÇöÀç ¹®¼­ ±æÀÌ doclen¿¡¼­ »ðÀ﵃ µ¥ÀÌÅÍÀÇ ±æÀ̸¦ ´õÇÏ¸é µÈ´Ù. ÇÊ¿äÇÑ ¸Þ¸ð¸® °è»ê¿¡ NULL¹®ÀÚºÐÀº Æ÷ÇÔÇÏÁö ¾Ê¾Æµµ µÇ¸ç ¸Þ¸ð¸® À̵¿½Ã¿¡µµ NULL¹®ÀÚ´Â º¸Á¸ÇÒ ÇÊ¿ä°¡ ¾ø´Ù. ±æÀÌ °è»ê¿¡ ±ÍÂú°Ô ºÙ¾î ÀÖ´ø +1Àº ¸ðµÎ Á¦°ÅµÉ °ÍÀÌ´Ù. Delete´Â ¿ø·¡ºÎÅÍ »èÁ¦ÇÒ µ¥ÀÌÅÍÀÇ ±æÀ̸¦ Àü´Þ¹Þ°í ÀÖÀ¸¹Ç·Î ¿øÇü º¯È­°¡ ¾ø°í ÀÏ´ÜÀº ±×´ë·Î »ç¿ëÇصµ µÈ´Ù. ´Ù¸¸ À̵¿ ±æÀ̸¦ °è»êÇÒ ¶§ NULL¹®ÀÚ º¸Á¸ÀÇ ÇÊ¿ä°¡ ¾ø¾îÁ³´Ù. +1¸¸ ¾ø¾Ö¸é µÈ´Ù.

 

void CApiEdit::Delete(int nPos, int nCount, BOOL bRec/*=TRUE*/)

{

     ....

    movelen=doclen-nPos-nCount;

 

±âº» ºäÀÇ Insert ÇÔ¼öµµ ±æÀ̸¦ Àü´Þ¹Þµµ·Ï ¼öÁ¤ÇÑ´Ù. ºä°¡ ±æÀ̸¦ ¸ÕÀú Àü´Þ¹Þ¾Æ¾ß ÇÁ·¹ÀÓÀÇ Insert¿¡°Ô ±æÀÌ Á¤º¸¸¦ ¾Ë·ÁÁÙ ¼ö ÀÖ´Ù.

 

void CApiEditText::Insert(int nPos, TCHAR *str, int len, BOOL bRec/*=TRUE*/)

{

     int nCrLf=0,i;

     int r,c;

     int nowPara;

     TCHAR *p=str;

 

     if (pFrame->bReadOnly)

          return;

 

    pFrame->Insert(nPos,str,len,bRec);

 

     bLineEnd=FALSE;

    UpdateLineInfo(nPos,len);

     UpdateScrollInfo();

 

    for (i=0;i<len;i++) {

        if (*p=='\r')

           nCrLf++;

        p++;

    }

 

     if (nCrLf) {

          ....

     }

    pFrame->UpdateViews(this,nPos,len);

}

 

±âº» ºä´Â ÅؽºÆ® ºäÀ̹ǷΠÅؽºÆ®¸¸ ÀÔ·ÂµÉ °ÍÀÌ°í ±æÀ̸¦ Àü´Þ¹ÞÁö ¾Ê´õ¶óµµ lstrlen ÇÔ¼ö·Î ±æÀ̸¦ Á¶»çÇصµ »ó°ü¾øÀ» °Í °°´Ù. ±×·¯³ª Çí»ç ºä¿¡¼­ ÀÌÁø µ¥ÀÌÅ͸¦ ÆíÁýÇϸé UpdateViews ÇÔ¼ö¸¦ ÅëÇØ ÀÌ ÇÔ¼ö°¡ °£Á¢ÀûÀ¸·Î È£ÃâµÉ ¼ö Àֱ⠶§¹®¿¡ ÀÌÁø µ¥ÀÌÅÍÀÇ ±æÀ̸¦ Àü´Þ ¹Þ¾Æ¾ß ÇÑ´Ù. °³Çà ÄÚµåÀÇ °³¼ö¸¦ ¼¿ ¶§µµ while¹®À¸·Î *p°¡ NULLÀÌ ¾Æ´Ñµ¿¾È ·çÇÁ¸¦ µ¹¾Æ¼­´Â ¾ÈµÇ¸ç len±æÀ̸¸Å­ °­Á¦·Î ·çÇÁ¸¦ µ¹·Á¾ß ÇÑ´Ù.

µ¥ÀÌÅ͸¦ »ðÀÔÇÏ´Â Insert ÇÔ¼öÀÇ ¿øÇüÀÌ ¹Ù²î¾úÀ¸¹Ç·Î ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÏ´Â ¸ðµç °÷À» ¼öÁ¤ÇØ¾ß ÇÑ´Ù. ¿¹»óÇÏ´Ù½ÃÇÇ ¾ÆÁÖ ¸¹Àºµ¥ Insert·Î °Ë»öÇϸ鼭 µÎ ¹ø° ÀμöÀÇ ±æÀ̸¦ ¼¼ ¹ø° Àμö¿¡ ½á ÁÖ¸é µÈ´Ù. ¿¹¸¦ µé¾î OnChar¿¡ Insert(off,szChar); È£Ãâ¹®Àº Insert(off, szChar, lstrlen(szChar));¿Í °°ÀÌ ¼öÁ¤ÇÑ´Ù. lstrlen(µÎ¹ø° Àμö)½ÄÀ» ¼¼ ¹ø° Àμö¿¡ Àû±â¸¸ ÇÏ¸é µÈ´Ù. ¼öÁ¤ ´ë»óÀº ´ëºÎºÐ ApiEditText.cpp¿¡ ÁýÁߵǾî ÀÖ´Ù.

 

À§Ä¡

¿ø·¡ ÄÚµå

¼öÁ¤µÈ ÄÚµå

OnChar

Insert(off,szChar)

Insert(off,szChar,lstrlen(szChar))

OnImeChar

Insert(off,szChar)

Insert(off,szChar,lstrlen(szChar))

OnImeComposition

Insert(off,szComp,FALSE)

Insert(off,szComp,lstrlen(szComp),FALSE)

IDM_AE_PASTE

Insert(off,dest)

Insert(off,ptr)

Insert(off,dest,lstrlen(dest))

Insert(off,ptr,lstrlen(ptr))

ReplaceText

Insert(off,to)

Insert(off,to,lstrlen(to))

ProcessIndent

Insert(off,szIndent)-µÎ°÷

Insert(off,szIndent,lstrlen(szIndent))

InsertText

Insert(off,Text)

Insert(off,Text,lstrlen(Text))

CopyChar

Insert(off,szTemp)

Insert(off,szTemp,lstrlen(szTemp))

Find.cppÀÇ

SendOutputToWindow

pSi->Ae.GetActiveView()->Insert(pSi->Ae.GetOffset(),buf)

pSi->Ae.GetActiveView()->Insert(pSi->

Ae.GetOffset(),buf,lstrlen(buf))

 

ÀÌÁø ½ºÆ®¸²À» ´Ù·é´Ù´õ´Ï ¿Ö ¶Ç lstrlenÀΰ¡ ÀǾÆÇÒ °ÍÀÌ´Ù. ÅؽºÆ® ºä¿¡¼­ Á÷Á¢ ÀԷ¹޴ µ¥ÀÌÅÍ´Â Ç×»ó ¹®ÀÚ¿­À̸ç lstrlen ÇÔ¼ö·Î ±æÀ̸¦ Á¶»çÇÒ ¼ö ÀÖ´Ù. OnChar¿¡¼­ Å°º¸µå¸¦ ÅëÇØ ÀԷ¹ÞÀº µ¥ÀÌÅͳª °Ë»öâ¿¡¼­ Àü¼ÛµÇ´Â °Ë»ö °á°ú´Â ¹®ÀÚ¿­ÀÌ ºÐ¸íÇϹǷΠlstrlen ÇÔ¼ö¸¦ ½á¾ß ÇÑ´Ù. InsertText·Î ÀԷ¹޴ µ¥ÀÌÅ͵µ ÇöÀç±îÁö ³¯Â¥, ½Ã°£ °°Àº ¹®ÀÚ¿­ »ÓÀÌ¸ç ¾ÕÀ¸·Îµµ ÀÌ ÇÔ¼ö·Î´Â ¹®ÀÚ¿­¸¸ »ðÀÔÇϵµ·Ï ÇÒ °ÍÀÌ´Ù. È£½ºÆ®´Â InsertText·Î ÀÌÁø µ¥ÀÌÅ͸¦ »ðÀÔÇؼ­´Â ¾ÈµÈ´Ù.

´Ù¸¸ ÇÑ°¡Áö Á» ÀÌ»óÇÑ Á¡ÀÌ Àִµ¥ ºÙ¿© ³Ö±â¿¡ ÀÇÇØ »ðÀԵǴ µ¥ÀÌÅÍ´Â ¹®ÀÚ¿­ÀÌ ¾Æ´Ò ¼öµµ ÀÖ´Ù. ¸¸¾à Çí»ç ºä¿¡¼­ 0x55 0x00 0x56 ÀÌ·± µ¥ÀÌÅ͸¦ º¹»çÇؼ­ ÅؽºÆ® ºä¿¡ ºÙ¿© ³Ö´Â´Ù°í ÇÑ´Ù¸é ÀÌ µ¥ÀÌÅÍ´Â ÀÌÁø µ¥ÀÌÅÍÀÌ´Ù. ±×·¯³ª ÅؽºÆ® ÆíÁý±â°¡ ºÙ¿© ³Ö´Â ŸÀÔÀº CF_TEXTÀ̱⠶§¹®¿¡ ³Î Á¾·á ¹®ÀÚ¿­À̶ó°í °¡Á¤Çϸç 0x00ÀÌÇϴ Ŭ¸³º¸µå¿¡ ¾ø´Â °ÍÀ¸·Î Ãë±ÞÇصµ ³í¸®ÀûÀ¸·Î Ʋ¸®Áö ¾Ê´Ù.

ÀÌ¿Ü¿¡ CopyString, ChangeCase, ConvertSpaceTab, RemoveExtraSpace, BlockIndent, InsertComment µî¿¡¼­ Insert ÇÔ¼ö¸¦ È£ÃâÇϴµ¥ ÀÌ ÇÔ¼öµéÀº ´Ù¸¥ ¹®Á¦¿Í ÇÔ²² ÇØ°áÇØ¾ß ÇÏ´Â °ÍµéÀ̹ǷΠÀá½Ã ÈÄ ¾Æ¿¹ »õ·Î ÀÛ¼ºÇÒ °ÍÀÌ´Ù. FindText¿Í ReplaceTextµµ ÀÌÁø °Ë»ö ¹× ´ëü°¡ °¡´ÉÇϵµ·Ï ¼öÁ¤ÇØ¾ß Çϴµ¥ ÀÏ´Ü ÄÄÆÄÀϸ¸ °¡´ÉÇÏ°Ô ÇØ µÎ¾ú´Ù. ÀÌ µÎ ÇÔ¼ö´Â ½Ç½ÀÀÇ Á¾¹ÝºÎ¿¡¼­ ¼öÁ¤ÇÒ °ÍÀÌ´Ù. ´ÙÀ½Àº ¹®¼­¸¦ ´Ù·ç´Â ÇÁ·¹ÀÓÀÇ ÇÔ¼öµéÀ» ¼öÁ¤ÇÑ´Ù. ÇÁ·¹ÀÓÀÌ °ü¸®ÇÏ´Â ¹®¼­´Â ÀÓÀÇÀÇ ÀÌÁø µ¥ÀÌÅ͸¦ ÀԷ¹ÞÀ» ¼ö ÀÖ¾î¾ß ÇÑ´Ù. Æ÷¸ËÀ» ºÐ¼®ÇÏ´Â AnalyzeFormat ÇÔ¼ö¸¦ ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇÑ´Ù.

 

DWORD CApiEdit::AnalyzeFormat(TCHAR *Text, int dwSize)

{

     int result;

    TCHAR *p,*p2;

 

     result=IS_TEXT_UNICODE_UNICODE_MASK | IS_TEXT_UNICODE_REVERSE_MASK;

     if (IsTextUnicode(Text,lstrlen(Text),&result)) {

          return AE_FORMAT_UNICODE;

     }

 

     if (dwSize != -1) {

        for (p=Text;p-Text < dwSize;p++) {

           if (*p==0) {

               return AE_FORMAT_BINARY;

           }

        }

     }

 

     p=strchr(Text,'\r');

    if (p==NULL || p-Text >= dwSize) {

        p2=strchr(Text,'\n');

        if (p2==NULL  || p2-Text >= dwSize) {

           return AE_FORMAT_WIN;

          } else {

           return AE_FORMAT_UNIX;

          }

     } else {

        if (p+1-Text < dwSize && *(p+1)=='\n') {

              return AE_FORMAT_WIN;

          } else {

              return AE_FORMAT_MAC;

          }

     }

}

 

ÀÌÁø Æ÷¸ËÀÎÁö ÆǺ°ÇÒ ¶§´Â dwSizeÀÌÀü¿¡ NULLÀÌ ÀÖ´ÂÁö º»´Ù. Áß°£¿¡ NULL¹®ÀÚ°¡ ÀÖ´Ù¸é ÀÌ´Â ÀÌÁø Æ÷¸ËÀÌ´Ù. '\r', '\n'À» ãÀ» ¶§µµ strchrÀÌ ¹è¿­ ¹üÀ§¸¦ ³Ñ¾î¼­¸é ÇØ´ç ¹®ÀÚ°¡ ¾ø´Â °ÍÀ¸·Î °£ÁÖÇÑ´Ù. ConvertFormat ÇÔ¼ö´Â ¿øÇüÀÌ ¹Ù²ï´Ù. ¹®¼­°¡ ³Î Á¾·á ¹®ÀÚ¿­ÀÌ ¾Æ´Ï±â ¶§¹®¿¡ ¿øº» ¹®¼­ÀÇ ±æÀ̸¦ Àμö·Î Àü´Þ¹Þ¾Æ¾ß ÇÑ´Ù.

 

int CApiEdit::ConvertFormat(DWORD from, DWORD to, TCHAR *src, int srclen, TCHAR *&dest)

{

     ....

     if (to==AE_FORMAT_WIN) {

          switch (from) {

          case AE_FORMAT_UNIX:

              Find='\n';

              break;

          case AE_FORMAT_MAC:

              Find='\r';

              break;

          }

        while (s-src < srclen) {

              if (*s==Find) {

                   *d++='\r';

                   *d++='\n';

                   s++;

              } else {

                   *d++=*s++;

              }

          }

        *d=0;

     } else {

          switch (to) {

          case AE_FORMAT_UNIX:

              Find='\n';

              break;

          case AE_FORMAT_MAC:

              Find='\r';

              break;

          }

        while (s-src < srclen) {

              if (*s=='\r') {

                   *d++=Find;

                   s++;

                   s++;

              } else {

                   *d++=*s++;

              }

          }

        *d=0;

     }

     return lstrlen(dest);

}

 

·çÇÁ ³»ºÎ¿¡¼­µµ *s°¡ NULLÀÌ ¾Æ´Ñµ¿¾È º¯È¯À» ¹Ýº¹ÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó srclen±æÀ̸¸Å­¸¸ º¯È¯ÇÏ¸é µÈ´Ù. º¯È¯ °á°ú ¹öÆÛ¿¡ NULL Á¾·á ¹®ÀÚ¿­À» ºÙ¿©¾ß ÇÑ´Ù. º¯È¯ ¿øº»Àº NULL Á¾·á ¹®ÀÚ¿­ÀÌ ¾Æ´ÏÁö¸¸ º¯È¯µÈ °á°ú ¹®ÀÚ¿­ÀÇ ±æÀ̸¦ Á¶»çÇϱâ À§ÇØ NULL Á¾·á ¹®ÀÚ¿­·Î ¸¸µé¾î¾ß ÇÑ´Ù. ´Ü, ÀÌÁø ÆÄÀÏÀÎ °æ¿ì´Â ±×·¸Áö°¡ ¾ÊÀºµ¥ ¾îÂ÷ÇÇ ÀÌÁø ÆÄÀÏ¿¡ ´ëÇؼ­´Â ÀÌ ÇÔ¼ö°¡ È£ÃâµÇÁöµµ ¾Ê´Â´Ù. ºäÀÇ IDM_AE_PASTE¿¡ ConvertFormat ÇÔ¼ö È£Ã⠺κÐÀÌ ÀÖÀ¸¹Ç·Î ¼öÁ¤ÇÑ´Ù.

 

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

{

     case IDM_AE_PASTE:

                   if (Format != AE_FORMAT_WIN) {

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

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

                        free(dest);

     ....

 

¹®¼­ Æ÷¸ËÀ» Á¤È®ÇÏ°Ô ÆǺ°Çϱâ À§ÇØ ±æÀÌ Á¤º¸¸¦ Àü´ÞÇØ¾ß ÇÑ´Ù. ÇÁ·¹ÀÓÀÇ SetText ÇÔ¼ö´Â ¿ÏÀüÈ÷ ´Ù½Ã ÀÛ¼ºÇÑ´Ù.

 

void CApiEdit::SetText(TCHAR *TextBuf, int dwSize)

{

     TCHAR *dest;

 

     InitDoc();

     dwFormat=AnalyzeFormat(TextBuf, dwSize);

     switch (dwFormat) {

     case AE_FORMAT_WIN:

     case AE_FORMAT_BINARY:

          GetActiveView()->Insert(0,TextBuf,dwSize,FALSE);

          break;

     default:

          ConvertFormat(dwFormat,AE_FORMAT_WIN,TextBuf,dwSize,dest);

          GetActiveView()->Insert(0,dest,lstrlen(dest),FALSE);

          free(dest);

          break;

     }

}

 

Æ÷¸Ë º¯È¯À» ÇÏÁö ¾ÊÀ» ¶§´Â Àμö·Î Àü´ÞµÈ dwSize¸¸Å­, Áï ÆÄÀÏÀÇ ½ÇÁ¦ ±æÀ̸¸Å­¸¸ µ¥ÀÌÅ͸¦ »ðÀÔÇÏ°í Æ÷¸ËÀ» º¯È¯ÇßÀ» ¶§´Â lstrlenÇÔ¼ö·Î º¯È¯ ÈÄÀÇ ±æÀ̸¦ Á¶»çÇÑ´Ù. À¯´Ð½º³ª ¸ÅŲÅä½Ã ¶Ç´Â À¯´ÏÄÚµå Æ÷¸ËÀº À©µµ¿ìÁî Æ÷¸ËÀ¸·Î °­Á¦ º¯È¯µÇ¹Ç·Î lstrlenÀ» ½áµµ ¾ÈÀüÇÏ´Ù. GetTextµµ ¼öÁ¤ÇÑ´Ù.

 

void CApiEdit::GetText(TCHAR *TextBuf, int BufSize , int s/*=-1*/, int e/*=-1*/)

{

     TCHAR *dest;

     int len;

 

     if (s==-1) {

          switch (dwFormat) {

          case AE_FORMAT_WIN:

          case AE_FORMAT_BINARY:

              memcpy(TextBuf,buf,min(doclen,BufSize));

              break;

          default:

              len=ConvertFormat(AE_FORMAT_WIN,dwFormat,buf,doclen,dest);

              memcpy(TextBuf,dest,min(len,BufSize));

              free(dest);

              break;

          }

     } else {

          memcpy(TextBuf,buf+s,min(BufSize,e-s));

     }

}

 

int CApiEdit::GetTextLength()

{

     TCHAR *dest;

     int len;

 

     switch (dwFormat) {

     case AE_FORMAT_WIN:

     case AE_FORMAT_BINARY:

          len=doclen;

          break;

     default:

          len=ConvertFormat(AE_FORMAT_WIN,dwFormat,buf,doclen,dest);

          free(dest);

          break;

     }

     return len;

}

 

lstrcpy(n) ÇÔ¼ö¸¦ ¾²Áö ¾Ê°í ³Î Á¾·á ¹®ÀÚµµ ºÙÀÏ ÇÊ¿ä°¡ ¾ø´Ù. ´Þ¶ó°í ÇÑ ¸¸Å­¸¸ Á¤È®ÇÏ°Ô ÁÖ¸é µÈ´Ù. ÇÊ¿äÇÒ °æ¿ì È£ÃâÃø¿¡¼­ ³Î Á¾·á ¹®ÀÚ¸¦ Á÷Á¢ ºÙ¿©¼­ »ç¿ëÇØ¾ß ÇÑ´Ù. GetText°¡ ¹öÆÛ ³¡¿¡ NULLÀ» ºÙÀÌÁö ¾ÊÀ¸¹Ç·Î ÀÌ ÇÔ¼ö·Î ¹®¼­ÀÇ ÀϺθ¦ Á¶»çÇÏ´Â ¸ðµç ºÎºÐÀ» ¼öÁ¤ÇØ¾ß ÇÑ´Ù.

 

void OnCommand(HWND hWnd,WPARAM wParam,LPARAM lParam)

{

     ....

     case IDM_SEARCH_WORD:

     case IDM_SEARCH_WORDUP:

          int nStart;

          pSi->Ae.GetSelect(s,e);

          if (s==e) {

              pView->GetNowWord(pSi->Ae.GetOffset(),s,e);

          }

        if (e-s > 255 || e-s <= 0) {

              break;

          }

          pSi->Ae.GetText(szTemp,256,s,e);

        szTemp[e-s]=0;

          arFind[0].Add(szTemp);

 

szTempÀÇ µÚ¿¡ NULL¹®ÀÚ¸¦ Á÷Á¢ ºÙ¿©¾ß ÇÑ´Ù. 1.0¿¡¼­ abs(s-e)·Î ¼±Åà ¿µ¿ªÀÇ ±æÀ̸¦ ±¸Çß¾ú´Âµ¥ ÀϽÃÀûÀÎ ¹®Á¦·Î ÀÎÇØ Àý´ë°ªÀ» ÃëÇß¾ú´Ù. ±×·¯³ª ÀÌÁ¦ GetSelect°¡ s,e¸¦ Á¤±ÔÈ­Çؼ­ Á¶»çÇϹǷΠ¼±Åà ¿µ¿ªÀÇ ±æÀÌ´Â e-s·Î °£´ÜÇÏ°Ô ±¸ÇÒ ¼ö ÀÖ´Ù. Find.cppÀÇ ´ÙÀ½ ¼¼ ±ºµ¥µµ ´õ ¼öÁ¤ÇÑ´Ù.

 

BOOL CALLBACK FindDlgProc(HWND hDlg,UINT iMessage,WPARAM wParam,LPARAM lParam)

{

     ....

          if (Option.bInitFind) {

              hActive=(HWND)SendMessage(g_hMDIClient,WM_MDIGETACTIVE,0,NULL);

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

              pSi->Ae.GetSelect(s,e);

              if (s==e) {

                   pSi->Ae.GetActiveView()->GetNowWord(pSi->Ae.GetOffset(),s,e);

              }

           if (e-s <= 255 && e-s > 0) {

                   pSi->Ae.GetText(szTemp,256,s,e);

               szTemp[e-s]=0;

                   SetDlgItemText(hDlg,IDC_FIND_WHAT,szTemp);

              }

 

BOOL CALLBACK FileFindDlgProc(HWND hDlg,UINT iMessage,WPARAM wParam,LPARAM lParam)

{

     ....

          if (Option.bInitFind) {

              hActive=(HWND)SendMessage(g_hMDIClient,WM_MDIGETACTIVE,0,NULL);

              if (hActive != NULL) {

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

                   pSi->Ae.GetSelect(s,e);

                   if (s==e) {

                        pSi->Ae.GetActiveView()->GetNowWord(pSi->Ae.GetOffset(),s,e);

                   }

               if (e-s <= 255 && e-s > 0) {

                        pSi->Ae.GetText(szTemp,256,s,e);

                   szTemp[e-s]=0;

                        SetDlgItemText(hDlg,IDC_FIND_WHAT,szTemp);

                   }

 

void OpenFileFromOutput(int idx)

{

     ....

     pSi->Ae.GetText(Text,MAX_PATH,toff,toff+lstrlen(LastFIF));

    Text[lstrlen(LastFIF)]=0;

 

¸ðµÎ °°Àº ¹æ½ÄÀÌ´Ù. bInitFind ¿É¼ÇÀÌ ¼±ÅõǾî ÀÖÀ¸¸é ÇöÀç ´Ü¾î¸¦ ÃëÇϴµ¥ À̶§µµ GetText·Î Á¶»çÇÑ ´Ü¾î³¡¿¡ NULL¹®ÀÚ¸¦ Á÷Á¢ ºÙ¿©¾ß ÇÑ´Ù. ¹®¼­°¡ ¹Ýµå½Ã NULL·Î ³¡³ªÁö ¾Ê¾Æµµ µÇ¹Ç·Î È£½ºÆ®ÀÇ SaveToFile ÇÔ¼öµµ ¼öÁ¤ÇÑ´Ù.

 

BOOL SaveToFile(HWND hChild,TCHAR *Path)

{

     ....

     len=pSi->Ae.GetTextLength();

    TextBuf=(TCHAR *)malloc(len);

    pSi->Ae.GetText(TextBuf,len);

 

À¯´ÏÄÚµå ¹®ÀÚ¿­À» °í·ÁÇÏ¿© 2¹ÙÀÌÆ® ¿©À¯ºÐÀ» ´õ ÇÒ´çÇßÀ¸³ª ÀÌÁ¦ ±×·² ÇÊ¿ä°¡ ¾øÀ¸¹Ç·Î +2¸¦ Á¦°ÅÇÑ´Ù. ¹°·Ð Á¦°Å ¾ÈÇصµ ¹öÆÛ°¡ ³²À» »ÓÀ̹ǷΠº° ÀÌ»óÀº ¾ø´Ù. OpenFileToChild ÇÔ¼öµµ ¼öÁ¤ÇØ¾ß Çϴµ¥ ¾ÆÁ÷Àº À¯´ÏÄÚµå º¯È¯ ¹®Á¦·Î ÀÎÇØ ±âÁ¸ Äڵ尡 ÇÊ¿äÇϹǷΠÀá½Ã ÈÄ ¼öÁ¤ÇÒ °ÍÀÌ´Ù. ±âº»ÀûÀÎ »ðÀÔ, »èÁ¦ ÇÔ¼öÀÇ ¿øÇüÀÌ ¹Ù²î´Ù º¸´Ï ¿©±â Àú±â ¼öÁ¤ÇÒ °÷ÀÌ ¸¹´Ù. ÇöÀç »óÅ¿¡¼­µµ ¾ÆÁ÷ ÄÄÆÄÀÏÀº µÇÁö ¾ÊÀ¸¸ç ÀÌ ÀýÀÌ ³¡³¯ ¶§±îÁö ¼öÁ¤À» °è¼ÓÇØ¾ß ÇÑ´Ù.

³ª.Ãë¼Ò ·¹ÄÚµå ¼öÁ¤

Ãë¼Ò ·¹Äڵ嵵 ÀÌÁø µ¥ÀÌÅ͸¦ ±â·ÏÇÒ ¼ö ÀÖµµ·Ï ¼öÁ¤ÇÑ´Ù. »ðÀÔ, »èÁ¦µÈ µ¥ÀÌÅÍ°¡ ¹®ÀÚ¿­ÀÌ ¾Æ´Ï¹Ç·Î dataÀÇ ±æÀ̸¦ ½Ç½Ã°£À¸·Î Á¶»çÇÒ ¼ö ¾øÀ¸¸ç µû·Î ÀúÀåÇØ¾ß ÇÑ´Ù. ApiEdit.hÀÇ UndoRecord±¸Á¶Ã¼¿¡ µ¥ÀÌÅ͸¦ ±æÀ̸¦ ±â¾ïÇÏ´Â len¸â¹ö¸¦ Ãß°¡ÇÑ´Ù.

 

struct UndoRecord

{

     BYTE action;

     BYTE status;

     int pos;

    int len;

     union {

          TCHAR *data;

          int *dest;

     };

     int tick;

};

 

data¿¡ ±â·ÏµÇ´Â µ¥ÀÌÅÍ´Â ¹®ÀÚ¿­ÀÌ ¾Æ´Ñ ÀÌÁø ½ºÆ®¸²ÀÌÁö¸¸ ŸÀÔÀº °è¼Ó TCHAR *¸¦ À¯ÁöÇϱâ·Î ÇÑ´Ù. Ãë¼Ò ·¹ÄÚµåÀÇ Å¸ÀÔÀÌ º¯°æµÇ¾úÀ¸¹Ç·Î ÀÌ ·¹Äڵ带 »ç¿ëÇÏ´Â ¸ðµç ÇÔ¼öµéµµ ¼öÁ¤µÇ¾î¾ß ÇÒ °ÍÀÌ´Ù. Ãë¼Ò ·¹Äڵ带 °ü¸®ÇÏ´Â ¼¼ ÇÔ¼ö¸¦ ¼öÁ¤Çϴµ¥ ¿øÇü¿¡ µ¥ÀÌÅÍÀÇ ±æÀ̸¦ Àü´ÞÇÏ´Â lenÀμö°¡ Ãß°¡µÈ´Ù.

 

void CApiEdit::URInsert(int nPos, TCHAR *str, int len)

{

     if (CanRedo()) {

          ClearRedo();

     } else {

          if (pUR[nowur].action==UR_INSERT) {

           if (pUR[nowur].pos + pUR[nowur].len==nPos) {

               AllocURData(nowur,pUR[nowur].len+len,5);

               memcpy(pUR[nowur].data+pUR[nowur].len,str,len);

               pUR[nowur].len+=len;

 

                   if (str[0]==' ' || str[0]=='\r') {

                        NextRecord();

                   }

                   return;

              } else {

                   NextRecord();

              }

          } else {

              if (pUR[nowur].action != UR_NONE) {

                   NextRecord();

              }

          }

     }

 

    AllocURData(nowur,len+8,0);

     pUR[nowur].action=UR_INSERT;

     pUR[nowur].pos=nPos;

     pUR[nowur].tick=URtick;

    pUR[nowur].len=len;

    memcpy(pUR[nowur].data,str,len);

}

 

void CApiEdit::URDelete(int nPos, TCHAR *str, int len)

{

     TCHAR *t;

 

     if (CanRedo()) {

          ClearRedo();

     } else {

          if (pUR[nowur].action==UR_DELETE) {

              if (str[0]==' ' || str[0]=='\r') {

                   NextRecord();

              } else {

               if (pUR[nowur].pos - len==nPos) {

                   AllocURData(nowur,pUR[nowur].len+len,5);

 

                        t=(TCHAR *)malloc(_msize(pUR[nowur].data));

                   memcpy(t,str,len);

                   memcpy(t+len,pUR[nowur].data,pUR[nowur].len);

                   pUR[nowur].len+=len;

                   memcpy(pUR[nowur].data,t,pUR[nowur].len);

                        free(t);

 

                        pUR[nowur].pos = nPos;

                        return;

                   } else if (pUR[nowur].pos == nPos) {

                   AllocURData(nowur,pUR[nowur].len+len,5);

                   memcpy(pUR[nowur].data+pUR[nowur].len,str,len);

                   pUR[nowur].len+=len;

                        return;

                   } else {

                        NextRecord();

                   }

              }

          } else {

              if (pUR[nowur].action != UR_NONE) {

                   NextRecord();

              }

          }

     }

 

    AllocURData(nowur,len+8,0);

     pUR[nowur].action=UR_DELETE;

     pUR[nowur].pos=nPos;

     pUR[nowur].tick=URtick;

    pUR[nowur].len=len;

    memcpy(pUR[nowur].data,str,len);

}

 

void CApiEdit::URMove(int nPos, int Dest,TCHAR *str, int len)

{

     if (CanRedo()) {

          ClearRedo();

     } else {

          if (pUR[nowur].action != UR_NONE) {

              NextRecord();

          }

     }

 

     AllocURData(nowur,sizeof(int)*2,0);

     pUR[nowur].action=UR_MOVE;

     pUR[nowur].pos=nPos;

     pUR[nowur].tick=URtick;

     pUR[nowur].dest[0]=Dest;

    pUR[nowur].dest[1]=len;

}

 

±â·ÏµÇ´Â µ¥ÀÌÅÍÀÇ ±æÀ̸¦ lstrlenÇÔ¼ö·Î ±¸ÇßÀ¸³ª ÀÌÁ¦ ¹®ÀÚ¿­ÀÌ ¾Æ´Ï¹Ç·Î Àμö·Î Àü´ÞµÈ lenÀ» ´ë½Å »ç¿ëÇØ¾ß Çϸç NULL¹®ÀÚ¸¦ À§ÇÑ ¿©ºÐÀÇ °ø°£À» ÇÒ´çÇÒ ÇÊ¿äµµ ¾ø´Ù. µ¥ÀÌÅ͸¦ ±â·ÏÇÒ ¶§³ª º´ÇÕÇÒ ¶§µµ lstrcpy ÇÔ¼ö³ª lstrcat ÇÔ¼ö¸¦ »ç¿ëÇÒ ¼ö ¾øÀ¸¸ç memcpy¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù. URMoveÀÇ strÀμö´Â ±æÀ̸¦ ¾Ë±â À§ÇØ Àü´ÞµÇ¾úÀ¸³ª ÇöÀç´Â lenÀÌ µû·Î Àü´ÞµÇ¹Ç·Î »ç½Ç»ó ÇÊ¿ä¾ø´Â ¼ÀÀÌ´Ù. ¾ø¾Ö ¹ö¸®´Â °ÍÀÌ ±ò²ûÇÏÁö¸¸ ´ÙÀ½¿¡ ¶Ç ÇÊ¿äÇØÁúÁöµµ ¸ð¸£¹Ç·Î ÀÏ´ÜÀº ±×³É µÎ±â·Î ÇÑ´Ù. ÀÌ ÇÔ¼öµéÀÇ ¿øÇüÀÌ ¹Ù²î¾úÀ¸¹Ç·Î È£ÃâÇÏ´Â ¸ðµç °÷À» ¼öÁ¤ÇÏ¿© Ãë¼Ò ·¹ÄÚµåÀÇ ±æÀ̸¦ Àü´ÞÇÑ´Ù. ¹®¼­¸¦ º¯°æÇÏ´Â °¡Àå ±âº»ÀûÀÎ ÇÔ¼öÀÎ Insert, Delete ÇÔ¼öºÎÅÍ ¼öÁ¤ÇÏÀÚ.

 

void CApiEdit::Insert(int nPos, TCHAR *str, int len, BOOL bRec/*=TRUE*/)

{

     if (bRec) {

        URInsert(nPos,str,len);

     }

    

void CApiEdit::Delete(int nPos, int nCount, BOOL bRec/*=TRUE*/)

{

     if (bRec) {

        t=(TCHAR *)malloc(nCount);

        memcpy(t,p,nCount);

        URDelete(nPos,t,nCount);

          free(t);

     }

 

¿øÄ¢»ó ¹®¼­¸¦ ÆíÁýÇÏ´Â ÄÚµå´Â ¸ðµÎ Insert, Delete¸¦ ÅëÇØ¾ß ÇϹǷΠ¿©±â¸¸ ¼öÁ¤ÇÏ¸é µÈ´Ù. ±×·¯³ª ÃÖÀûÈ­¿¡ ÀÇÇØ ÅؽºÆ® ºä¿¡¼­ Á÷Á¢ Ãë¼Ò ·¹Äڵ带 ÀÛ¼ºÇÏ´Â ºÎºÐÀÌ ÀÖÀ¸¹Ç·Î ¿©±âµµ ¼öÁ¤ÇØ¾ß ÇÑ´Ù.

 

LRESULT CApiEditText::OnImeChar(HWND hWnd, WPARAM wParam, LPARAM lParam)

{

     if (bComp) {

        pFrame->URInsert(off-lstrlen(szChar),szChar,lstrlen(szChar));

          pFrame->buf[off-2]=szChar[0];

          pFrame->buf[off-1]=szChar[1];

 

void CApiEditText::CopyString(BOOL bCopy, int from, int &to, int len, BOOL bRec/*=TRUE*/)

{

     TCHAR *t;

     int orito=to;

 

    t=(TCHAR *)malloc(len);

    memcpy(t,pFrame->buf+from,len);

    Insert(to,t,len,FALSE);

 

     if (bCopy==FALSE) {

          if (to > from) {

              Delete(from,len,FALSE);

              to-=len;

          } else {

              Delete(from+len,len,FALSE);

          }

     }

     if (bRec) {

          if (bCopy) {

           pFrame->URInsert(to,t,len);

          } else {

           pFrame->URMove(from,orito,t,len);

          }

     }

     free(t);

}

 

OnImeChar´Â ÅؽºÆ®¸¦ Á÷Á¢ ÀÔ·ÂÇϹǷΠlstrlenÀ¸·Î ±æÀ̸¦ Á¶»çÇÒ ¼ö ÀÖÀ¸³ª CopyStringÀº ¿ÜºÎ¿¡¼­ °£Á¢ÀûÀ¸·Î È£ÃâµÉ ¼öµµ Àֱ⠶§¹®¿¡ Àμö·Î Àü´ÞµÈ len ±æÀ̸¦ »ç¿ëÇØ¾ß ÇÑ´Ù. Ãë¼Ò ·¹Äڵ带 »ç¿ëÇÏ´Â Undo, Redo ÇÔ¼ö´Â Ãë¼Ò ·¹Äڵ忡 ÀúÀåµÈ ±æÀ̸¦ »ç¿ëÇÑ´Ù.

 

void CApiEdit::Undo()

{

     ....

     for (;;) {

          switch (pUR[nowur].action) {

          case UR_INSERT:

           pView->Delete(pUR[nowur].pos,pUR[nowur].len,FALSE);

              pView->SetOffset(pUR[nowur].pos);

              break;

          case UR_DELETE:

           pView->Insert(pUR[nowur].pos,pUR[nowur].data,pUR[nowur].len,FALSE);

           pView->SetOffset(pUR[nowur].pos+pUR[nowur].len);

              break;

          ....

 

void CApiEdit::Redo()

{

     ....

     for (;;) {

          switch (pUR[nowur].action) {

          case UR_INSERT:

           pView->Insert(pUR[nowur].pos,pUR[nowur].data,pUR[nowur].len,FALSE);

           pView->SetOffset(pUR[nowur].pos+pUR[nowur].len);

              break;

          case UR_DELETE:

           pView->Delete(pUR[nowur].pos,pUR[nowur].len,FALSE);

              pView->SetOffset(pUR[nowur].pos);

              break;

          ....

 

¿©±â±îÁö ÀÛ¾÷Çϸé ÀÌÁø µ¥ÀÌÅÍ¿¡ ´ëÇÑ ÆíÁý ±â·ÏÀ» ÀÛ¼ºÇÏ°í °ü¸®ÇÒ ¼ö ÀÖ´Ù.

´Ù.°³Çà ÄÚµå ó¸®

Çí»ç ÆíÁýÀÌ °¡´ÉÇÏ·Á¸é ÀÓÀÇÀÇ ÀÌÁø ½ºÆ®¸²¿¡ ´ëÇؼ­ Ç×»ó Á¤È®ÇÏ°Ô Ãâ·ÂÇØ¾ß ÇÑ´Ù. ÁÙ ³¡°ú ¹®¼­ ³¡À» ã´Â ¹æ¹ý¿¡ º¯È­°¡ ÇÊ¿äÇϹǷΠAeIs ¸ÅÅ©·Î¸¦ ¼öÁ¤ÇÑ´Ù. ¼öÁ¤Çϱâ ÀüÀÇ ¸ÅÅ©·Î´Â ´ÙÀ½°ú °°ÀÌ Á¤ÀǵǾî ÀÖ´Ù.

 

#define AeIsWhiteSpace(c) ((c)==' ' || (c) == '\t')

#define AeIsLineEnd(c) ((c)=='\r' || (c) == 0)

 

°ø¹é ¹®ÀÚ¸¦ ã´Â ¸ÅÅ©·Î´Â ±×´ë·Î ¾µ ¼ö ÀÖÁö¸¸ ÁÙ ³¡À» ã´Â ¸ÅÅ©·Î´Â ¼öÁ¤ÀÌ ÇÊ¿äÇÏ´Ù. ¹®ÀÚ c°¡ °³Çà ÄÚµåÀ̰ųª NULLÀÏ ¶§¸¦ ¹®¼­ ³¡À¸·Î º¸°í ÁÙ ³¡À¸·Î ÆÇ´ÜÇϴµ¥ ÀÌ °¡Á¤Àº ÀÌÁ¦ Ʋ¸± ¼ö ÀÖÀ¸¹Ç·Î ±æÀ̸¦ ºñ±³ÇØ¾ß ÇÑ´Ù.

 

#define AeIsWhiteSpace(c) ((c)==' ' || (c) == '\t')

#define AeIsDocEnd(p) ((p)-pFrame->buf == pFrame->doclen)

#define AeIsLineEnd(p) (pFrame->IsEnterCode(p) || AeIsDocEnd(p))

 

Àü´ÞÇÑ Æ÷ÀÎÅÍÀÇ ¿ÀÇÁ¼ÂÀÌ ¹®¼­ ±æÀÌÀÎ doclen°ú ÀÏÄ¡ÇÒ ¶§ ¹®¼­ÀÇ ³¡ÀÎÁö ÆÇ´ÜÇÏ´Â AeIsDocEnd ¸ÅÅ©·Î¸¦ »õ·Î ¸¸µé¾ú´Ù.  ÁÙ ³¡ÀÎÁö¸¦ ÆÇ´ÜÇÏ´Â ¹æ½Äµµ ´Þ¶óÁö´Âµ¥ CR, LF°¡ ¹Ýµå½Ã ±ÔÄ¢¿¡ ¸Â°Ô ³ªÅ¸³ªÁö ¾Ê±â ¶§¹®¿¡ CR°ú LF°¡ ¼ø¼­´ë·Î ³ªÅ¸³ª¾ß¸¸ °³Çà ÄÚµå¶ó°í ÆÇ´ÜÇÒ ¼ö ÀÖ´Ù. CR¸¸ Àִٰųª LF CR¼øÀ¸·Î µÇ¾î ÀÖÀ¸¸é °³Çà ÄÚµå·Î ÀÎÁ¤µÇÁö ¾Ê´Â´Ù. ¹®¼­ ³¡Àº ¿©ÀüÈ÷ ÁÙ ³¡À¸·Î ÀÎÁ¤µÇ¹Ç·Î AeIsDocEnd ¸ÅÅ©·Î¸¦ È£ÃâÇÑ´Ù.

ÁöÁ¤ÇÑ À§Ä¡°¡ °³Çà ÄÚµåÀÎÁö¸¦ ÆÇ´ÜÇÏ´Â ¹æ¹ýÀÌ º¹ÀâÇϹǷΠ¸ÅÅ©·Î ¼öÁØ¿¡¼­ ÆÇ´ÜÇϱâ´Â ¾î·Æ´Ù. ±×·¡¼­ °³Çà Äڵ带 ÆÇ´ÜÇÏ´Â ¼¼ °³ÀÇ ÇÔ¼ö¸¦ Ãß°¡ÇÑ´Ù. ¹®¼­¸¦ ´Ù·ç´Â ÇÔ¼öµéÀ̹ǷΠ´ç¿¬È÷ ÇÁ·¹ÀÓÀÇ ¸â¹ö°¡ µÇ¾î¾ß ÇÑ´Ù. ¿©·¯ °¡Áö ¹æ¹ýÀ¸·Î °³Çà Äڵ带 ÆǺ°ÇÒ ¼ö ÀÖµµ·Ï Áߺ¹ Á¤ÀÇÇß´Ù.

 

BOOL CApiEdit::IsEnterCode(int nPos)

{

     return IsEnterCode(buf,doclen,buf+nPos);

}

 

BOOL CApiEdit::IsEnterCode(TCHAR *p)

{

     return IsEnterCode(buf,doclen,p);

}

 

BOOL CApiEdit::IsEnterCode(TCHAR *tbuf,int len,TCHAR *p)

{

     return (*p=='\r' && p-tbuf+1 < len && p[1]=='\n');

}

 

¼¼¹ø° ÇÔ¼ö´Â ±æÀÌ lenÀÇ ¹öÆÛ tbuf¿¡ ¼ÓÇØ ÀÖ´Â Æ÷ÀÎÅÍ p°¡ °³Çà ÄÚµåÀÎÁö °Ë»çÇÑ´Ù. Á¤È®ÇÑ °Ë»ç¸¦ À§ÇØ ¹öÆÛÀÇ ±æÀ̵µ °°ÀÌ Àü´ÞÇØ¾ß ÇÑ´Ù. °Ë»çÇÏ·Á´Â °÷ÀÇ À§Ä¡°¡ lenº¸´Ù ÃÖ¼ÒÇÑ µÎ Ä­ ´õ ¾Õ¿¡ ÀÖ¾î¾ß ÇÑ´Ù. len-1ÀÚ¸®¿¡ ±×·¯´Ï±î ¹öÆÛ ³¡¿¡ CRÀÌ ÀÖ°í len¿¡ ¿ì¿¬È÷ LF°¡ ÀÖ´Â °æ¿ì´Â °³Çà Äڵ尡 ¾Æ´Ï´Ù. À̶§ÀÇ LF´Â ¹öÆÛÀÇ ÀϺΰ¡ ¾Æ´Ï¹Ç·Î ¾Æ¿¹ °è»ê¿¡ Æ÷ÇÔ½ÃÅ°Áö ¸»¾Æ¾ß ÇÑ´Ù. ³ª¸ÓÁö µÎ ÇÔ¼ö´Â ¼¼ ¹ø° ÇÔ¼ö¸¦ È£ÃâÇϴµ¥ ¹öÆÛ´Â bufÀÌ°í ÀÌ ¹öÆÛÀÇ ±æÀÌ´Â doclenÀ¸·Î °íÁ¤µÇ¾î ÀÖ´Ù. ¿ÀÇÁ¼ÂÀ¸·Îµµ Á¶»çÇÒ ¼ö ÀÖ°í Æ÷ÀÎÅͷεµ Á¶»çÇÒ ¼ö ÀÖ´Ù.

°³Çà Äڵ带 ÆÇ´ÜÇϴµ¥ ÇÑ ¹®Àڷθ¸À¸·Î´Â ºÎÁ·ÇÏ¸ç µÚÀÇ ¹®ÀÚ±îÁö °°ÀÌ ºÁ¾ß Çϱ⠶§¹®¿¡ AeIsLineEndÀÇ Àμö°¡ ¹®ÀÚ¿¡¼­ Æ÷ÀÎÅÍ·Î º¯°æµÈ °ÍÀÌ´Ù. ¸ÅÅ©·ÎÀÇ ¿øÇüÀÌ º¯°æµÇ¾úÀ¸¹Ç·Î °ü·Ã Äڵ嵵 ¸ðµÎ ¼öÁ¤ÇØ¾ß ÇÑ´Ù. ApiEditText.cpp¿¡ ´Ù¼¸ ±ºµ¥°¡ ÀÖ´Ù.

 

À§Ä¡

¿ø·¡ ÄÚµå

¼öÁ¤µÈ ÄÚµå

VK_HOME

AeIsLineEnd(pFrame->buf[toff])

AeIsLineEnd(pFrame->buf+toff)

ProcessIndent

AeIsLineEnd(pFrame->buf[toff])

AeIsLineEnd(pFrame->buf+toff)

CopyChar

AeIsLineEnd(pFrame->buf[toff])

AeIsLineEnd(pFrame->buf+toff)

IsParaEmpty

AeIsLineEnd(*p)

AeIsLineEnd(p)

InsertComment

AeIsLineEnd(*s)

AeIsLineEnd(s)

 

Á¤·ÄÀÇ ÇÙ½É ÇÔ¼öÀÎ GetLine¸¦ ¼öÁ¤ÇÏ¿© NULLÀ» ¹®¼­ ³¡À¸·Î º¸Áö ¾Ê°í AeIsDocEnd ÇÔ¼ö¸¦ È£ÃâÇÏ°í °³Çà ÄÚµå Á¡°Ë ·çƾµµ IsEnterCode ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù.

 

void CApiEditText::GetLine(int Line, int &s, int &e)

{

     ....

     if (Line == 0) {

          p=pFrame->buf;

          s=0;

     } else {

          p=pFrame->buf+pLine[Line-1].End;

        if (AeIsDocEnd(p)) {

              s=-1;

              e=-1;

              return;

          }

 

        if (pFrame->IsEnterCode(p)) {

              p+=2;

          }

 

          s=p-pFrame->buf;

     }

 

     if (nWrap == 0 && RightWrap == 0) {

        while (!AeIsLineEnd(p)) {

           if (pFrame->IsDBCS(p-pFrame->buf)) {

               p++;

           }

           p++;

        }

     } else {

          for (acwidth=MarginWidth,Head=p;;) {

              ....

           if (AeIsLineEnd(p)) {

                   EndPos=p;

                   break;

              }

          ....

 

ÀÚµ¿ °³Çà »óÅ°¡ ¾Æ´Ï´õ¶óµµ DBCS Á¡°ËÀ» Çϸ鼭 °³Çà Äڵ带 ã¾Æ¾ß ÇÑ´Ù. ±×·¸Áö ¾Ê°í ¹«Á¶°Ç ¹ÙÀÌÆ® Á¡°Ë¸¸ ÇÒ °æ¿ì B0 0D 0A´Â °³Çà Äڵ尡 ¾Æ´Ô¿¡µµ °³Çà ÄÚµå·Î À߸ø Çؼ®ÇÏ°Ô µÈ´Ù. ÀÌ ÄÚµå´Â B0 0D°¡ ÇÑ ¹®ÀÚ·Î Àνĵǰí 0A°¡ ¶Ç Çѹ®ÀÚ·Î ÀνĵǾî¾ß ÇÑ´Ù. Àμâ¿ëÀÇ GetLineµµ ¹°·Ð ¼öÁ¤ÇØ¾ß ÇÑ´Ù. ¼öÁ¤ÇÏ´Â ¹æ¹ýÀº µ¿ÀÏÇÏ´Ù.

°³Çà Äڵ带 °ËÃâÇÏ´Â ¸ðµç °÷À» ¼öÁ¤ÇÑ´Ù. ¿ÀÇÁ¼Â À§Ä¡ÀÇ ¹®ÀÚ ÄÚµå¿Í '\r'À» Á÷Á¢ ºñ±³ÇÏ´Â ¹æ½ÄÀ» »ç¿ëÇߴµ¥ '\r'¸¸À¸·Î °³Çà ÄÚµå¶ó°í º¼ ¼ö ¾ø°Ô µÇ¾ú´Ù. ¼öÁ¤ÇÒ °÷ÀÌ Á» ¸¹´Ù. ¸ÕÀú ÇÁ·¹ÀÓ¿¡ 4±ºµ¥ ÀÖ´Ù.

 

À§Ä¡

¿ø·¡ ÄÚµå

¼öÁ¤µÈ ÄÚµå

IsDBCS

buf[nPos]=='\r' && buf[nPos+1]=='\n'

IsEnterCode(nPos)

GetPrevOff

buf[n]=='\r' && buf[n+1]=='\n'

IsEnterCode(n)

FindParaStart

buf[n]=='\r' && buf[n+1]=='\n'

IsEnterCode(n)

IncludeEnter

buf[nPos]=='\r'

IsEnterCode(nPos)

 

nPosÀ§Ä¡°¡ '\r'ÀÌ°í ±× ´ÙÀ½ À§Ä¡°¡ '\n'ÀÏ ¶§¸¦ °³Çà ÄÚµå·Î ÆÇ´ÜÇߴµ¥ º°µµÀÇ ¸ÅÅ©·Î ÇÔ¼ö°¡ ¸¸µé¾îÁ® ÀÖÀ¸¹Ç·Î ÀÌ ÇÔ¼ö¸¦ ¾²µµ·Ï ÇÏÀÚ. ´ÙÀ½Àº ºäÀÇ ÇÔ¼ö¸¦ ¼öÁ¤ÇÑ´Ù.

 

À§Ä¡

¿ø·¡ÄÚµå

¼öÁ¤µÈ ÄÚµå

VK_LEFT

pFrame->buf[pFrame->GetPrevOff(off)]=='\r'

pFrame->IsEnterCode(pFrame->GetPrevOff(off))

VK_RIGHT

pFrame->buf[pLine[r].End]=='\r'

pFrame->buf[off]!='\r'

pFrame->IsEnterCode(pLine[r].End)

!pFrame->IsEnterCode(off)

VK_END

pFrame->buf[off]]!='\r' && pFrame->buf[off]!=0

!AeIsLineEnd(pFrame->buf+off)

OnChar

pFrame->buf[off] != '\r'

!pFrame->IsEnterCode(off)

OnImeChar

pFrame->buf[off] != '\r'

!pFrame->IsEnterCode(off)

OnImeComposition

pFrame->buf[off] != '\r'

!pFrame->IsEnterCode(off)

SetCaret

pFrame->buf[toff] == '\r'

pFrame->IsEnterCode(toff)

Insert

*p=='\r'

pFrame->IsEnterCode(str,len,p)

Delete

p[i]=='\r'

pFrame->IsEnterCode(p+i)

GetRCFromOff

pFrame->buf[pLine[r].End] == 0 || pFrame->buf[pLine[r].End] == '\r'

AeIsLineEnd(pFrame->buf+pLine[r].End)

GetXPosOnLine

pFrame->buf[p-pFrame->buf]!='\r' && pFrame->buf[p-pFrame->buf]!=0

!AeIsLineEnd(p)

DrawSegment

pFrame->buf[SegOff+len] == '\r'

pFrame->IsEnterCode(SegOff+len)

GetOffFromXY

pFrame->buf[p-pFrame->buf]!='\r' && pFrame->buf[p-pFrame->buf]!=0

!AeIsLineEnd(p)

UpdateLineInfo

pFrame->buf[e]=='\r'

pFrame->IsEnterCode(e)

BeginPrint

pFrame->buf[e]=='\r'

pFrame->IsEnterCode(e)

 

ƯÁ¤ À§Ä¡ÀÇ Äڵ带 '\r' ¹®ÀÚ »ó¼ö¿Í ºñ±³ÇÏ´Â °ÅÀÇ ¸ðµç °÷À» IsEnterCode ¶Ç´Â AeIsLineEnd È£Ãâ·Î ¹Ù²ã¾ß ÇÑ´Ù. ´Ü '\r'°ú Á÷Á¢ ºñ±³ÇÏ´Â Äڵ带 ±×´ë·Î »ç¿ëÇØ¾ß ÇÏ´Â °÷µµ Àִµ¥ OnChar¿¡¼­ ÀÔ·ÂµÈ Å°°¡ EnterÅ°ÀÎÁö °Ë»çÇÒ ¶§´Â ¿©ÀüÈ÷ '\r'ÀÌ »ç¿ëµÈ´Ù. À̶§ »ç¿ëµÈ '\r'Àº ¹®ÀÚ Äڵ尡 ¾Æ´Ï¶ó Å° ÄÚµåÀ̹ǷΠIsEnterCode·Î ¹Ù²ã¼­´Â ¾ÈµÈ´Ù. InsertÀÇ °æ¿ì ¹®¼­»ó¿¡ ÀÖÁö ¾ÊÀº µ¥ÀÌÅ͸¦ °Ë»çÇϹǷΠ¼¼ ¹ø° IsEnterCode ÇÔ¼ö¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù. GetDocInfo´Â ¸¹ÀÌ °íÃÄ¾ß ÇÑ´Ù.

 

int CApiEditText::GetDocInfo(int type)

{

     int i;

     int count=0;

     int han=0;

     TCHAR *p=pFrame->buf;

 

     switch (type) {

     case AE_DOC_TOTALPARA:

          return pLine[TotalLine-1].nPara;

     case AE_DOC_WORD:

        for (;!AeIsDocEnd(p);) {

           if (AeIsWhiteSpace(*p) || pFrame->IsEnterCode(p)) {

               while ((AeIsWhiteSpace(*p) || *p=='\r' || *p=='\n') && !AeIsDocEnd(p))

                        p++;

              } else {

                   count++;

               while (!AeIsWhiteSpace(*p) && *p!='\r' && *p!='\n' && !AeIsDocEnd(p))

                        p++;

              }

          }

          break;

     case AE_DOC_EXSPACESIZE:

        for (;!AeIsDocEnd(p);p++) {

              if (!(AeIsWhiteSpace(*p) || *p=='\r' || *p=='\n')) {

                   count++;

              }

          }

          break;

     case AE_DOC_CHAR:

     case AE_DOC_HAN:

        for (;!AeIsDocEnd(p);p++) {

          ....

 

¿©±â¼­ °³Çà Äڵ尡 ¾Æ´Ñ CR, LF´Â ´Ü¼øÇÑ ¹®ÀÚ·Î °è»êÇÏ¿´´Ù.

¶ó.ÆíÁýÇÔ¼ö ¼öÁ¤

°³Çà ÄÚµå, ¹®¼­ ³¡ µîÀ» Á÷Á¢ ´Ù·ç´Â ÆíÁý °ü·Ã ÇÔ¼öµéÀ» ¼öÁ¤ÇÑ´Ù. ÀÌ ÇÔ¼öµéÀº ¹öÆÛ¸¦ Á÷Á¢ ¼öÁ¤Çϱ⠶§¹®¿¡ ¸¹Àº ºÎºÐÀ» °íÃÄ¾ß ÇÑ´Ù. RemoveExtraSpace ÇÔ¼ö´Â ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇÑ´Ù.

 

void CApiEditText::RemoveExtraSpace()

{

     int SelFirst, SelSecond;

     TCHAR *src,*dest;

     TCHAR *s,*d;

     int len;

     int nDiff;

 

     if (SelStart==SelEnd) {

          SelFirst=0;

          SelSecond=pFrame->doclen;

     } else {

          SelFirst=min(SelStart,SelEnd);

          SelSecond=max(SelStart,SelEnd);

     }

     len=SelSecond-SelFirst;

 

    src=(TCHAR *)malloc(len);

    dest=(TCHAR *)malloc(len);

    memcpy(src,pFrame->buf+SelFirst,len);

 

    s=src+len-1;

    d=dest+len-1;

     nDiff=0;

     for (;;) {

          *d=*s;

          if (s==src)

              break;

          d--;

          s--;

 

        if (pFrame->IsEnterCode(src,len,s+1)) {

              while (AeIsWhiteSpace(*s) && s!=src) {

                    s--;

                   nDiff--;

              }

          }

     }

 

     if (nDiff) {

          pFrame->StartUndoGroup();

          Delete(SelFirst,len);

        Insert(SelFirst,d,len+nDiff);

          pFrame->EndUndoGroup();

     ....

 

¹®ÀÚ¿­À» ´Ù·ç´Â °ÍÀÌ ¾Æ´Ï¹Ç·Î NULL ¹®ÀÚºÐÀº ÇÒ´ç·®¿¡¼­ Á¦¿ÜÇÏ°í lstrcpynÀ¸·Î ¿øº» ¹®ÀÚ¿­À» º¹»çÇÏ´Â ´ë½Å memcpy·Î º¹»çÇß´Ù. º¹»ç ½ÃÀÛ À§Ä¡µµ Á¦ÀÏ ³¡ ¹®ÀÚÀÎ src+len-1À¸·Î ¼³Á¤ÇÏ°í °³Çà ÄÚµåÀÎÁö °Ë»çÇÏ´Â Äڵ嵵 IsEnterCode ÇÔ¼ö·Î ¼öÁ¤ÇÑ´Ù. ³ª¸ÓÁö ÆíÁý ÇÔ¼öµéµµ ºñ½ÁÇÑ ¹æ½ÄÀ¸·Î ¼öÁ¤ÇÑ´Ù. BlockIndent ÇÔ¼ö´Â ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇÑ´Ù.

 

void CApiEditText::BlockIndent(BOOL bUnindent)

{

     ....

    src=(TCHAR *)malloc(ed-st);

    dest=(TCHAR *)malloc(ed-st+(pr2-pr1+1)*TabWidth);

    memcpy(src,pFrame->buf+st,ed-st);

 

     s=src;

     d=dest;

     nDiff=0;

     if (!bUnindent) {

          for (;;) {

              if (!IsParaEmpty(s)) {

                   MakeIndentString(1,d,4096);

                   d=d+lstrlen(d);

                   nDiff++;

              }

 

           while (!pFrame->IsEnterCode(src,ed-st,s) && s != src+ed-st) {

                   *d++=*s++;

              }

           if (s==src+ed-st) {

               *d=*s;

                   break;

              } else {

                   *d++=*s++;

                   *d++=*s++;

              }

          }

 

          if (SelFirst!=st) {

              SelFirst+=(pFrame->bSpaceForTab ? TabWidth:1);

          }

          SelSecond+=(pFrame->bSpaceForTab ? TabWidth:1)*nDiff;

     } else {

          for (;;) {

              ....

           while (!pFrame->IsEnterCode(src,ed-st,s) && s != src+ed-st) {

                   *d++=*s++;

              }

           if (s==src+ed-st) {

               *d=*s;

                   break;

              } else {

                   *d++=*s++;

                   *d++=*s++;

              }

          }

          SelSecond-=nDiff;

     }

 

     pFrame->StartUndoGroup();

    Delete(st,ed-st);

    Insert(st,dest,d-dest);

     pFrame->EndUndoGroup();

     ....

 

¹öÆÛÀÇ µ¥ÀÌÅ͸¦ Á¡°ËÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó Àӽà ¹öÆÛ¸¦ ´ë»óÀ¸·Î ÇϹǷΠAeIsLineEnd ¸ÅÅ©·Î¸¦ ¾µ ¼ö ¾ø´Ù. InsertCommentµµ °ÅÀÇ À¯»çÇÏ´Ù

 

void CApiEditText::InsertComment(BOOL bUnComment)

{

     ....

    src=(TCHAR *)malloc(ed-st);

    dest=(TCHAR *)malloc(ed-st+(pr2-pr1+1)*clen);

    memcpy(src,pFrame->buf+st,ed-st);

 

     s=src;

     d=dest;

     nDiff=0;

     if (!bUnComment) {

          for (;;) {

              for (i=0;i<clen;i++) {

                   *d++=szComment[i];

                   nDiff++;

              }

 

           while (!pFrame->IsEnterCode(src,ed-st,s) && s != src+ed-st) {

                   *d++=*s++;

              }

           if (s==src+ed-st) {

               *d=*s;

                   break;

              } else {

                   *d++=*s++;

                   *d++=*s++;

              }

          }

 

          if (SelFirst!=st) {

              SelFirst+=clen;

          }

          SelSecond+=nDiff;

     } else {

          for (;;) {

              if (_strnicmp(s,szComment,clen)==0) {

                   s+=clen;

                   nDiff-=clen;

 

                   if (bFirstPara) {

                        SelFirst+=nDiff;

                        SelFirst=max(SelFirst,st);

                        bFirstPara=FALSE;

                   }

              }

 

           while (!pFrame->IsEnterCode(src,ed-st,s) && s != src+ed-st) {

                   *d++=*s++;

              }

           if (s==src+ed-st) {

               *d=*s;

                   break;

              } else {

                   *d++=*s++;

                   *d++=*s++;

              }

          }

          SelSecond+=nDiff;

     }

 

     pFrame->StartUndoGroup();

    Delete(st,ed-st);

    Insert(st,dest,d-dest);

     pFrame->EndUndoGroup();

 

ChangeCase ÇÔ¼ö´Â ¸¹ÀÌ ¼öÁ¤µÇ¾î¾ß ÇϹǷΠ¿ÏÀüÈ÷ ´Ù½Ã ÀÛ¼ºÇÏ´Â °ÍÀÌ ´õ ÁÁ´Ù.

 

void CApiEditText::ChangeCase(int action)

{

     int SelFirst, SelSecond;

     int len;

     TCHAR *tbuf;

     TCHAR *p;

     int toff;

 

     if (SelStart == SelEnd) {

          switch (action) {

          case 0:

          case 1:

          case 2:

           if (AeIsDocEnd(pFrame->buf+off)) {

                   return;

              }

              SelFirst=SelSecond=off;

              if (pFrame->IsDBCS(off)) {

                   len=2;

              } else {

                   len=1;

              }

              break;

          case 3:

              GetNowWord(off,SelFirst,SelSecond);

              len=SelSecond-SelFirst;

              break;

          case 4:

              return;

          }

     } else {

          SelFirst=min(SelStart,SelEnd);

          SelSecond=max(SelStart,SelEnd);

          len=SelSecond-SelFirst;

     }

 

    tbuf=(TCHAR *)malloc(len);

    memcpy(tbuf,pFrame->buf+SelFirst,len);

 

     switch (action) {

     case 0:

        p=tbuf;

        while (p-tbuf < len) {

           if (IsCharLower(*p)) {

               *p-=0x20;

           }

           p++;

        }

          break;

     case 1:

        p=tbuf;

        while (p-tbuf < len) {

           if (IsCharUpper(*p)) {

               *p+=0x20;

           }

           p++;

        }

          break;

     case 2:

          p=tbuf;

        while (p-tbuf < len) {

              if (IsCharUpper(*p)) {

                   *p+=0x20;

              } else if (IsCharLower(*p)) {

                   *p-=0x20;

              }

              p++;

          }

          break;

     case 3:

          p=tbuf;

          if (IsCharLower(*p)) {

              *p-=0x20;

          }

          p++;

        while (p-tbuf < len) {

              if (IsDelimiter(SelFirst+(p-tbuf)-1)) {

                   if (IsCharLower(*p)) {

                        *p-=0x20;

                   }

              } else {

                   if (IsCharUpper(*p)) {

                        *p+=0x20;

                   }

              }

              p++;

          }

          break;

     case 4:

          p=tbuf;

 

          toff=SelFirst;

          while (AeIsWhiteSpace(pFrame->buf[toff]) && toff > 0)

              toff--;

        if (toff==0 || pFrame->IsEnterCode(toff-1) || pFrame->buf[toff]=='.') {

              if (IsCharLower(*p)) {

                   *p-=0x20;

              }

          } else {

              if (IsCharUpper(*p)) {

                   *p+=0x20;

              }

          }

          p++;

 

        while (p-tbuf < len) {

           if (*p=='.' || pFrame->IsEnterCode(tbuf,len,p-1)) {

                   p++;

               while (AeIsWhiteSpace(*p) && p-tbuf < len)

                        p++;

               if (p-tbuf == len)

                        break;

                   if (IsCharLower(*p)) {

                        *p-=0x20;

                   }

              } else {

                   if (IsCharUpper(*p)) {

                        *p+=0x20;

                   }

              }

              p++;

          }

          break;

     }

 

     pFrame->StartUndoGroup();

    Delete(SelFirst,len);

    Insert(SelFirst,tbuf,len);

     pFrame->EndUndoGroup();

 

     if (SelStart==SelEnd && action < 3) {

          off=pFrame->GetNextOff(off);

     }

     free(tbuf);

     Invalidate(SelFirst);

     SetCaret();

}

 

ConvertSpaceTab ÇÔ¼öµµ ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇÑ´Ù.

 

void CApiEditText::ConvertSpaceTab(BOOL bToSpace)

{

     ....

    src=(TCHAR *)malloc(len);

    memcpy(src,pFrame->buf+SelFirst,len);

    for (s=src,i=0;s-src != len;s++) {

          if (*s=='\t')

              i++;

     }

    dest=(TCHAR *)malloc(len+i*(TabWidth-1));

 

     s=src;

     d=dest;

     nDiff=0;

     if (bToSpace) {

        while (s-src < len) {

              if (*s=='\t') {

                   for (i=0;i<TabWidth;i++) {

                        *d++=' ';

                   }

                   nDiff+=(TabWidth-1);

                   s++;

              } else {

                   *d++=*s++;

              }

          }

     } else {

        while (s-src < len) {

              bFind=TRUE;

              for (i=0;i<TabWidth;i++) {

                   if (s[i]==0 || s[i]!=' ') {

                        bFind=FALSE;

                        break;

                   }

              }

 

              if (bFind) {

                   *d++='\t';

                   s+=TabWidth;

                   nDiff+=(-TabWidth+1);

              } else {

                   *d++=*s++;

              }

          }

     }

     *d=*s;

     SelSecond += nDiff;

 

     pFrame->StartUndoGroup();

    Delete(SelFirst,len);

    Insert(SelFirst,dest,d-dest);

     ....

 

ÆíÁý °ü·Ã ÇÔ¼öµéÀ» ¸ðµÎ ¼öÁ¤Çß´Ù. ¿©±â±îÁö ÀÛ¾÷ÇÑ ÈÄ ÄÄÆÄÀÏÇϸé ÀÏ´ÜÀº ¿¡·¯¾øÀÌ Àß ÄÄÆÄÀ쵃 °ÍÀÌ´Ù. ¸¸¾à ÀÌ »óÅ¿¡¼­ ÄÄÆÄÀÏ ¿¡·¯°¡ ¹ß»ýÇÑ´Ù¸é ÀÛ¾÷ °úÁ¤ Áß¿¡ ÀϺθ¦ ´©¶ôÇ߰ųª À߸ø ¼öÁ¤ÇÑ °æ¿ìÀ̹ǷΠ¿¡·¯ ¸Þ½ÃÁö ³»¿ë´ë·Î ¼öÁ¤ÇÑ´Ù.

¸¶.¹ÝÂÊ DBCS

¹ÝÂÊ DBCS¶õ ÇÑ±Û 2¹ÙÀÌÆ®ÀÇ ¾ÕÂÊ 1¹ÙÀÌÆ®¸¸ ¹®¼­ ³¡¿¡ °É·Á ÀÖ´Â ºñÁ¤»óÀûÀÎ ÄÚµåÀÌ´Ù. ¹®¼­ ³¡¿¡¼­¸¸ ³ªÅ¸³¯ ¼ö ÀÖÀ¸¸ç Áß°£¿¡´Â Àý´ë·Î ³ªÅ¸³¯ ¼ö ¾ø´Ù. ¿¹¸¦ µé¾î ´ÙÀ½ ´Ù¼¸ ¹ÙÀÌÆ®·Î ±¸¼ºµÈ ªÀº ¹®¼­¸¦ °¡Á¤ÇØ º¸ÀÚ.

¾ÕÂÊÀÇ 4¹ÙÀÌÆ®´Â ¸ðµÎ ¿µ¹®ÀÚÀ̹ǷΠ1¹ÙÀÌÆ® ¹®ÀÚÀÌÁö¸¸ ¸¶Áö¸· B0´Â 2¹ÙÀÌÆ®ÀÇ ÇѱÛÀÌ´Ù. ±×·¯³ª ¹®¼­°¡ ¿©±â¼­ ³¡³µ±â ¶§¹®¿¡ ÇѱÛÀ» ±¸¼ºÇÏ´Â µÚÂÊ Äڵ带 ±¸ÇÒ ¼ö ¾ø´Ù. ÀÌ ¹®¼­°¡ ¸Þ¸ð¸®·Î ¿Ã¶ó¿À¸é ¹®¼­°¡ ¿Ã¶ó¿Â µÚÂÊÀÇ ¸Þ¸ð¸®±îÁöµµ ¹®¼­ÀÇ ÀϺκÐÀ¸·Î ÀνÄÇÏ°í Ãâ·ÂÇϰųª À̵¿ÇÏ°Ô µÉ °ÍÀÌ´Ù. ¹°·Ð ÀÌ·± ¹ÝÂÊ DBCS°¡ ½ÇÁ¦·Î ³ªÅ¸³¯ ºóµµ´Â Áö±ØÈ÷ ³·Áö¸¸ Ȥ½Ã¶óµµ ÀÌ·± Äڵ尡 Á¸ÀçÇϸé ÇÁ·Î±×·¥ÀÌ ´Ù¿îµÇ´Â Ä¡¸íÀûÀÎ ¹®Á¦¸¦ ÀÏÀ¸Å³ ¼ö ÀÖ´Ù.

ÀÌ·± ¹®¼­¸¦ ÇöÀç ¹æ½Ä´ë·Î Á¤·ÄÇϸé B0¸¦ ¸¸³µÀ» ¶§ 2¹ÙÀÌÆ® ¹®ÀÚ·Î ÀνÄÇÏ¿© ¹®¼­ÀÇ µÞºÎºÐ±îÁö Á¤·ÄÇØ ¹ö¸± °ÍÀ̸ç ÀÌ·¸°Ô Á¤·ÄµÈ Á¤º¸¸¦ ÂüÁ¶Çϸé ÇÁ·Î±×·¥ÀÌ ¾î¶»°Ô µ¿ÀÛÇÏ°Ô µÉ Áö ¿¹ÃøÇϱ⠾î·Æ´Ù. ±×·¡¼­ ÀÌ·± ¹®ÀÚ¸¦ ¸¸³¯ ¶§´Â ºñ·Ï ¹®ÀÚÀÇ °æ°èÀÌ´õ¶óµµ ¿©±â¸¦ ÁÙ ³¡À¸·Î À߶ó¾ß ÇÏ¸ç ±×·¯±â À§Çؼ­´Â ¹ÝÂÊÂ¥¸® DBCS ¹®ÀÚ¸¦ 1¹ÙÀÌÆ® ¹®ÀÚ·Î Ãë±ÞÇØ¾ß ÇÑ´Ù. IsDBCS ÇÔ¼ö¸¦ ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇÑ´Ù.

 

BOOL CApiEdit::IsDBCS(int nPos)

{

     return (IsDBCSLeadByte(buf[nPos]) && (nPos+1 < doclen)

          || IsEnterCode(nPos));

}

 

DBCS ¹®ÀÚÀÇ µÚÂÊ ¹ÙÀÌÆ®µµ ¹®¼­ ¹üÀ§¿¡ ¼ÓÇÏ´ÂÁö¸¦ Á¡°ËÇß´Ù. ÀÌ·¸°Ô ÇÏ¸é ¹ÝÂÊÂ¥¸® DBCS ¹®ÀÚ´Â SBCS·Î Ãë±ÞµÈ´Ù. ´ÙÀ½ Ç׿¡¼­ ³íÇÒ ÅؽºÆ® Ãâ·Â ¹®Á¦·Î ÀÎÇØ 0x80À» SBCS·Î Ãë±ÞÇϱâ À§ÇØ IsDBCSLeadByte ÇÔ¼ö¸¦ ´Ù½Ã ä¿ëÇß´Ù. 1.0 ¸¶Áö¸·¿¡¼­ ÇÑ±Û Á¶ÇÕÇü°úÀÇ ¹®Á¦ ¶§¹®¿¡ 0x80À» Á¦¿ÜÇß¾ú´Âµ¥ ÀÌÁ¦ ÀÌÁø ÆíÁýÀÌ °¡´ÉÇØÁ³À¸¹Ç·Î ¿î¿µÃ¼Á¦ÀÇ ÆÇ´ÜÀ» µû¶ú´Ù.

ÀÌ ÇÔ¼ö¸¦ ¼öÁ¤ÇÔÀ¸·Î½á ¹ÝÂÊ DBCS·Î ÀÎÇÑ Á¤·Ä ¹®Á¦´Â ÇØ°áÇÒ ¼ö ÀÖ´Ù. ±×·¯³ª ÀÌ·¸°Ô ¸¸µé¾îÁø ¹ÝÂÊÂ¥¸® DBCS ¹®Àڴ ȥÀÚ¼­ Ãâ·ÂµÉ ¼ö ÀÖ¾î¾ß ÇϹǷΠ0x80ÀÌ ³Ñ´Â 1¹ÙÀÌÆ® ¹®ÀÚµµ ÆøÀ» °¡Á®¾ß ÇÑ´Ù. ¶ÇÇÑ ¹®¼­ Áß°£¿¡ NULLÀÌ ³ª¿Ã ¼öµµ ÀÖ°í 0x80µµ SBCS·Î Ãë±ÞµÇ¹Ç·Î ÀÌ Äڵ嵵 ¹®ÀÚÆøÀ» °¡Á®¾ß ÇÑ´Ù. ¹®ÀÚÆøÀ» ÀúÀåÇÏ´Â arChWidth ¹è¿­ÀÇ Å©±â¸¦ 256À¸·Î ´Ã¸®°í PrepareCharWidth¿¡¼­ ¸ðµç ¹®ÀÚµéÀÇ ÆøÀ» Á¶»çÇÑ´Ù.

 

class CApiEditText : public CWindow

{

     ....

    int arChWidth[256];

 

void CApiEditText::PrepareCharWidth(HDC hdc)

{

     ....

    for (i=0;i<=255;i++) {

          Char[0]=i;

          GetTextExtentPoint32(hdc, Char, 1, &sz);

          arChWidth[i]=(BYTE)sz.cx;

     }

    arChWidth[0]=arChWidth[32];

 

1~127±îÁö Á¶»çÇß¾úÀ¸³ª 0~255·Î ¹üÀ§¸¦ ³ÐÇû°í 1.0¿¡¼­´Â NULL¹®ÀÚ°¡ °ø¹é°ú °°Àº ÆøÀ» °¡Á³À¸³ª ÀÌÁ¦ ½ÇÁ¦ ÆøÀ» °è»êÇß´Ù. arChWidth[0]¿¡ °ø¹éÆøÀ» ´ëÀÔÇÏ´Â ÄÚµå´Â »èÁ¦ÇÑ´Ù. GetCharWidth¿¡¼­ ÀÌ ¹®ÀÚÀÇ ÆøÀ» Á¶»çÇÒ ¶§ ij½ºÆÃÇÑ´Ù. TCHARÇüÀº ºÎÈ£°¡ Àֱ⠶§¹®¿¡ 0x80ÀÌ -129°¡ µÇ¹Ç·Î BYTE *ÇüÀ¸·Î ij½ºÆÃÇÑ ÈÄ Àоî¾ß 0x80ÀÌ ³Ñ´Â 1¹ÙÀÌÆ® ¹®ÀÚµµ ÆøÀ» Á¦´ë·Î Á¶»çÇÒ ¼ö ÀÖ´Ù.

 

int CApiEditText::GetCharWidth(TCHAR *ch, int len)

{

     ....

     if (len==1) {

        return arChWidth[*(BYTE *)ch];

          ....

 

¹ÝÂÊ DBCSÀÇ ¹ß»ý ºóµµ´Â »ý°¢º¸´Ù ÈξÀ ´õ ³ô´Ù. ´Ù¿î·Îµå ¹Þ´Ù°¡ Áß´ÜµÈ °æ¿ì ¿ì¿¬È÷ ¹ß»ýÇÒ ¼öµµ ÀÖÁö¸¸ ´ç±ÙÀÇ °æ¿ì´Â ´õ ÀÚÁÖ ¹ß»ýÇÒ ¼ö Àִµ¥ ¿Ö³ÄÇϸé Çí»ç ºä¸¦ Áö¿øÇϱ⠶§¹®ÀÌ´Ù. ÆÄÀÏ ³¡À¸·Î °¡¼­ B0 A1À» Ãß°¡ÇÒ ¶§ óÀ½ ÀÔ·ÂÇÑ B0°¡ ÀϽÃÀûÀ¸·Î ¹ÝÂÊ DBCS°¡ µÇ´Â °ÍÀÌ´Ù. ¹®¼­¸¦ Ãâ·ÂÇÏ´Â DrawLine ÇÔ¼öµµ ¼öÁ¤ÇØ¾ß ÇÑ´Ù. ¿¹»óÄ¡ ¸øÇß´ø ¹®Á¦°¡ ÀÖ´Ù.

 

int CApiEditText::DrawLine(HDC hdc, int Line)

{

     ....

     for (;;) {

          for (len=0;;) {

              if (nowoff+len == pLine[Line].End || len > 4096) {

                   if (SelStart != SelEnd && nowoff >= SelFirst && nowoff < SelSecond) {

                        bInSel=TRUE;

                   } else {

                        bInSel=FALSE;

                   }

                   break;

              }

              if (pFrame->buf[nowoff+len] == '\t') {

                   if (len == 0)

                        len=1;

                   if (SelStart != SelEnd && nowoff >= SelFirst && nowoff < SelSecond) {

                        bInSel=TRUE;

                   } else {

                        bInSel=FALSE;

                   }

                   break;

              }

 

¿ø·¡ ÄÚµå´Â ÅÇÀ» ¸ÕÀú Á¡°ËÇÏ°í ÁÙ ³¡À» Á¡°ËÇßÀ¸³ª µÎ Á¶°ÇÀÇ Á¡°Ë ¼ø¼­¸¦ ¹Ù²Ù¾î¾ß ÇÑ´Ù. ÀÌÀü ¹öÀü¿¡¼­ º° »ý°¢¾øÀÌ Á¶°Ç¹®µéÀ» ¼öÆò ¹èÄ¡Çß¾ú´Âµ¥ ¹®¼­ ³¡¿¡ Ç×»ó NULL¹®ÀÚ°¡ ÀÖ¾ú±â ¶§¹®¿¡ ÁÙ µÚÂʱîÁö ÀÐÀ» À§ÇèÀÌ ¾ø¾ú´Ù. ±×·¯³ª Áö±ÝÀº NULLÀÌ ¾ø°í doclen º¯¼ö·Î¸¸ ¹®¼­ ±æÀ̸¦ ÆÇ´ÜÇÑ´Ù. ¹®¼­ Á¦ÀÏ ³¡¿¡ ÀÖ´Â TabÀ» »èÁ¦Çϸé doclenÀÌ 1 ÁÙ¾îµé »Ó Tab¹®ÀÚ°¡ NULL¹®ÀÚ·Î µ¤¿©ÁöÁö ¾Ê´Â´Ù. ÀÌ »óÅ¿¡¼­ TabÀ» ¸ÕÀú Á¡°ËÇØ ¹ö¸®¸é ÁÙ ³¡À» Áö³ªÃÄ ¹ö¸°´Ù.

¿©±â±îÁö ÀÛ¾÷Çϸé ÀÓÀÇÀÇ ÀÌÁø ½ºÆ®¸²À» ÀÐÀ» ¼ö ÀÖ°í ¾î¶² ÆÄÀÏÀ» ¿­´õ¶óµµ ÃÖ¼ÒÇÑ Á×Áö´Â ¾Ê´Â´Ù. ÀÏ´Ü Á¦´ë·Î ¼öÁ¤Çß´ÂÁö ÄÄÆÄÀϺÎÅÍ ÇØ º¸µÇ Á÷Á¢ ÀÛ¾÷Çß´Ù¸é Çѵΰ³ÂëÀÇ ¿ÀŸ°¡ ÀÖÀ» ¼ö ÀÖÀ¸¹Ç·Î ²Ä²ÄÇÏ°Ô ¼öÁ¤ÇÏÀÚ. ½ÇÇàÇÑ ÈÄ Arches.bmp ÆÄÀÏÀ» ¿­¾î º¸¸é ÀÌ ÆÄÀÏÀÇ ³»¿ë Àüü°¡ ´Ù º¸ÀδÙ.

ºñÆ®¸Ê µ¥ÀÌÅ͸¦ ±×´ë·Î ÅؽºÆ® ÆíÁý±â·Î »Ñ¸° °ÍÀ̹ǷΠÀÌ»óÇÏ°Ô º¸ÀÌ´Â °ÍÀÌ ´ç¿¬ÇÏ´Ù. ¹®¼­ ³»¿ë Àüü°¡ º¸À̱â´Â ÇÏÁö¸¸ ¾ÆÁ÷ ¹®Á¦°¡ ¸¹Àºµ¥ ºí·ÏÀ» ¼±ÅÃÇØ º¸¸é µÚÂÊ ±ÛÀÚµéÀÇ À§Ä¡°¡ º¯ÇÏ´Â °ÍÀ» º¼ ¼ö ÀÖ´Ù. ÀÌ ¹®Á¦µµ °°ÀÌ ÇØ°áÇØ¾ß ÇÑ´Ù.

¹Ù.ÅؽºÆ® Ãâ·Â

´ç±ÙÀÇ ±âº» ÅؽºÆ® Ãâ·Â ÇÔ¼ö´Â TextOutÀÌ´Ù. ±âº»ÀûÀÎ ÅؽºÆ® Ãâ·Â ÇÔ¼ö·Î Àß »ç¿ëÇØ ¿Ô´Âµ¥ ÀÌ °£´ÜÇÑ ÇÔ¼ö¿¡ ¸î°¡Áö ¹®Á¦°¡ ÀÖ´Ù. Á¤»óÀûÀÎ ¹®ÀÚ Äڵ带 Ãâ·ÂÇÏ¸é ¾Æ¹« ¹®Á¦°¡ ¾øÀ¸³ª ±Û²Ã¿¡ Á¤ÀǵÇÁö ¾ÊÀº ¹®ÀÚ¸¦ Ãâ·ÂÇÒ ¶§ ¾à°£ ÀÌ»óÇÑ µ¿ÀÛÀ» ÇÑ´Ù. ´ç±ÙÀº ÀÌÁø ½ºÆ®¸²À» Ãâ·ÂÇØ¾ß ÇϹǷΠÇöÀç ±Û²Ã¿¡ Á¤ÀǵÇÁö ¾ÊÀº ¹®ÀÚ¶óµµ ÃÖ¼ÒÇÑ µðÆúÆ® 󸮴 ÇØ¾ß Çϴµ¥ ÀÌ ÇÔ¼ö°¡ ¿øÇϴ´ë·Î µ¿ÀÛÇÏÁö ¾Ê´Â °ÍÀÌ´Ù. ´ÙÀ½ Å×½ºÆ® ¿¹Á¦·Î TextOut ÇÔ¼ö¸¦ Å×½ºÆ®ÇØ º¸ÀÚ.

 

HWND hList;

BOOL bUseSystem=TRUE;

BYTE str[16]={0xa0,0x00,0x31,0x32,0x33,};

BYTE str2[16]={0x80,0x31};

BYTE str3[16]={0x41,0x42,0x43,0x80,0x44,0x45,0x46};

BYTE str4[16]={0x41,0x42,0x43,0x44,0x45,0x46};

BYTE str5[16]={0x00,0x00};

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

{

     HDC hdc;

     PAINTSTRUCT ps;

     SIZE sz;

     TCHAR Mes[256];

     HFONT font, oldfont;

 

     switch(iMessage) {

     case WM_CREATE:

          hList=CreateWindow("listbox",NULL,WS_CHILD | WS_VISIBLE | WS_BORDER,

              200,10,300,150,hWnd,(HMENU)0,g_hInst,NULL);

          return 0;

     case WM_LBUTTONDOWN:

          bUseSystem=!bUseSystem;

          InvalidateRect(hWnd,NULL,TRUE);

          return 0;

     case WM_PAINT:

          SendMessage(hList,LB_RESETCONTENT,0,0);

          hdc=BeginPaint(hWnd, &ps);

          if (!bUseSystem) {

              font=CreateFont(16,0,0,0,0,0,0,0,HANGEUL_CHARSET,3,2,1,

                   VARIABLE_PITCH | FF_ROMAN,"±¼¸²");

              oldfont=(HFONT)SelectObject(hdc,font);

          }

          SetBkColor(hdc,RGB(0,0,255));

 

          // ÇѲ¨¹ø¿¡ Ãâ·Â

          TextOut(hdc,10,10,(TCHAR *)str,5);

 

          // °³º° ¹®ÀÚº°·Î Ãâ·Â

          TextOut(hdc,10,30,(TCHAR *)str,2);

          GetTextExtentPoint32(hdc,(TCHAR *)str,2,&sz);

          TextOut(hdc,10+sz.cx,30,(TCHAR *)str+2,3);

 

          // 0xa0 0x00 0x31ÀÇ ÆøÀÌ ¾Õ µÎ ¹ÙÀÌÆ®ÀÇ Æø°ú °°À½

          GetTextExtentPoint32(hdc,(TCHAR *)str,1,&sz);

          wsprintf(Mes,"0xa0ÀÇ Æø=%d",sz.cx);

          SendMessage(hList,LB_ADDSTRING,0,(LPARAM)Mes);

          GetTextExtentPoint32(hdc,(TCHAR *)str,2,&sz);

          wsprintf(Mes,"0xa0, 0x00ÀÇ Æø=%d",sz.cx);

          SendMessage(hList,LB_ADDSTRING,0,(LPARAM)Mes);

          GetTextExtentPoint32(hdc,(TCHAR *)str,3,&sz);

          wsprintf(Mes,"0xa0, 0x00, 0x31ÀÇ Æø=%d",sz.cx);

          SendMessage(hList,LB_ADDSTRING,0,(LPARAM)Mes);

          GetTextExtentPoint32(hdc,(TCHAR *)str,4,&sz);

          wsprintf(Mes,"0xa0, 0x00, 0x31, 0x32ÀÇ Æø=%d",sz.cx);

          SendMessage(hList,LB_ADDSTRING,0,(LPARAM)Mes);

 

          // 0x80 Å×½ºÆ®

          TextOut(hdc,10,60,(TCHAR *)str2,1);

          TextOut(hdc,10,80,(TCHAR *)str2,2);

          TextOut(hdc,10,110,(TCHAR *)str3,7);

          TextOut(hdc,10,130,(TCHAR *)str4,6);

 

          // 0x00 Å×½ºÆ®

          TextOut(hdc,10,160,(TCHAR *)str5,1);

          TextOut(hdc,10,180,(TCHAR *)str5,2);

          GetTextExtentPoint32(hdc,(TCHAR *)str5,1,&sz);

          wsprintf(Mes,"0x00ÀÇ Æø=%d",sz.cx);

          SendMessage(hList,LB_ADDSTRING,0,(LPARAM)Mes);

          GetTextExtentPoint32(hdc,(TCHAR *)str5,2,&sz);

          wsprintf(Mes,"0x00, 0x00ÀÇ Æø=%d",sz.cx);

          SendMessage(hList,LB_ADDSTRING,0,(LPARAM)Mes);

 

          if (!bUseSystem) {

              SelectObject(hdc,oldfont);

              DeleteObject(font);

          }

          EndPaint(hWnd, &ps);

          return 0;

     case WM_DESTROY:

          PostQuitMessage(0);

          return 0;

     }

     return(DefWindowProc(hWnd,iMessage,wParam,lParam));

}

 

¿©·¯ °¡Áö ¹®ÀÚ¿­À» ±Û²Ã°ú Ãâ·Â ¹æ½ÄÀ» ¹Ù²ã°¡¸ç Ãâ·ÂÇÑ °ÍÀÌ´Ù. ½ÇÇà °á°ú´Â ´ÙÀ½°ú °°Àºµ¥ ¿ÞÂÊÀº ½Ã½ºÅÛ ±Û²Ã·Î, ¿À¸¥ÂÊÀº ±¼¸² ±Û²Ã·Î Ãâ·ÂÇÑ °ÍÀÌ´Ù. ¿©·¯ °¡Áö ¹®Á¦Á¡ÀÌ ÀÖÀ½À» ¾Ë ¼ö ÀÖ´Ù.

 

¹®Á¦Á¡ 1 : a0, 00, 31, 32, 33 ÀÇ ¹ÙÀÌÆ®¸¦ Ãâ·ÂÇϴµ¥ Àüü¸¦ Çѹø¿¡ Ãâ·ÂÇÑ °Í°ú a0, 00À» ¸ÕÀú Ãâ·ÂÇÏ°í ±× Æø¸¸Å­ ¶ç¿î ÈÄ 31,32,33À» Ãâ·ÂÇÑ °á°ú°¡ ´Ù¸£´Ù. ¿Ö ´Ù¸¥°¡Çϸé a0,00ÀÇ ÆøÀÌ 16À¸·Î Á¶»çµÇ´Âµ¥ ±× µÚ¿¡ 31¸¦ Çϳª ´õ ºÙ¿©µµ ¿ª½Ã ÆøÀÌ 16À¸·Î Á¶»çµÇ±â ¶§¹®ÀÌ´Ù. ±×·¸´Ù¸é ¹®ÀÚ 1ÀÇ ÆøÀÌ 0À̶ó´Â ¾ê±â°¡ µÇ´Âµ¥ ÀÌ´Â ºÐ¸íÈ÷ Ʋ¸° °á°úÀÌ´Ù.

¹®Á¦Á¡ 2: 0x80Àº ½Ã½ºÅÛ¿¡ ÀÇÇØ SBCS·Î Á¤ÀǵǾî ÀÖ°í ÀÌ ¹®ÀÚ¸¦ ´Üµ¶À¸·Î Ãâ·ÂÇϸé À¯·Î Ç¥½Ã°¡ Ãâ·ÂµÈ´Ù. ±×·¯³ª 0x80 ´ÙÀ½¿¡ ¹®ÀÚ°¡ Çϳª ´õ ÀÖÀ¸¸é À¯·Î ¹®ÀÚ°¡ Ãâ·ÂµÇÁö ¾Ê´Â´Ù. »Ó¸¸ ¾Æ´Ï¶ó µÚ¿¡ ¹®ÀÚ°¡ ´õ ÀÖÀ» ¶§ÀÇ ÆøÀÌ Æ²·ÁÁø´Ù.

¹®Á¦Á¡ 3: 0x80ÀÌ ¹®ÀÚ¿­ Áß°£¿¡ ÀÖÀ» ¶§ ±Û²ÃÀÇ ¸ð¾çÀÌ Æ²·ÁÁö¸ç ÀåÆòµµ ´õ Ä¿Áø´Ù. ´Ù¸¥ ÄÚµå´Â ¹®Á¦°¡ µÇÁö ¾Ê´Âµ¥ À¯µ¶ 0x80¸¸ ±×·¸´Ù. ½Ã½ºÅÛ ±Û²ÃÀÌ ¾Æ´Ñ ´Ù¸¥ ±Û²ÃÀ» »ç¿ëÇϸé ÀÌ ¹®Á¦´Â ³ªÅ¸³ªÁö ¾Ê´Â´Ù.

¹®Á¦Á¡ 4: 0x00, 0x00¸¦ Ãâ·ÂÇϸé ÀÚ½ÅÀÇ ÆøÀ» ³ÑÃļ­ ÀÌ»óÇÑ ¹®ÀÚ°¡ Ãâ·ÂµÈ´Ù. 0x00´Â SBCSÀ̸ç ÆøÀÌ 8À̶ó°í º¸°íµÇÁö¸¸ ½ÇÁ¦ Ãâ·ÂµÈ °á°ú´Â 8º¸´Ù ÈξÀ ´õ Å©´Ù.

 

ÇÑ°¡Áöµµ ¾Æ´Ï°í ¿©·¯ °¡Áö·Î °ñÄ¡¾ÆÇ ¹®Á¦µéÀÌ ÇѲ¨¹ø¿¡ ³ªÅ¸³ª´Âµ¥ ÀÌ ¹®Á¦°¡ ´õ °ñÄ¡ ¾ÆÇ ÀÌÀ¯´Â ¿î¿µÃ¼Á¦ ¹öÀü¸¶´Ù Áõ»óÀÌ Á¶±Ý¾¿ ´Ù¸£´Ù´Â Á¡ÀÌ´Ù. ÀÌ°ÍÀ» ¿î¿µÃ¼Á¦ÀÇ ¹ö±×¶ó°í °¨È÷ ´ÜÁ¤Áþ±â´Â ¾î·Æ´Ù. ÀÌ·¸°Ô µÇ¾î¾ß¸¸ ÇÏ´Â ¼³¸íÇϱâ Èûµç »çÁ¤ÀÌ ÀÖ´Â °ÍÀÎÁö, ¾Æ´Ï¸é ³»°¡ ¹» À߸ø ¾Ë°í ÀÖ´Â °ÍÀÎÁö´Â ¸ð¸¦ ÀÏÀÌ´Ù.

ºÐ¸íÇÑ °ÍÀº TextOutÀÇ µ¿ÀÛÀÌ ³»°¡ ¹Ù¶ó´Â °Í°ú´Â ´Ù¸£´Ù´Â Á¡À̸ç ÀÌ ÇÔ¼öÀÇ ¼­ºñ½º¸¦ ¹Þ¾Æ¼­´Â ÀÓÀÇÀÇ ÀÌÁø ½ºÆ®¸²À» ±ò²ûÇÏ°Ô Ãâ·ÂÇϱâ Èûµé´Ù´Â °ÍÀÌ´Ù. ÀÌ·± °æ¿ì´Â ¸»½éÀÌ ÀÖ´Â ÇÔ¼ö¸¦ ¾²Áö ¸»°í ´Ù¸¥ ¹æ¹ýÀ» ½ÃµµÇØ¾ß ÇÑ´Ù. ´ÙÀ½ ÇÔ¼ö´Â ¹®ÀÚÀÇ ÆøÀ» °³º°ÀûÀ¸·Î ÇÕ»êÇؼ­ ÇѲ¨¹ø¿¡ Ãâ·ÂÇÑ´Ù.

 

void CApiEditText::AeTextOut(HDC hdc,int x,int y,TCHAR *str,int len)

{

     int i;

     int *lpDx;

     int boff;

 

     boff=str-pFrame->buf;

     lpDx=(int *)malloc(len*sizeof(int));

     for (i=0;i<len;) {

          if (pFrame->IsDBCS(boff+i)) {

              lpDx[i++]=GetCharWidth(str+i,2);

              lpDx[i++]=0;

          } else {

              lpDx[i++]=GetCharWidth(str+i,1);

          }

     }

     ExtTextOut(hdc,x,y,0,NULL,str,len,lpDx);

     free(lpDx);

}

 

PrepareCharWidth¿¡¼­ ¹Ì¸® Á¶»çÇØ ³õÀº °³º° ¹®ÀÚÀÇ ÆøÀ» ±¸ÇØ °¢ ¹®ÀÚ°¡ Ãâ·ÂµÉ ÁÂÇ¥¸¦ ¹è¿­¿¡ °­Á¦·Î ÁöÁ¤ÇÑ ÈÄ ExtTextOutÀ¸·Î Ãâ·ÂÇß´Ù. ÇÔ¼öÀÇ ¿øÇüÀº TextOut°ú µ¿ÀÏÇÏ´Ù. DrawSegment¿¡¼­ TextOut ´ë½Å ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù.

 

void CApiEditText::DrawSegment(HDC hdc, int &x, int y, int SegOff, int len, BOOL ignoreX,

     COLORREF fore, COLORREF back)

{

     ....

          AeTextOut(hdc,x,y,pFrame->buf+SegOff,len);

 

ÀÌ·¸°Ô ÇÏ¸é ¾ÕµÚ Äڵ忡 µû¶ó ÆøÀÌ ´Þ¶óÁö´Â ¹®Á¦¸¦ ÇØ°áÇÒ ¼ö Àִµ¥ ù¹ø°, µÎ¹ø° ¹®Á¦´Â ÇØ°áµÇ¾ú´Ù. ±×·¯³ª ¼¼¹ø°, ³×¹ø° ¹®Á¦´Â ¾ÆÁ÷ ÇØ°áµÇÁö ¾Ê¾Ò´Âµ¥ ÀÌ ¹®Á¦´Â XP¿¡¼­ ½Ã½ºÅÛ ±Û²ÃÀ» ¾²°í ÀÖ°í 0x80 ¹®ÀÚ¿­ÀÌ Áß°£¿¡ ÀÖÀ» ¶§¸¸ ¹®Á¦°¡ µÈ´Ù. ²À ÇØ°áÇÏ·Á¸é ´ÙÀ½Ã³·³ ÇÒ ¼ö´Â ÀÖ´Ù.

 

void CApiEditText::AeTextOut(HDC hdc,int x,int y,TCHAR *str,int len)

{

     int i;

     int boff;

     int nx,byte;

 

     boff=str-pFrame->buf;

     for (nx=x,i=0;i<len;) {

          if (pFrame->IsDBCS(boff+i)) {

              byte=2;

          } else {

              byte=1;

          }

          TextOut(hdc,nx,y,str+i,byte);

          nx+=GetCharWidth(str+i,byte);

          i+=byte;

     }

}

 

°¢°¢ÀÇ ¹®ÀÚ¸¦ °³º°ÀûÀ¸·Î µû·Î Ãâ·ÂÇÔÀ¸·Î½á 0x80 ¹®ÀÚ¸¦ Ç×»ó ´Üµ¶ Ãâ·ÂÇß´Ù. ÀÌ ¹æ¹ýÀº ½ÃµµÇØ º¼¸¸Àº ÇÏÁö¸¸ äÅÃÀº ÇÏÁö ¾Ê±â·Î ÇÑ´Ù. ÃÖÃÊÀÇ TextOutÀ¸·Î Ãâ·ÂÇÏ´Â ¹æ½Ä°ú ExtTextOutÀ¸·Î Ãâ·ÂÇÏ´Â ¹æ½ÄÀº °ÅÀÇ ¼Óµµ Â÷ÀÌ°¡ ¾øÁö¸¸ ¸¶Áö¸· ¹æ½ÄÀº 4¹è Á¤µµ ¼Óµµ°¡ ´À·Á ¾µ ¼ö ¾ø´Ù. Àß ¹ß»ýÇÏÁöµµ ¾Ê´Â ¹®Á¦ÀÏ »Ó´õ·¯ Ȥ½Ã ¹ß»ýÇÏ´õ¶óµµ Ä¡¸íÀûÀÎ ¹®Á¦¸¦ ÀÏÀ¸Å°Áö´Â ¾Ê´Âµ¥ ÀÌ·± ¹®Á¦ ÇØ°áÀ» À§ÇØ ÇÁ·Î±×·¥ÀÌ 4¹è³ª ´À·ÁÁ®¾ß ÇÑ´Ù¸é ÇØ°áÇÏÁö ¾Ê´Â ÆíÀÌ ´õ ÇÕ¸®ÀûÀÎ ¼±ÅÃÀÌ´Ù.

´ÙÀ½Àº Á٠óÀ½¿¡ °ø¹é ±ÝÁö ¿É¼Ç¿¡ ´ëÇÑ ¹ö±×ÀÌ´Ù. ÀÌ ¿É¼ÇÀ» ¼±ÅÃÇØ ³õÀº »óÅ¿¡¼­ »õ ¹®¼­¸¦ ¸¸µé°í ÀÚµ¿ °³Çà ¸ðµå¿¡¼­ a, °ø¹é, b, °ø¹éÀ» ÀÔ·ÂÇØ ³õÀº »óÅ¿¡¼­ BS¿Í ½ºÆäÀ̽º Å°¸¦ ¹ø°¥¾Æ ´­·¯ º¸¸é b°¡ ¹ØÀ¸·Î ³»·Á°¬´Ù ¿Ã¶ó¿Ô´Ù¸¦ ¹Ýº¹ÇÒ °ÍÀÌ´Ù. ÀÌ·¸°Ô µÇ´Â ¿øÀº GetLine ÇÔ¼öÀÇ ³¡¿¡ Á¤·Ä ¹ö±×°¡ Àֱ⠶§¹®ÀÌ´Ù.

 

void CApiEditText::GetLine(int Line, int &s, int &e)

{

     ....

     if (bNoFirstSpace && *p==' ' && EndPosNoSpace!=NULL) {

          p=EndPosNoSpace;

     }

     e=p-pFrame->buf;

}

 

Á٠óÀ½ °ø¹é ±ÝÁö ¿É¼ÇÀÌ ¼±ÅõǾî ÀÖ°í ´ÙÀ½ Á٠óÀ½ÀÌ °ø¹éÀÌ°í ÀÌ ÁÙ¿¡ °ø¹éÀÌ ¾Æ´Ñ ¸¶Áö¸· ¹®ÀÚ°¡ ÀÖ´Ù¸é ¿©±â¼­ ÀÚ¸¥´Ù´Â ¶æÀÌ´Ù. °ø¹éÀÌ ¾Æ´Ñ ¸¶Áö¸· ¹®ÀÚ°¡ ÀÚµ¿À¸·Î ´ÙÀ½ ÁÙ·Î ³»·Á°£´Ù. ±×·±µ¥ BS·Î ¹®¼­¸¦ »èÁ¦ÇÒ ¶§ ³¡ÀÇ °ø¹éÀ» ½ÇÁ¦·Î »èÁ¦ÇÏÁö ¾Ê°í ¹®¼­ ±æÀ̸¸ 1·Î ÁÙÀ̱⠶§¹®¿¡ ÀÌ °ø¹éÀÌ Á¤·Ä¿¡ ¿µÇâÀ» ¹ÌÄ¡´Â °ÍÀÌ´Ù. ¹®Á¦¸¦ ÇØ°áÇÏ·Á¸é ´ÙÀ½°ú °°ÀÌ Á¶°ÇÀ» ´õ Ãß°¡ÇØ¾ß ÇÑ´Ù.

 

     if (bNoFirstSpace && p < pFrame->buf+pFrame->doclen && *p==' ' && EndPosNoSpace!=NULL) {

          p=EndPosNoSpace;

     }

     e=p-pFrame->buf;

}

 

p°¡ À¯È¿ÇÑ ¹®¼­ ¹üÀ§¿¡ ÀÖ´Â Æ÷ÀÎÅÍÀÎÁö¸¦ ¸ÕÀú Á¡°ËÇϸé ÀÌ ¹®Á¦°¡ ÇØ°áµÈ´Ù. ½ÇÁ¦·Î´Â ¿©±â¿¡ ÀÚµ¿ °³ÈþÀ̶ó´Â Á¶°ÇÀÌ ´õ Ãß°¡µÇ¾î¾ß ÇÏÁö¸¸ ÀÚµ¿ °³ÇàÀÌ ¾Æ´Ò ¶§´Â EndPosNoSpace°¡ Ç×»ó 0À̹ǷΠÀÌ Á¶°ÇÀ» ±»ÀÌ ºÙÀÏ ÇÊ¿ä°¡ ¾ø´Ù. ¹®¼­ ±æÀÌ°¡ Á¤È®ÇØÁ³°í ¸¶Áö¸· ¹®ÀÚ°¡ NULLÀÌ ¾Æ´Ò ¼öµµ Àֱ⠶§¹®¿¡ Àü¿¡ ¾ø´ø ¹®Á¦µéÀÌ ¹ß»ýÇÑ´Ù.