´ç±Ù 1.22

°¡.ÀÛ¾÷ Áغñ

´ç±Ù 1.21À» ¸±¸®ÁîÇÑÁö 1³âÇÏ°íµµ 4°³¿ùÀÌ Áö³µ´Ù. ±×µ¿¾È º°´Ù¸¥ ¹ö±×¾øÀÌ Àß µ¿ÀÛÇߴµ¥ ÃÖ±Ù¿¡ ¸î °¡Áö ºÒÆíÇÑ »çÇ×ÀÌ ¹ß°ßµÇ¾ú´Ù. ¿ÃÇØÃʺÎÅÍ ¾Èµå·ÎÀ̵å ÇÁ·ÎÁ§Æ®¸¦ ÇÏ°í Àִµ¥ ÀÌÀü¿¡ ¸¸µé¾î µÐ ¿¹Á¦³ª ¾Èµå·ÎÀ̵å À§Á¬ ¼Ò½º¸¦ Á¾Á¾ ÂüÁ¶ÇØ¾ß Çß´Ù. ÁÖ °³¹ßµµ±¸ÀÎ ÀÌŬ¸³½º´Â ¿öÅ©½ºÆäÀ̽º¸¦ º¯°æÇϸé Àç½ÃÀ۵Ǵ Ȳ´çÇÑ ÇüŶó ÆíÁý±â·Î ¿­¾î¼­ º¸´Âµ¥ ´ç±ÙÀ¸·Î´Â UTF-8·Î ÀÎÄÚµùµÈ ¹®¼­°¡ Á¦´ë·Î º¸ÀÌÁö ¾Ê´Â °ÍÀÌ´Ù.

µü º¸¸é ¾Ë°ÚÁö¸¸ UTF-8À» º¯È¯ÇÏ´Â °Í±îÁö´Â Àß µÇ´Âµ¥ °³Çà Äڵ尡 Á¦´ë·Î ÀνĵÇÁö ¸øÇÏ¿© ¸ðµç ÁÙÀÌ ºÙ¾î¼­ ³ª¿Â´Ù. À©µµ¿ìÁî ȯ°æ¿¡¼­´Â CR/LF°¡ °³ÇàÀÌÁö¸¸ ÀÌŬ¸³½º°¡ ÁÖ·Î »ç¿ëµÇ´Â À¯´Ð½º ȯ°æ¿¡¼­´Â LF°¡ °³ÇàÀ̱⠶§¹®ÀÌ´Ù. ÀÌ »óÅ·δ µµÀúÈ÷ ¼Ò½º¸¦ ÂüÁ¶ÇÒ ¼ö°¡ ¾ø´Ù. ¸Þ¸ðÀåÀ¸·Î ¿­¾î º¼·Á°í Çصµ µ¿ÀÏÇÑ ¹®Á¦°¡ Àִµ¥ UTF-8À» º¯È¯¸¸ ÇÒ »Ó °³Çà ÄÚµå´Â Á¦´ë·Î ÀνÄÀ» ÇÏÁö ¸øÇÑ´Ù.

±×·¡¼­ ¾î¿ ¼ö ¾øÀÌ ´Ù¸¥ ÆíÁý±â¸¦ Çϳª ±¸ÇØ »ç¿ëÇߴµ¥ ÆùÆ®°¡ Á» ¸¶À½¿¡ ¾Èµé¾úÁö¸¸ Àß º¸¿© ÁÖ±â´Â Çß´Ù. ±×·¯´Ù°¡ Æò°¡ ±â°£ÀÌ ³¡³ª°í ³ª´Ï °è¼Ó Á¤Ç° ±¸ÀÔ ¸Þ½ÃÁö ¹Ú½º°¡ ¶ß´Â °ÍÀÌ´Ù. ¸îÀÏ ¾²Áöµµ ¾Ê¾Ò´Âµ¥ Æò°¡ ±â°£ÀÌ ³Ê¹« ªÀº °Í °°´Ù. ´ç±ÙÀº Æò°¡ ±â°£ÀÌ 1³âÀ̳ª µÇ°í ±×³ª¸¶µµ ¾ó¸¶µçÁö ÇØÅ·ÇÒ ¼ö Àִµ¥ ¸»ÀÌ´Ù. °Ô´Ù°¡ ÅؽºÆ® ÆíÁý±â ¸¸µé¾î º» ³ðÀÌ ³²ÀÇ ÆíÁý±â ¾µ·Á´Ï ÀÚÁ¸½Éµµ Á¶±Ý »óÇß´Ù. °á±¹ ½Ã°£ÀÌ Á» µé´õ¶óµµ Á÷Á¢ ¸¸µå´Â °Ô ÁÁÀ» °Í °°¾Æ ÁÖ¸»¿¡ «À» ³»¼­ ÀÛ¾÷À» ¹ú·È´Ù.

ÀÌ ¹®¼­¸¦ ´©°¡ ÀÐÀ» °Í °°Áö´Â ¾ÊÁö¸¸ ¾î·°Å³ª ½Ç½ÀÀ» °¡Á¤ÇÑ ÇÁ·ÎÁ§Æ®À̹ǷΠ¿©±â¿¡ ¾÷±×·¹ÀÌµå °úÁ¤À» »ó¼¼ÇÏ°Ô ±â·ÏÇØ ³õ±â·Î ÇÑ´Ù. ÀÛ¾÷ ±â·ÏÀÌ ¸ñÀûÀ̹ǷΠ¹®ÀåÀ» ¿¹»Ú°Ô °¡´ÙµëÀ¸·Á°í ±×´ÙÁö ³ë·ÂÇÏÁö ¾Ê¾ÒÀ¸¸ç ¿ÊŸµµ ¹«ÁöÀåÇì°³ ¸¶´Ï ÀÕµû. ÀÏ´Ü ÀÌÀü ¹öÀüÀÇ ¼Ò½º¸¦ ´ÙÀ½ ÁÖ¼Ò¿¡ ´Ù¿î·Îµå¹Þ´Â´Ù. »õ ¹öÀüÀÌ ³ª¿À¸é ¸ÞÀÎ ÆäÀÌÁöÀÇ ¸µÅ©´Â »ç¶óÁö°ÚÁö¸¸ ½Ç½À»ýÀ» À§ÇØ ÆÄÀÏ ÀÚü´Â ±×´ë·Î À¯ÁöÇÒ °èȹÀ̹ǷΠÀÌ ¸µÅ©´Â °è¼Ó À¯È¿ÇÏ´Ù.

 

http://www.winapi.co.kr/project/dangeun/Dangeun121Src.zip

 

´Ù¿î·Îµå¹Þ¾Æ ¾ÐÃàÀ» Ç®°í ºñÁÖ¾ó ½ºÆ©µð¿À 2008·Î ¼Ö·ç¼ÇÀ» ¿¬´Ù. ÀÏ´Ü F7À» ´­·¯ ÄÄÆÄÀϺÎÅÍ ÇØ º¸ÀÚ. °æ°í Çϳª¾øÀÌ ±ò²ûÇÏ°Ô ÄÄÆÄÀ쵃 °ÍÀÌ´Ù. ÇÁ·ÎÁ§Æ®¸¦ ´ëÃæ Äf¾î ºÃ´Âµ¥ ³»°¡ ¸¸µé¾úÀ½¿¡µµ ºÒ±¸ÇÏ°í ÄÚµå ±¸Á¶°¡ ÀüÇô ±â¾ïÀÌ ³ªÁö ¾Ê´Â´Ù. ±×·¡¼­ ÀÌÀü¿¡ ÀÛ¼ºÇØ µÎ¾ú´ø ¹®¼­¸¦ Â÷±ÙÈ÷ ÀÐ¾î ºÃ´Âµ¥ È÷½ºÅ丮 ¹®¼­¸¦ º¸´Ï Á» ±â¾ïÀÌ ³­´Ù. °á±¹ ÀÌ ¹®¼­´Â °³¹ßÀÚ ÀÚ½ÅÀ» À§ÇØ ÀÛ¼ºÇÏ´Â °ÍÀÌ´Ù. °ú°Å¿¡ ½Ã°£À» ÅõÀÚÇØ ³õÀº¸¸Å­ ¹Ì·¡ÀÇ ½Ã°£À» ´õ ¾Æ³¥ ¼ö ÀÖ´Ù.

ÇÁ·ÎÁ§Æ® ¹öÀüÀÌ ¹Ù²ð ¿¹Á¤À̹ǷΠÀÏ´Ü µ¤¾î ³õ°í ¹öÀüºÎÅÍ ¿Ã¸°´Ù. Dangeun.cpp¿¡¼­ "´ç±Ù" ¹®ÀÚ¿­À» °Ë»öÇØ º¸¸é ŸÀÌƲ ¹Ù¿¡ ¼³Á¤ÇÏ´Â Á¦¸ñÀÌ °Ë»öµÇ´Âµ¥ 1.21À» 1.22·Î ¼öÁ¤ÇÑ´Ù. Á¶±Ý¸¸ ¹Ù…—À¸´Ï 1.5 µûÀ§·Î ÇÏÁö ¸»°í °â¼ÕÇÏ°Ô 0.01¸¸ ¿Ã·È´Ù.

 

hWnd=CreateWindow(lpszClass,"´ç±Ù 1.22",WS_OVERLAPPEDWINDOW | WS_VISIBLE |

     WS_CLIPCHILDREN,

     CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,

     NULL,(HMENU)NULL,hInstance,NULL);

 

About ´ëÈ­»óÀÚÀÇ ½ºÅÂƽ¿¡µµ ¹öÀüÀÌ ÀÖÀ¸¹Ç·Î °°ÀÌ ¼öÁ¤ÇØ¾ß ÇÑ´Ù. ¸®¼Ò½º ÆíÁý±â¿¡¼­ IDD_ABOUT ´ëÈ­»óÀÚ¸¦ ¿­¾î ½ºÅÂƽÀÇ ÅؽºÆ®¸¸ º¯°æÇÏ¸é µÈ´Ù. ÀÌÀü ¹öÀü°ú °³¹ßÁßÀÎ »õ ¹öÀüÀ» µ¿½Ã¿¡ ¿­¾î ³õ°í Àß ¼öÁ¤µÇ¾ú´ÂÁö Å×½ºÆ®¸¦ ÇØ ºÁ¾ß Çϴµ¥ ¹öÀüºÎÅÍ ¼öÁ¤ÇØ ³õÁö ¾ÊÀ¸¸é µµ¹«Áö Çò°¥·Á¼­ È¥¶õ½º·¯¿ì¸ç ½Ç¼ö¸¦ ÇÒ À§Çèµµ ÀÖ´Ù. ±×·¡¼­ ¹öÀüºÎÅÍ ¿Ã¸° °ÍÀÌ´Ù.

³ª.ÀÎÄÚµù°ú °³Çà ºÐ¸®

À̹ø ¹öÀüÀÇ °¡Àå Å« ¼öÁ¤ ¸ñÇ¥´Â LF·Î¸¸ °³ÇàµÇ¾î ÀÖ´Â UTF-8 ¹®¼­¸¦ Á¦´ë·Î Àд °ÍÀÌ´Ù. ´ç±ÙÀº °³Çà ¹æ½Ä¿¡ ´ëÇÑ ±¸ºÐÀ» ÇÏ°í´Â ÀÖÁö¸¸ ANSI ÀÎÄÚµù¿¡ ÇÑÇؼ­¸¸ÀÌ´Ù. ´Ù¸¥ ÀÎÄÚµù ¹æ½Äµµ ´Ù¾çÇÑ °³Çà ¹æ½ÄÀÌ Á¸ÀçÇÒ ¼ö ÀÖ´Ù. ÇöÀç ¹öÀüÀº °³Çà ¹æ½ÄÀ» ÀÎÄÚµùÀÇ ÇÑ Á¾·ù·Î ´Ù·ç´Âµ¥ ¿øÄ¢´ë·Î ÇÏÀÚ¸é ÀÎÄÚµù°ú °³Çà ¹æ½ÄÀº ¿ÏÀüÈ÷ µ¶¸³ÀûÀÎ °³³äÀÌ´Ù.

À¯´ÏÄڵ峪 UTF-8Àº °³Çà ¹æ½ÄÀÌ Á¤ÇØÁ® ÀÖ´ÂÁÙ À߸ø ¾Ë°í ÀÖ¾úÀ¸¸ç ½ÇÁ¦ ±×·± »ùÇà ¹®¼­¸¦ º»ÀûÀÌ ¾ø¾ú±â ¶§¹®¿¡ Áö±Ý±îÁö ¸ô¶ú´ø °ÍÀÌ´Ù. ÆÄÀÏ Æ÷¸ËÀÇ Á¾·ù°¡ ´Ã¾î³¯ »Ó¸¸ ¾Æ´Ï¶ó Æ÷¸ËÀ» ±¸ºÐÇÏ´Â ¹æ½Äµµ ´Ã¾î³ª¹Ç·Î ¸¹Àº Äڵ尡 ¼öÁ¤µÇ¾î¾ß ÇÑ´Ù. ´ÙÀ½ ÀýÂ÷´ë·Î ÀÛ¾÷À» ÁøÇàÇß´Ù.

 

1.ÀÎÄÚµù ¹æ½Ä°ú °³Çà ¹æ½Ä¿¡ ´ëÇÑ »ó¼ö¸¦ Á¤ÀÇÇÑ´Ù. ApiEdit¿¡ Æ÷¸ËÀ» ±â¾ïÇÏ´Â ¸â¹ö°¡ dwFormat Çϳª¹Û¿¡ ¾ø°í ÇÔ¼öÀÇ ¸®ÅÏ°ªÀ¸·Î Æ÷¸ËÀ» Àü´Þ¹Þ¾Æ¾ß ÇϹǷΠµÎ °³ÀÇ º¯¼ö¸¦ ¾²´Â °Íº¸´Ù »ó, ÇÏÀ§¿¡ ³ª´©¾î ÀÎÄÚµù ¹æ½Ä°ú °³Çà ¹æ½ÄÀ» °°ÀÌ ÀúÀåÇÏ¿´´Ù. ApiEdit.h ÆÄÀÏÀ» ¿­°í AE_FORMAT_* ¸ÅÅ©·Î´Â ¸ðµÎ »èÁ¦ÇÏ°í ´ÙÀ½ ¸ÅÅ©·Î¸¦ »õ·Î Á¤ÀÇÇÑ´Ù.

 

// ÀÎÄÚµù ¹æ½Ä - »óÀ§ ¿öµå

#define AE_ENC_UNKNOWN 0x0

#define AE_ENC_ANSI 0x1

#define AE_ENC_UNI 0x2

#define AE_ENC_UNIBIG 0x4

#define AE_ENC_UNINOBOM 0x8

#define AE_ENC_UNIBIGNOBOM 0x10

#define AE_ENC_UTF8 0x20

#define AE_ENC_UTF8NOBOM 0x40

#define AE_ENC_BINARY 0x80

 

// °³Çà ¹æ½Ä - ÇÏÀ§ ¿öµå

#define AE_ENTER_UNKNOWN 0x00000

#define AE_ENTER_CRLF 0x10000

#define AE_ENTER_CR 0x20000

#define AE_ENTER_LF 0x40000

 

BOM ¾ø´Â À¯´ÏÄÚµå ¹®¼­´Â Æ÷¸Ë¸¸ Á¤ÀÇÇØ ³ùÀ» »Ó ¾ÆÁ÷±îÁö Áö¿øÇÏÁö´Â ¾Ê´Â´Ù. ÀÌ·± Çü½ÄÀÇ ÅؽºÆ® ÆÄÀÏÀ» ¸¸µé¾î ³»´Â °æ¿ì°¡ °ÅÀÇ ¾ø´Â °ü°è·Î »ùÇà ¹®¼­¸¦ ±¸ÇÏÁö ¸øÇß´Ù. ¸Þ¸ðÀåÀ̳ª ºñÁÖ¾ó ½ºÆ©µð¿À, ÀÌŬ¸³½º³ª À¯´ÏÄÚµå ¹®¼­¸¦ ¸¸µé¸é Ç×»ó BOMÀÌ ÀÖ´Ù. Â÷ÈÄ ±×·± ¹®¼­¸¦ ¸¸³ª¸é Áö¿ø Äڵ带 ´õ ÀÛ¼ºÇÒ ¿¹Á¤ÀÌ´Ù. dwFormatÀÇ ÃʱⰪÀº ´ç±ÙÀÇ ³»ºÎ Æ÷¸ËÀÎ ANSI¿¡ CRLF °³ÇàÀ¸·Î ÇÑ´Ù.

 

void CApiEdit::InitDoc()

{

     dwFormat=AE_ENC_ANSI | AE_ENTER_CRLF;

     ....

}

 

´ç±ÙÀÇ ³»ºÎ Æ÷¸ËÀÌ ANSIÀÎ ÀÌÀ¯´Â ±× ´ç½Ã¿¡´Â À¯´ÏÄڵ尡 ´ëÁßÀûÀÌÁö ¾Ê¾Ò±â ¶§¹®ÀÌ´Ù. ±×·¯³ª Áö±Ý ÇöÀçµµ »ç½Ç À¯´ÏÄڵ庸´Ù´Â ANSI ¹®¼­°¡ ÈξÀ ´õ ¸¹À¸¹Ç·Î ³»ºÎ Æ÷¸ËÀº ´çºÐ°£Àº ANSI·Î ¾²´Â °ÍÀÌ ÇÕ´çÇÏ´Ù. À¯´ÏÄÚµå ÅؽºÆ® ¹®¼­´Â ÀϺη¯ ¸¸µéÁö ¾Ê´Â ÇÑ ±¸°æÇϱ⠾î·Æ´Ù. ´Ù¸¸ ÃÖ±Ù XML ¹®¼­°¡ UTF-8 ÀÎÄÚµùÀ» ¸¹ÀÌ »ç¿ëÇÒ »ÓÀÌ´Ù.

 

2.Æ÷¸ËÀ» ºÐ¼®ÇÏ´Â ÇÔ¼öÀÎ AnalyzeFormatÀ» ¿ÏÀüÈ÷ ´Ù½Ã ÀÛ¼ºÇÑ´Ù. ÇÔ¼ö ¿øÇüÀº ±×´ë·Î À¯ÁöÇÏ°í Äڵ常 ¼öÁ¤ÇÑ´Ù.

 

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

{

     TCHAR *p,*p2;

     DWORD Enc = AE_ENC_ANSI;

     DWORD Enter = AE_ENTER_UNKNOWN;

 

     // EF, BB, BF·Î ½ÃÀ۵Ǹé UTF-8

     if (dwSize >= 3 && *Text==(TCHAR)0xef && *(Text+1)==(TCHAR)0xbb &&

          *(Text+2)==(TCHAR)0xbf) {

          Enc = AE_ENC_UTF8;

     } else

 

     // FF, FE·Î ½ÃÀ۵Ǹé À¯´ÏÄÚµå

     if (dwSize >= 2 && *Text==(TCHAR)0xff && *(Text+1)==(TCHAR)0xfe) {

          Enc = AE_ENC_UNI;

     } else

 

     // FE, FF·Î ½ÃÀ۵Ǹé À¯´ÏÄÚµå ºò ¿£µð¾È

     if (dwSize >= 2 && *Text==(TCHAR)0xfe && *(Text+1)==(TCHAR)0xff) {

          Enc = AE_ENC_UNIBIG;

     } else

 

     // BOM¾ø´Â UTF-8¹®¼­ÀÎÁö Á¶»ç.

     if (AnalyzeFormatUtf8(Text, dwSize)) {

          Enc = AE_ENC_UTF8NOBOM;

     } else

 

     // todo : AE_ENC_UNINOBOM, AE_ENC_UNIBIGNOBOM¿¡ ´ëÇÑ ÆǺ°Àº ´ÙÀ½ ±âȸ¿¡

 

     // Áß°£¿¡ 0ÀÌ Çϳª¶óµµ ÀÖÀ¸¸é ¹ÙÀ̳ʸ®. ÀÌ °æ¿ì °³Çà ¹æ½ÄÀº Àǹ̰¡ ¾ø´Ù.

     if (dwSize != -1) {

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

              if (*p==0) {

                   Enc = AE_ENC_BINARY;

              }

          }

     }

 

     // À§ÀÇ ¸ðµç Á¶°ÇÀÌ ¸ÂÁö ¾ÊÀ¸¸é ANSI ÀÎÄÚµùÀÌ´Ù.

 

     // CR, LF¸¦ °Ë»öÇغ¸°í °³Çà ¹æ½ÄÀ» °áÁ¤ÇÑ´Ù.

     if (Enc == AE_ENC_ANSI || Enc == AE_ENC_UTF8 || Enc == AE_ENC_UTF8NOBOM) {

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

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

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

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

                   Enter = AE_ENTER_CRLF;

              } else {

                   Enter = AE_ENTER_LF;

              }

          } else {

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

                   Enter = AE_ENTER_CRLF;

              } else {

                   Enter = AE_ENTER_CR;

              }

          }

     }

 

     // À¯´ÏÄÚµå´Â 16ºñÆ® ÄÚµå·Î °Ë»ö

     if (Enc == AE_ENC_UNI || Enc == AE_ENC_UNIBIG) {

          wchar_t *wText = (wchar_t *)Text;

          int wSize = dwSize/sizeof(wchar_t);

          wchar_t CR, LF;

          if (Enc == AE_ENC_UNI) {

              CR = 0x0d;

              LF = 0x0a;

          } else {

              CR = 0x0d00;

              LF = 0x0a00;

          }

 

          wchar_t *wp, *wp2;

 

          wp=wcschr(wText,CR);

          if (wp==NULL || wp-wText >= wSize) {

              wp2=wcschr(wText,LF);

              if (wp2==NULL  || wp2-wText >= wSize) {

                   Enter = AE_ENTER_CRLF;

              } else {

                   Enter = AE_ENTER_LF;

              }

          } else {

              if (wp+1-wText < wSize && *(wp+1)==LF) {

                   Enter = AE_ENTER_CRLF;

              } else {

                   Enter = AE_ENTER_CR;

              }

          }

     }

 

     return (Enc | Enter);

}

 

ÀÎÄÚµù°ú °³Çà ¹æ½ÄÀ» °¢°¢ µû·Î ºÐ¼®ÇÑ ÈÄ ÇÕÃļ­ °á°ú¸¦ ¸®ÅÏÇß´Ù. Á¡°Ë ¼ø¼­ÀÇ À¯ÀÇÇØ¾ß Çϴµ¥ BOMÀÖ´Â ÀÎÄÚµùÀ» °¡Àå ¸ÕÀú Á¡°ËÇÏ°í ´ÙÀ½À¸·Î ¹ÙÀ̳ʸ®ÀÎÁö º¸°í ±×°Íµµ ¾Æ´Ï¸é ANSI ÀÎÄÚµùÀÎ °ÍÀ¸·Î ÆÇ´ÜÇÑ´Ù. °³Çà ¹æ½Ä Á¡°ËÀº ÀÌÀü ¹öÀü°ú ³í¸®´Â °°µÇ CR, LF°¡ 1¹ÙÀÌÆ®ÀÎ °æ¿ì¿Í 2¹ÙÀÌÆ®ÀÎ °æ¿ì µÎ °¡Áö °æ¿ì·Î ³ª´©¾î Á¡°ËÇßÀ¸¸ç 2¹ÙÀÌÆ®ÀÎ °æ¿ìµµ ºò ¿£µð¾È, ¸®Æ² ¿£µð¾ÈÀ» ±¸ºÐÇÑ´Ù.

ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÏ´Â °÷Àº ÅؽºÆ®¸¦ Àоîµé¿© ApiEditÀÇ ¹öÆÛ¿¡ Áý¾î ³Ö´Â SetText µü ÇÑ °÷ »ÓÀÌ´Ù. ÀÌÈÄ dwFormat ¸â¹ö¸¦ ÂüÁ¶ÇÒ ¶§´Â »ó, ÇÏÀ§ ¿öµå¸¦ ¸¶½ºÅ·ÇÏ¿© Àоî¾ß ÇÑ´Ù.

 

3.Æ÷¸ËÀ» º¯È¯ÇÏ´Â ConvertFormat ÇÔ¼ö´Â µÎ °³ÀÇ ÇÔ¼ö·Î ºÐ¸®µÈ´Ù. º¯È¯, ¿ªº¯È¯½ÃÀÇ ¼ø¼­°¡ ´Ù¸£±â ¶§¹®¿¡ ÇÑ ÇÔ¼ö¿¡¼­ º¯È¯À» ´Ù ÇÒ ¼ö ¾ø´Ù. ´ÙÀ½ ÇÔ¼ö´Â ÀÎÄÚµùÀ» º¯È¯ÇÑ´Ù.

 

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

{

     int need,i,num;

     LPWSTR t;

     int bomoff=0;

 

     switch (from) {

     case AE_ENC_UNI:

     case AE_ENC_UNIBIG:

          // ºò ¿£µð¾ÈÀÌ¸é ¹ÙÀÌÆ® ¼ø¼­¸¦ µÚÁýÀº ÈÄ º¯È¯ÇÑ´Ù.

          if (from == AE_ENC_UNIBIG) {

              for (t=(LPWSTR)src,i=0;i<srclen/2;t++,i++) {

                   *t=((*t << 8) | (*t >> 8));

              }

          }

          need=WideCharToMultiByte(CP_ACP,0,(LPCWSTR)src+1,srclen/2-1,NULL,0,0,0);

          dest=(TCHAR *)malloc(need);

          WideCharToMultiByte(CP_ACP,0,(LPCWSTR)src+1,srclen/2-1,dest,need,0,0);

          return need;

     case AE_ENC_UTF8:

          bomoff=3;

     case AE_ENC_UTF8NOBOM:

          // Àӽà ¹öÆÛ¿¡ À¯´ÏÄÚµå·Î ¸ÕÀú º¯È¯ÇÑ´Ù.

          need=MultiByteToWideChar(CP_UTF8,0,src+bomoff,srclen-bomoff,NULL,0);

          t=(LPWSTR)malloc(need*sizeof(wchar_t));

          num=MultiByteToWideChar(CP_UTF8,0,src+bomoff,srclen-bomoff,t,need);

          // À¯´ÏÄڵ带 ¾È½Ã·Î º¯È¯ÇÑ´Ù.

          need=WideCharToMultiByte(CP_ACP,0,(LPCWSTR)t,num,NULL,0,0,0);

          dest=(TCHAR *)malloc(need);

          WideCharToMultiByte(CP_ACP,0,(LPCWSTR)t,num,dest,need,0,0);

          free(t);

          return need;

     }

 

     switch (to) {

     case AE_ENC_UNI:

     case AE_ENC_UNIBIG:

          need=MultiByteToWideChar(CP_ACP,0,src,srclen,NULL,0);

          need++;                                    // ¼±µÎ¿¡ BOM Ãß°¡

          dest=(TCHAR *)malloc(need*sizeof(wchar_t));

          dest[0]=(TCHAR)0xFF;

          dest[1]=(TCHAR)0xFE;

          MultiByteToWideChar(CP_ACP,0,src,srclen,(LPWSTR)dest+1,need);

          if (to == AE_ENC_UNIBIG) {

              for (t=(LPWSTR)dest,i=0;i<need;t++,i++) {

                   *t=((*t << 8) | (*t >> 8));

              }

          }

          return need*2;

     case AE_ENC_UTF8:

          bomoff=3;

     case AE_ENC_UTF8NOBOM:

          // ¾È½Ã¸¦ À¯´ÏÄÚµå·Î ¸ÕÀú º¯È¯ÇÑ´Ù.

          need=MultiByteToWideChar(CP_ACP,0,src,srclen,NULL,0);

          t=(LPWSTR)malloc(need*sizeof(wchar_t));

          num=MultiByteToWideChar(CP_ACP,0,src,srclen,t,need);

          // À¯´ÏÄڵ带 UTF-8·Î º¯È¯ÇÑ´Ù.

          need=WideCharToMultiByte(CP_UTF8,0,t,num,NULL,0,0,0);

          if (bomoff != 0) {

              need+=bomoff;

          }

          dest=(TCHAR *)malloc(need);

          if (bomoff != 0) {

              dest[0]=(TCHAR)0xEF;

              dest[1]=(TCHAR)0xBB;

              dest[2]=(TCHAR)0xBF;

          }

          WideCharToMultiByte(CP_UTF8,0,t,num,dest+bomoff,need,0,0);

          free(t);

          return need;

     }

     return 0;

}

 

Àü ÇÔ¼ö¿Í ¸¶Âù°¡Áö·Î fromÀ̳ª to µÑ Áß Çϳª´Â ³»ºÎ Æ÷¸ËÀÎ ANSI¿©¾ß ÇÑ´Ù. À¯´ÏÄÚµå´Â WideCharToMultiByte ÇÔ¼ö·Î º¯È¯Ç쵂 BOMÀ» »©°í º¯È¯ÇÏ¸ç ºò ¿£µð¾ÈÀº ¹ÙÀÌÆ® ¼ø¼­¸¦ µÚÁýÀº ÈÄ º¯È¯ÇÑ´Ù. UTF8Àº À¯´ÏÄÚµå·Î º¯È¯ÇÑ ÈÄ ´Ù½Ã ANSI·Î º¯È¯ÇÑ´Ù. ¿ªº¯È¯Àº ¹Ý´ë ÇÔ¼ö·Î º¯È¯Ç쵂 BOMÀÌ ÀÖ´Â Æ÷¸ËÀº BOM ºÙ¿© ÁÖ°í ºò ¿£µð¾ÈÀº ¹ÙÀÌÆ® ¼ø¼­¸¦ µÚÁý¾î ÁÖ¸é µÈ´Ù. ´ÙÀ½ ÇÔ¼ö´Â °³Çà ¹æ½ÄÀ» º¯È¯ÇÑ´Ù.

 

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

{

     TCHAR *s,*d;

     TCHAR Find, Other;

 

     dest=(TCHAR *)malloc(lstrlen(src)*2);

     s=src;

     d=dest;

 

     if (to==AE_ENTER_CRLF) {

          switch (from) {

          case AE_ENTER_LF:

              Find='\n';

              Other='\r';

              break;

          case AE_ENTER_CR:

              Find='\r';

              Other='\n';

              break;

          }

          while (s-src < srclen) {

              if (*s == Other) {

                   s++;

                   continue;

              }

              if (*s==Find) {

                   *d++='\r';

                   *d++='\n';

                   s++;

              } else {

                   *d++=*s++;

              }

          }

          *d=0;

     } else {

          switch (to) {

          case AE_ENTER_LF:

              Find='\n';

              break;

          case AE_ENTER_CR:

              Find='\r';

              break;

          }

          while (s-src < srclen) {

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

                   *d++=Find;

                   s++;

                   s++;

              } else {

                   *d++=*s++;

              }

          }

          *d=0;

     }

     return lstrlen(dest);

}

 

LF¸¦ CRLF·Î ¹Ù²Ù´Â °æ¿ì ¹öÆÛÀÇ ¸ðµç LF¸¦ ã¾Æ CRLF Á¶ÇÕÀ¸·Î ¹Ù²Ù¸é µÈ´Ù. ÀÌ °æ¿ì CRÀº »ç½Ç ³ª¿À¸é ¾ÈµÇ´Â ¹®ÀÚÀε¥ ÀÏ°ü¼ºÀÌ ¾ø´Â ¹®¼­´Â ÀÖÀ» ¼öµµ ÀÖÀ¸¹Ç·Î ±×³É °Ç³Ê ¶Ùµµ·Ï Çß´Ù. CRLF¸¦ LF·Î ¹Ù²Ü ¶§´Â CRÀ» ¸¸³¯ ¶§ µÎ Ä­ °Ç³Ê ¶Ù°í LF Çϳª¸¸ ±â·ÏÇÏ´Â ½ÄÀÌ´Ù. ÀÌ ÇÔ¼ö´Â ÀÎÄÚµù º¯È¯ÀÌ ¿Ï·áµÈ ÈÄ¿¡¸¸ È£ÃâµÇ¹Ç·Î À¯´ÏÄÚµå´Â ½Å°æ¾µ ÇÊ¿ä¾ø´Ù. ANSI Æ÷¸Ë¿¡ ´ëÇؼ­¸¸ °³Çà Äڵ带 Àß º¯È¯ÇÏ¸é µÈ´Ù.

µÎ ÇÔ¼ö¸¦ Ãß°¡ÇÑ ÈÄ ÀÌÀü ÇÔ¼öÀÎ ConvertFormatÀº »èÁ¦ÇÑ´Ù. ¸â¹ö ÇÔ¼öÀÇ ¸ñ·ÏÀÌ ¹Ù²î¾úÀ¸¹Ç·Î Çì´õ ÆÄÀÏ¿¡µµ ´ç¿¬È÷ ¿øÇü ¼±¾ðÀ» ÇØ Áà¾ß ÇÑ´Ù.

 

4.º¯È¯ ¹× ºÐ¼®À» ½ÇÁ¦ ¼öÇàÇÏ´Â ÇÔ¼ö´Â SetTextÀÌ´Ù. ÆÄÀϷκÎÅÍ ½ºÆ®¸²À» ÀÐÀº ÈÄ ANSI Æ÷¸ËÀ¸·Î ¹Ù²Ù±â À§ÇØ ÀÌ ÇÔ¼ö°¡ È£ÃâµÈ´Ù. ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇÑ´Ù.

 

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

{

     int lenEnc;

     TCHAR *bufEnc;

     int lenEnter;

     TCHAR *bufEnter;

     int lenFix;

     TCHAR *bufFix;

 

     InitDoc();

     if (TestStyle(AES_AUTOCONVERT)==FALSE) {

          dwFormat=AE_ENC_ANSI;

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

          return;

     }

 

     dwFormat=AnalyzeFormat(TextBuf, dwSize);

 

     // ¹ÙÀ̳ʸ® Æ÷¸ËÀÌ¸é ¹Ù·Î ´ëÀÔÇÏ°í ¸®ÅÏ

     if ((dwFormat & 0xffff) == AE_ENC_BINARY) {

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

          ChangeViewType(0,HEXA_VIEW);

          return;

     }

 

     // ÀÎÄÚµù º¯È¯

     if ((dwFormat & 0xffff) != AE_ENC_ANSI) {

          lenEnc=ConvertEncode(dwFormat & 0xffff,AE_ENC_ANSI,TextBuf,dwSize,bufEnc);

     } else {

          lenEnc=dwSize;

          bufEnc = (TCHAR *)malloc(lenEnc);

          memcpy(bufEnc,TextBuf,lenEnc);

     }

 

     // °³Çà ¹æ½Ä º¯È¯

     if ((dwFormat & 0xffff0000) != AE_ENTER_CRLF) {

          lenEnter=ConvertEnter(dwFormat & 0xffff0000,AE_ENTER_CRLF,bufEnc,lenEnc,bufEnter);

     } else {

          lenEnter=lenEnc;

          bufEnter = (TCHAR *)malloc(lenEnter);

          memcpy(bufEnter,bufEnc,lenEnter);

     }

     free(bufEnc);

 

     // °³Çà ÄÚµå ÀÏ°ü¼º °Ë»ç

     if (TestEnterCode(bufEnter,lenEnter)==FALSE) {

          lenFix=FixEnterCode(bufEnter,lenEnter,bufFix);

          GetActiveView()->Insert(0,bufFix,lenFix,FALSE);

          free(bufFix);

     } else {

          GetActiveView()->Insert(0,bufEnter,lenEnter,FALSE);

     }

     free(bufEnter);

}

 

ÀÚµ¿ Æ÷¸Ë º¯È¯ÀÌ ±ÝÁöµÇ¾î ÀÖÀ¸¸é ±×³É ¿­µÇ ÀÌ ¿É¼ÇÀº µðÆúÆ®·Î ¼±ÅõǾî ÀÖÀ¸¹Ç·Î ´ë°³ÀÇ °æ¿ì´Â º¯È¯À» ÇÑ´Ù. Æ÷¸ËÀ» ÆǺ°ÇÑ ÈÄ ANSI°¡ ¾Æ´Ï¸é ´ÙÀ½ ¼ø¼­´ë·Î º¯È¯ÇÑ´Ù.

 

¨ç ¹ÙÀ̳ʸ®¸é ´õ º¯È¯ÇÒ ÇÊ¿ä¾øÀÌ ¹Ù·Î »ðÀÔÇÏ°í Çí»ç ºä·Î °­Á¦ ÀüȯÇÑ´Ù.

¨è ÀÎÄÚµù º¯È¯À» ¼öÇàÇÏ¿© ANSI Æ÷¸ËÀ¸·Î ¹Ù²Û´Ù. º¯È¯ °á°ú´Â bufEnc¿¡ »çº»À¸·Î ÀúÀåµÈ´Ù. º¯È¯À» ÇÒ ÇÊ¿ä°¡ ¾øÀ¸¸é bufEnc¿¡ ¿øº»À» ±×´ë·Î º¹»çÇÑ´Ù.

¨é °³Çà ¹æ½ÄÀ» º¯È¯ÇÑ´Ù. bufEnc¸¦ bufEnter·Î º¹»çÇϸ鼭 º¯È¯ÇÑ´Ù. º¯È¯ÀÌ ÇÊ¿ä¾øÀ¸¸é »çº»¸¸ ¶á´Ù. bufEnc´Â ´õ ÀÌ»ó ÇÊ¿ä¾øÀ¸¹Ç·Î ÇØÁ¦ÇÑ´Ù.

¨ê bufEnter¿¡ ÀúÀåµÈ ¹®¼­ÀÇ °³Çà ÄÚµå ÀÏ°ü¼ºÀ» °Ë»çÇÑ´Ù. ÀÏ°ü¼ºÀÌ ¾øÀ¸¸é bufFix¿¡ Á¶Á¤µÈ ÅؽºÆ®¸¦ ¸¸µé¾î ºä¿¡ ´ëÀÔÇÑ´Ù. ÀÏ°ü¼ºÀÌ ÀÖÀ¸¸é º¯È¯ÇÒ ÇÊ¿ä¾øÀÌ bufEnter¸¦ ºä¿¡ ´ëÀÔÇÑ´Ù.

¨ë bufEnter¸¦ ÇØÁ¦ÇÑ´Ù.

 

¸Å º¯È¯¸¶´Ù ±æÀÌ°¡ ´Þ¶óÁú ¼ö Àֱ⠶§¹®¿¡ º¯È¯ ´Ü°è¸¶´Ù »õ·Î¿î ¹öÆÛ°¡ ÇÒ´ç ¹× ÇØÁ¦µÈ´Ù. Àμö·Î Àü´Þ¹ÞÀº TextBuf´Â ´ÙÀ½ ´Ü°è¸¦ °ÅÃÄ ÃÖÁ¾ÀûÀ¸·Î bufFix¿¡ º¯È¯ °á°ú°¡ º¹»çµÇ¸ç ÀÌ ¹öÆÛÀÇ ³»¿ëÀÌ È°¼ººä¿¡ »ðÀԵȴÙ.

 

TextBuf -> bufEnc -> bufEnter -> bufFix

 

¹º°¡ Á» ºÒ¾ÈÇØ º¸ÀÌ°í ¸Þ¸ð¸®¸¦ ³¶ºñÇÏ´Â °Í °°±â´Â ÇÏÁö¸¸ ±æÀÌ°¡ ´Þ¶óÁö±â ¶§¹®¿¡ ¾î¿ ¼ö°¡ ¾ø´Ù. ¸Å ´Ü°è¸¶´Ù »ç¿ëÀÌ ³¡³­ ¹öÆ۴ öÀúÇÏ°Ô ÇØÁ¦ÇÏ¿´´Ù.

 

5.¹Ý´ë ÇÔ¼öÀÎ GetTextµµ ºñ½ÁÇÑ ¹æ½ÄÀ¸·Î ¼öÁ¤ÇÑ´Ù.

 

// TextBuf¿¡ ¿ø·¡ Æ÷¸Ë´ë·Î º¯È¯Çؼ­ ÅؽºÆ® º¹»ç. TextBuf´Â ÃæºÐÇÑ ±æÀ̸¦ °¡Á®¾ß ÇÑ´Ù.

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

{

     int lenEnter;

     TCHAR *bufEnter;

     int lenEnc;

     TCHAR *bufEnc;

 

     // ÀϺθ¸ ¿äûÇßÀ¸¸é ¿äûÇѸ¸Å­¸¸ º¹»ç

     if (s != -1) {

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

          return;

     }

 

     // ¹ÙÀ̳ʸ®À̰ųª º¯È¯ÀÌ ºÒÇÊ¿äÇϸé Àüü º¹»ç

     if ((dwFormat & 0xffff) == AE_ENC_BINARY || dwFormat == (AE_ENC_ANSI | AE_ENTER_CRLF)) {

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

          return;

     }

 

     // °³Çà ¹æ½Ä ¿ø·¡´ë·Î º¯È¯

     if ((dwFormat & 0xffff0000) != AE_ENTER_CRLF) {

          lenEnter=ConvertEnter(AE_ENTER_CRLF,dwFormat & 0xffff0000,buf,doclen,bufEnter);

     } else {

          lenEnter=doclen;

          bufEnter = (TCHAR *)malloc(lenEnter);

          memcpy(bufEnter,buf,lenEnter);

     }

 

     // ÀÎÄÚµù ¿ø·¡´ë·Î º¯È¯

     if ((dwFormat & 0xffff) != AE_ENC_ANSI) {

          lenEnc=ConvertEncode(AE_ENC_ANSI,dwFormat & 0xffff,bufEnter,lenEnter,bufEnc);

     } else {

          lenEnc=lenEnter;

          bufEnc = (TCHAR *)malloc(lenEnc);

          memcpy(bufEnc,bufEnter,lenEnc);

     }

     free(bufEnter);

 

     memcpy(TextBuf,bufEnc,min(lenEnc,BufSize));

     free(bufEnc);

}

 

ÀÌ ÇÔ¼ö´Â ÆíÁýÇÏ´ø ANSI Æ÷¸ËÀ» ¿ø·¡ ÆÄÀÏ Æ÷¸ËÀ¸·Î ¹Ù²Ù¾î ¸®ÅÏÇÑ´Ù. ÀϺΠ¿äûÀÎ °æ¿ì´Â º¯È¯ÇÏÁö ¾Ê°í ¿äûÇÑ ºÐ·®¸¸Å­¸¸ º¹»çÇÑ´Ù. º¯È¯ÀÌ ºÒÇÊ¿äÇÑ Æ÷¸ËÀ̸é Àüü¸¦ ´Ù º¹»çÇÑ´Ù. º¯È¯ÀÌ ÇÊ¿äÇÒ ¶§´Â ´ÙÀ½ ÀýÂ÷´ë·Î º¯È¯ÇÑ´Ù.

 

¨ç °³Çà ¹æ½ÄÀ» ¿ø·¡´ë·Î ¸ÕÀú º¯È¯ÇÑ´Ù. CRLFÀÌ¸é º¯È¯ÇÒ ÇÊ¿ä´Â ¾øµÇ bufEnter¿¡ »çº»Àº ¶°¾ß ÇÑ´Ù.

¨è °³Çà ¹æ½ÄÀÌ Á¶Á¤µÈ ¹®¼­¿¡ ´ëÇØ ÀÎÄÚµù ¹æ½ÄÀ» ¿ø·¡´ë·Î º¯È¯ÇÏ¿© bufEnc¿¡ º¹»çÇϰųª »çº»À» ¶á´Ù. bufEnter´Â ´õ ÀÌ»ó ÇÊ¿ä°¡ ¾ø´Ù.

¨é ¿©±â±îÁö º¯È¯µÈ °á°ú¸¦ TextBuf¿¡ ä¿ö¼­ ¸®ÅÏÇÑ´Ù.

 

SetText¿Í ¹Ý´ë º¯È¯À» ÇÒ »Ó¸¸ ¾Æ´Ï¶ó º¯È¯ÀÇ ¼ø¼­µµ ¹Ý´ëÀÓÀ» À¯ÀÇÇØ¾ß ÇÑ´Ù. ÀÐÀ» ¶§´Â ÀÎÄÚµù, °³Çà ¼øÀ¸·Î º¯È¯ÇßÀ¸¹Ç·Î ¾µ ¶§´Â °³Çà, ÀÎÄÚµù ¼øÀ¸·Î º¯È¯ÇØ¾ß ÇÑ´Ù.

 

6. ÅؽºÆ® ±æÀ̸¦ ±¸ÇÏ´Â GetTextLength ÇÔ¼ö¸¦ ¼öÁ¤ÇÑ´Ù. GetText ÇÑ ÈÄ °á°ú ±æÀ̸¦ ¸®ÅÏÇصµ µÇÁö¸¸ È£½ºÆ®°¡ GetText¸¦ È£ÃâÇϱâ Àü¿¡ ÃæºÐÇÑ ¸Þ¸ð¸®¸¦ È®º¸ÇØ¾ß ÇϹǷΠGetTextLength°¡ ²À ÇÊ¿äÇÏ´Ù. º¯È¯À» ÇØ ºÁ¾ß Á¤È®ÇÑ ±æÀ̸¦ ¾Ë ¼ö ÀÖ°í ±æÀ̸¦ ¾Ë¾Æ¾ß ¹öÆÛ¸¦ ÇÒ´çÇÑ ÈÄ GetText¸¦ È£ÃâÇÒ ¼ö ÀÖ´Ù.

 

// º¯È¯ ÈÄÀÇ ÅؽºÆ® ¹öÆÛ ±æÀÌ Á¶»ç.

int CApiEdit::GetTextLength()

{

     int lenEnter;

     TCHAR *bufEnter;

     int lenEnc;

     TCHAR *bufEnc;

 

     // ¹ÙÀ̳ʸ®À̰ųª º¯È¯ÀÌ ºÒÇÊ¿äÇϸé ÇöÀç ¹®¼­ ±æÀÌ ¸®ÅÏ

     if ((dwFormat & 0xffff) == AE_ENC_BINARY || dwFormat == (AE_ENC_ANSI | AE_ENTER_CRLF)) {

          return doclen;

     }

 

     // °³Çà ¹æ½Ä ¿ø·¡´ë·Î º¯È¯ÇØ ºÁ¾ß ¹®¼­ ±æÀ̸¦ ¾Ë ¼ö ÀÖ´Ù.

     if ((dwFormat & 0xffff0000) != AE_ENTER_CRLF) {

          lenEnter=ConvertEnter(AE_ENTER_CRLF,dwFormat & 0xffff0000,buf,doclen,bufEnter);

     } else {

          lenEnter=doclen;

          bufEnter = (TCHAR *)malloc(lenEnter);

          memcpy(bufEnter,buf,lenEnter);

     }

 

     // ÀÎÄÚµù ¿ø·¡´ë·Î º¯È¯Çؼ­ lenEnc¿¡ ±æÀÌ Á¶»ç

     if ((dwFormat & 0xffff) != AE_ENC_ANSI) {

          lenEnc=ConvertEncode(AE_ENC_ANSI,dwFormat & 0xffff,bufEnter,lenEnter,bufEnc);

          free(bufEnc);

     } else {

          lenEnc=lenEnter;

     }

     free(bufEnter);

 

     // °³Çà, ÀÎÄÚµù±îÁö ´Ù º¯È¯ÇÑ ±æÀÌ ¸®ÅÏ

     return lenEnc;

}

 

¹®¼­°¡ ³»ºÎ Æ÷¸Ë°ú °°°Å³ª ¹ÙÀ̳ʸ®À̸é doclenÀ» ±×³É ¸®ÅÏÇÏ¸é µÈ´Ù. ±×·¸Áö ¾ÊÀ¸¸é °³Çà ¹æ½ÄÀ» º¯È¯ÇÏ°í ÀÎÄÚµù±îÁö º¯È¯ÇÑ ÈÄ º¯È¯ ±æÀ̸¦ ¸®ÅÏÇÑ´Ù.

 

7.¿©±â±îÁö ÀÛ¾÷Çϸé ÆǺ° ¹× º¯È¯ ·çƾÀº ´Ù ÀÛ¼ºÇß´Ù. ±×·¯³ª ¸ÅÅ©·Î »ó¼ö°¡ ¹Ù²ñÀ¸·Î Çؼ­ È£½ºÆ®°¡ ¿µÇâÀ» ¹Þ´Â ºÎºÐÀÌ »ó´çÈ÷ ¸¹¾Æ ¸ðµÎ °°ÀÌ ¼öÁ¤ÇØ¾ß ÇÑ´Ù. ¸ÕÀú »óŶõ¿¡ ¹®¼­ÀÇ ÇöÀç Æ÷¸ËÀ» Ãâ·ÂÇÏ´Â ºÎºÐÀ» ¼öÁ¤ÇÑ´Ù.

 

void SetStatusText(int mask,LPCTSTR Mes/*=NULL*/)

{

     ....

          case 1:

              if (pSi->Ae.GetFormat() != AE_ENC_BINARY) {

     ....

          case 3:

              switch (pSi->Ae.GetFormat() & 0xffff) {

               case AE_ENC_UNKNOWN:

                   lstrcpy(Text,"Unknown");

                   break;

              case AE_ENC_ANSI:

                   lstrcpy(Text,"Ansi");

                   break;

              case AE_ENC_UNI:

                   lstrcpy(Text,"Unicode");

                   break;

              case AE_ENC_UNIBIG:

                   lstrcpy(Text,"UniBig");

                   break;

              case AE_ENC_UNINOBOM:

                   lstrcpy(Text,"UniNB");

                   break;

              case AE_ENC_UNIBIGNOBOM:

                   lstrcpy(Text,"UniBigNB");

                   break;

              case AE_ENC_UTF8:

                   lstrcpy(Text,"Utf8");

                   break;

              case AE_ENC_UTF8NOBOM:

                   lstrcpy(Text,"Utf8NB");

                   break;

              case AE_ENC_BINARY:

                   lstrcpy(Text,"Binary");

                   break;

              }

              switch (pSi->Ae.GetFormat() & 0xffff0000) {

              case AE_ENTER_UNKNOWN:

              case AE_ENTER_CRLF:

                   break;

              case AE_ENTER_CR:

                   lstrcat(Text,"(CR)");

                   break;

              case AE_ENTER_LF:

                   lstrcat(Text,"(LF)");

                   break;

              }

              break;

 

case 1Àº AE_FORMAT_BINARY¸¸ AE_ENC_BINARY·Î ¼öÁ¤ÇÏ¸é µÈ´Ù. case 3¿¡¼­ Æ÷¸ËÀ» ¼³¸íÇÏ´Â ¹®ÀÚ¿­À» Á¶¸³ÇÏ¿© Ãâ·ÂÇÑ´Ù. ÇÏÀ§ ¿öµå·Î ÀÎÄÚµùÀ» ÆǺ°ÇÏ°í »óÀ§ ¿öµå·Î °³ÇàÀ» ÆǺ°Ç쵂 CRLFÀÌ¸é ¾Æ¹« °Íµµ ºÙÀÌÁö ¾Ê´Â´Ù.

 

8.Ŭ¸³º¸µåÀÇ ºÙ¿© ³Ö±â Äڵ带 ¼öÁ¤ÇÑ´Ù. ApiEditText.cppÀÇ OnCommand/case IDM_AE_PASTE ºÎºÐ¿¡¼­ ´ÙÀ½ ºÎºÐÀ» »èÁ¦ÇØ ¹ö¸®¸é µÈ´Ù.

 

     case IDM_AE_PASTE:

          BOOL bPrevSel;

        TCHAR *dest;

        int Format;

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

              bCapture==FALSE) {

              AeMc.RecordCommand("paste");

              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 (pFrame->TestStyle(AES_SMARTSPACE) && ViewType!=HEXA_VIEW) {

                        pFrame->StartUndoGroup(25);

                   }

                   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,lstrlen(ptr),dest);

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

                   free(dest);

               } else {

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

               }

                   if (bPrevSel) {

                        pFrame->EndUndoGroup();

                   }

 

ÀÌ ºÎºÐÀº ¼ÖÁ÷È÷ Àá±ô ½Ç¼ö¸¦ ÇÑ °ÍÀε¥ CF_TEXT¸¦ ÀоúÀ¸¸é ÀÌ¹Ì ANSI Æ÷¸ËÀ̹ǷΠº¯È¯À» ÇÒ ÇÊ¿ä°¡ ¾ø´Ù. À¯´ÏÄÚµå ¹®¼­¿¡¼­ º¹»ç¸¦ ÇÏ´õ¶óµµ ¿î¿µ üÁ¦°¡ CF_TEXT ±îÁö °°ÀÌ º¯È¯Çؼ­ ÀúÀåÇØ ÁֹǷΠCF_TEXT¸¦ ±×³É ÀÐÀ¸¸é µÈ´Ù. CF_UNICODE¸¦ ±»ÀÌ ÀÐÀ» ÇÊ¿ä°¡ ¾ø°í CF_UTF8 µûÀ§°¡ Á¸ÀçÇÏÁöµµ ¾Ê´Â´Ù. UTF-8 ¹®¼­¸¦ Ŭ¸³º¸µå¿¡ ³Ö´Â ÇÁ·Î±×·¥ÀÌ ¾Ë¾Æ¼­ À¯´ÏÄÚµå·Î ¹Ù²ã¼­ ³Ö¾î¾ß ÇÏ°í ¿î¿µÃ¼Á¦´Â À̸¦ ANSI·Îµµ ¹Ù²ã ³õÀ¸¹Ç·Î ´ç±ÙÀº ÀÚ½ÅÀÇ ³»ºÎ Æ÷¸ËÀÎ CF_TEXT¸¦ Àб⸸ ÇÏ¸é µÈ´Ù.

¿î¿µÃ¼Á¦ÀÇ ÀÌ·± µ¿ÀÛ¿¡ ´ëÇؼ­´Â ÀÌ¹Ì Àß ¾Ë°í ÀÖÁö¸¸ ±×·³¿¡µµ ºÒ±¸ÇÏ°í ¼ø°£ÀÇ ÆÇ´Ü Âø¿À·Î ºÒÇÊ¿äÇÑ Äڵ带 ÀÛ¼ºÇØ ³Ö¾ú´Ù. ±â·ÏÀ» º¸´Ï 1.0ÀÇ 18-1-¸¶ Àý¿¡¼­ ÀÌ ÀÛ¾÷À» ÇÑ °ÍÀ¸·Î µÇ¾î Àִµ¥ ±×¶§ ºÎºÎ½Î¿òÀ» Çß´øÁö ½Ç¹«¿¡ Ä¡¿© ÀáÀ» ¸ø Àä´øÁö ¹º°¡ »óÅ°¡ ¾È ÁÁ¾Ò´ø °Í °°´Ù. ´ÙÇàÈ÷ ºÒÇÊ¿äÇÒ »ÓÀÌÁö º°´Ù¸¥ ºÎÀÛ¿ëÀº ¾ø´Â ÄÚµåÀÌ´Ù. ¿Ö³ÄÇϸé CF_TEXT·Î ÀоúÀ¸¸é ºÐ¼®ÇØ º¸³ª ¸¶³ª ANSI Æ÷¸ËÀ¸·Î ³ª¿Â´Ù.

 

9. Æ÷¸Ë º¯È¯ ¸Þ´º¸¦ ¼öÁ¤ÇÑ´Ù. Æ÷¸ËÀÇ °ª°ú Á¾·ù°¡ ¿Õâ ¹Ù²î¾úÀ¸¹Ç·Î ¸Þ´ºµµ º¯°æµÈ Æ÷¸ËÀÇ À̸§¿¡ ¸Â°Ô ´ÙÀ½°ú °°ÀÌ ¹Ù²î¾î¾ß ÇÑ´Ù.

 

¼öÁ¤Àü ID

¼öÁ¤ ÈÄ ID

IDM_FILE_WIN

IDM_FILE_ANSI

IDM_FILE_UNIX

IDM_FILE_UNI

IDM_FILE_MAC

IDM_FILE_UNIBIG

IDM_FILE_UNICODE

IDM_FILE_UNINOBOM

IDM_FILE_UNIBIG

IDM_FILE_UNIBIGNOBOM

IDM_FILE_UTF_8BOM

IDM_FILE_UTF8

IDM_FILE_UTF_8

IDM_FILE_UTF8NOBOM

 

¸®¼Ò½º ÆíÁý±â¿¡¼­ ¸Þ´º¸¦ ¼öÁ¤Çϸé ID°¡ ¾û¸ÁÀÌ µÇ¾î ¹ö¸®¹Ç·Î resource.h¸¦ Á÷Á¢ ¼öÁ¤ÇÏÀÚ. Àß ¾Ë´Ù½ÃÇÇ ºñÁÖ¾ó ½ºÆ©µð¿À´Â Àڱ⠸¶À½´ë·Î ID¸¦ °ü¸®Çϱ⠶§¹®¿¡ ¿Ø¸¸Çϸé ID¸¦ Á÷Á¢ ÇÒ´çÇÏ´Â °ÍÀÌ ÀÌÈÄÀÇ À¯Áö º¸¼ö¿¡ À¯¸®ÇÏ´Ù. ÀÌ ÀÛ¾÷À» ÇÒ ¶§´Â ºñÁÖ¾ó ½ºÆ©µð¿À¸¦ Àá½Ã Á¾·áÇØ ³õ´Â °ÍÀÌ ÁÁ´Ù. ´ÙÇàÈ÷µµ °³¼ö°¡ ÀÏÄ¡Çؼ­ ID¸¦ ¹Ð°Å³ª ´ç±æ ÇÊ¿ä´Â ¾ø´Ù.

 

#define IDM_FILE_ANSI                   409

#define IDM_FILE_UNI                    410

#define IDM_FILE_UNIBIG                 411

#define IDM_FILE_UNINOBOM               412

#define IDM_FILE_UNIBIGNOBOM            413

#define IDM_FILE_UTF8                   414

#define IDM_FILE_UTF8NOBOM              415

 

Á÷Á¢ ID¸¦ ¶â¾î °íÃÆÀ¸¹Ç·Î ¸®¼Ò½º ½ºÅ©¸³Æ®µµ ¾î¿ ¼ö ¾øÀÌ Á÷Á¢ ¼öÁ¤ÇØ¾ß ÇÑ´Ù. ºñÁÖ¾ó ½ºÆ©µð¿À¿¡¼­ ¸®¼Ò½º ÆíÁý±â¸¦ ¿­¸é ¿¡·¯°¡ ¹ß»ýÇϹǷΠ±×³É ÅؽºÆ® ÆíÁý±â·Î ÆíÁýÇÏ´Â °ÍÀÌ ´õ Æí¸®ÇÏ´Ù. ÀÌ·² ¶§ ´ç±ÙÀ» »ç¿ëÇÏ¸é µÈ´Ù. ´ç±ÙÀ» ¸¸µå´Âµ¥ ´ç±ÙÀ» »ç¿ëÇÏ´Â °ÍÀÌ´Ù. Dangeun.rc¸¦ ¿­¾î ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇÑ´Ù.

 

IDR_MENU1 MENU

BEGIN

    POPUP "ÆÄÀÏ(&F)"

    BEGIN

     ....

        BEGIN

            MENUITEM "ANSI(&A)",                    IDM_FILE_ANSI

            MENUITEM "À¯´ÏÄÚµå(&U)",                     IDM_FILE_UNI

            MENUITEM "À¯´ÏÄÚµå ºò(&B)",                    IDM_FILE_UNIBIG

            MENUITEM "À¯´ÏÄÚµå(NB)",                    IDM_FILE_UNINOBOM

            MENUITEM "À¯´ÏÄÚµå ºò(NB)",           IDM_FILE_UNIBIGNOBOM

            MENUITEM "UTF-&8",                 IDM_FILE_UTF8

            MENUITEM "UTF-8(&NB)",              IDM_FILE_UTF8NOBOM

        END

 

¸Þ´ºÀÇ Ä¸¼Ç°ú ID¸¦ ¼öÁ¤Çß´Ù. ºñÁÖ¾ó ½ºÆ©µð¿À¸¦ ´Ù½Ã ½ÇÇàÇÑ ÈÄ ¸Þ´º ¸®¼Ò½º¸¦ ¿­¾î º¸¸é Á¦´ë·Î ¼öÁ¤µÇ¾î ÀÖÀ» °ÍÀÌ´Ù. ´ÙÀ½°ú °°ÀÌ ³ª¿À¸é Á¤»óÀÌ´Ù.

°¢ ¸Þ´º Ç׸ñ¿¡ ´ëÇÑ Çڵ鷯¸¦ ¼öÁ¤ÇÑ´Ù. OnCommand¿¡ ¿ø·¡ ¸Þ´ºÀÇ Çڵ鷯¸¦ ´ÙÀ½°ú °°ÀÌ ´ëüÇÑ´Ù.

 

     case IDM_FILE_ANSI:

          pSi->Ae.SetFormat(AE_ENC_ANSI);

          SetStatusText(0x10);

          break;

     case IDM_FILE_UNI:

          pSi->Ae.SetFormat(AE_ENC_UNI);

          SetStatusText(0x10);

          break;

     case IDM_FILE_UNIBIG:

          pSi->Ae.SetFormat(AE_ENC_UNIBIG);

          SetStatusText(0x10);

          break;

     case IDM_FILE_UNINOBOM:

          pSi->Ae.SetFormat(AE_ENC_UNINOBOM);

          SetStatusText(0x10);

          break;

     case IDM_FILE_UNIBIGNOBOM:

          pSi->Ae.SetFormat(AE_ENC_UNIBIGNOBOM);

          SetStatusText(0x10);

          break;

     case IDM_FILE_UTF8:

          pSi->Ae.SetFormat(AE_ENC_UTF8);

          SetStatusText(0x10);

          break;

     case IDM_FILE_UTF8NOBOM:

          pSi->Ae.SetFormat(AE_ENC_UTF8NOBOM);

          SetStatusText(0x10);

          break;

 

°¢ ¸Þ´º Ç׸ñ¿¡ ´ëÇØ SetFormat ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ´ëÀÀµÇ´Â Æ÷¸ËÀ¸·Î º¯°æÇÑ´Ù. SetFormat ÇÔ¼öµµ °³Çà ¹æ½ÄÀº ¿ø·¡°ªÀ» À¯ÁöÇÏ°í ÀÎÄÚµù ¹æ½Ä¸¸ º¯°æÇϵµ·Ï ¼öÁ¤ÇØ¾ß ÇÑ´Ù. °³Çà ¹æ½Ä¸¸ º¯°æÇÏ´Â ±â´ÉÀº µû·Î Á¦°øµÇÁö ¾Ê´Â´Ù.

 

void CApiEdit::SetFormat(DWORD aFormat)

{

     DWORD OldEnc;

 

     OldEnc = dwFormat & 0xffff;

     if (aFormat != OldEnc) {

          SetModified(TRUE);

          dwFormat=(dwFormat & 0xffff0000) | aFormat;

     }

}

 

OnInitMenu¿¡¼­ ¸Þ´º Ç׸ñÀÇ »óŸ¦ °ü¸®ÇÏ´Â Äڵ嵵 ¼öÁ¤ÇÑ´Ù. GetFormatÀ¸·Î ±¸ÇÑ Æ÷¸Ë°ªÀ» ¹Ù·Î ÂüÁ¶Çؼ­´Â ¾ÈµÇ¸ç ÇÏÀ§ ¿öµåÀÇ ÀÎÄÚµù ¹æ½Ä¸¸ ÃßÃâÇÏ¿© »ç¿ëÇØ¾ß ÇÑ´Ù.

 

// ¹®¼­ Æ÷¸Ë Ç¥½Ã

switch (pSi->Ae.GetFormat() & 0xffff) {

case AE_ENC_ANSI:

     CheckMenuRadioItem(hMenu,IDM_FILE_ANSI,IDM_FILE_UTF8NOBOM,IDM_FILE_ANSI,MF_BYCOMMAND);

     break;

case AE_ENC_UNI:

     CheckMenuRadioItem(hMenu,IDM_FILE_ANSI,IDM_FILE_UTF8NOBOM,IDM_FILE_UNI,MF_BYCOMMAND);

     break;

case AE_ENC_UNIBIG:

     CheckMenuRadioItem(hMenu,IDM_FILE_ANSI,IDM_FILE_UTF8NOBOM,IDM_FILE_UNIBIG,MF_BYCOMMAND);

     break;

case AE_ENC_UNINOBOM:

     CheckMenuRadioItem(hMenu,IDM_FILE_ANSI,IDM_FILE_UTF8NOBOM,IDM_FILE_UNINOBOM,MF_BYCOMMAND);

     break;

case AE_ENC_UNIBIGNOBOM:

     CheckMenuRadioItem(hMenu,IDM_FILE_ANSI,IDM_FILE_UTF8NOBOM,IDM_FILE_UNIBIGNOBOM,MF_BYCOMMAND);

     break;

case AE_ENC_UTF8:

     CheckMenuRadioItem(hMenu,IDM_FILE_ANSI,IDM_FILE_UTF8NOBOM,IDM_FILE_UTF8,MF_BYCOMMAND);

     break;

case AE_ENC_UTF8NOBOM:

     CheckMenuRadioItem(hMenu,IDM_FILE_ANSI,IDM_FILE_UTF8NOBOM,IDM_FILE_UTF8NOBOM,MF_BYCOMMAND);

     break;

}

 

10. ¸¶Áö¸·À¸·Î Short.cpp¿¡ ±â·ÏµÇ¾î ÀÖ´Â ¸Þ´º Ç׸ñÀÇ ¸ñ·ÏÀ» ¼öÁ¤ÇÑ´Ù. Àß »ç¿ëµÇÁö ¾Ê´Â ±â´ÉÀÌÁö¸¸ ÀÌÀü ¸Þ´º Ç׸ñÀÇ ID¸¦ ÂüÁ¶ÇϹǷΠ¾î¿ ¼ö ¾øÀÌ ¼öÁ¤ÇØ¾ß ÇÑ´Ù. ¾ÆÁÖ ÀÌÀü ¹öÀüÀ̶ó ¸Þ´º °³¼öµµ ºÎÁ·Çѵ¥ ´ÙÀ½°ú °°ÀÌ ´Ã·Á ÁÖµµ·Ï ÇÏÀÚ. ÀÌ ¸í·ÉµéÀº ´ÜÃàÅ° ´ëÈ­»óÀÚÀÇ ¸ñ·Ï¿¡ ³ªÅ¸³­´Ù.

 

SMenuCom arMenuCom[]={

     ....

     {"ÆÄÀÏ/Æ÷¸Ë º¯È¯/ANSI",IDM_FILE_ANSI},

     {"ÆÄÀÏ/Æ÷¸Ë º¯È¯/À¯´ÏÄÚµå",IDM_FILE_UNI},

     {"ÆÄÀÏ/Æ÷¸Ë º¯È¯/À¯´ÏÄÚµå ºò",IDM_FILE_UNIBIG},

     {"ÆÄÀÏ/Æ÷¸Ë º¯È¯/À¯´ÏÄÚµå(NB)",IDM_FILE_UNINOBOM},

     {"ÆÄÀÏ/Æ÷¸Ë º¯È¯/À¯´ÏÄÚµå ºò(NB)",IDM_FILE_UNIBIGNOBOM},

     {"ÆÄÀÏ/Æ÷¸Ë º¯È¯/UTF-8",IDM_FILE_UTF8},

     {"ÆÄÀÏ/Æ÷¸Ë º¯È¯/UTF-8(NB)",IDM_FILE_UTF8NOBOM},

 

¿©±â±îÁö ÀÛ¾÷ÇÑ ÈÄ ÄÄÆÄÀÏÇØ º¸ÀÚ. ½Ç½À °úÁ¤»óÀÇ ½Ç¼ö°¡ ¾ø¾ú´Ù¸é ¹«»çÈ÷ ÄÄÆÄÀ쵃 °ÍÀ̸ç UTF-8 ¹®¼­µµ Àß ¿­¸°´Ù.

¿©·¯ Æ÷¸ËÀÇ ¹®¼­¸¦ ¿­¾î ºÁµµ Àß ¿­¸®¸ç »óŶõ¿¡´Â ÇöÀç ¹®¼­ÀÇ Æ÷¸ËÀÌ ³ªÅ¸³¯ °ÍÀÌ´Ù. ÀÌ·Î½á ´ç±ÙÀº ÀÌÀüº¸´Ù ÈξÀ ´õ ´Ù¾çÇÑ ¹®¼­¸¦ Áö¿øÇÒ ¼ö ÀÖ°Ô µÇ¾ú´Ù.

´Ù.ÀÜ ¹ö±× ¼öÁ¤

´ÙÀ½Àº °³¹ßÀÚ°¡ »ç¿ëÁß¿¡ ¹ß°ßÇÑ ¸î °¡Áö ÀÜ ¹ö±×¸¦ ¼öÁ¤ÇØ º¸ÀÚ. ¾Æ¹«µµ ¹ö±× º¸°í¸¦ ÇØ ÁÖÁö ¾Ê±â ¶§¹®¿¡ 1³âµ¿¾È ¹ß°ßÇÑ ¹ö±×°¡ ¼¼ °³ ¹Û¿¡ ¾ø´Ù. ¿ì¼± Àμâ»óÀÇ ¹ö±×°¡ ¹ß°ßµÇ¾ú´Âµ¥ ÁÙ ¹øÈ£ Àμ⠿ɼÇÀ» ¼±ÅÃÇÑ ÈÄ ÀμâÇØ º¸¸é ¿ÞÂÊÀÇ ÁÙ¹øÈ£ ¹è°æ»öÀÌ º»¹®ÀÇ ¹è°æ»öÀ» µû¶ó °¡´Â ¹®Á¦°¡ ÀÖ´Ù.

Áõ¼¼¸¸ µü ºÁµµ ¿øÀÎÀÌ ¹Ù·Î ÁüÀ۵Ǵ ½¬¿î ¹ö±×ÀÌ´Ù. º»¹® ¸ÕÀú Âï°í ÁÙ¹øÈ£¸¦ Ãâ·ÂÇϴµ¥ º»¹®¿¡¼­ ¼³Á¤ÇÑ ¹è°æ»öÀÌ ÁÙ¹øÈ£ Ãâ·Â¿¡ ±×´ë·Î »ç¿ëµÇ´Â °ÍÀÌ´Ù. ¿øÀÎÀ» ¾Ë°í ÀÖÀ¸´Ï ¼öÁ¤ ¹æ¹ýµµ »·ÇÏ´Ù. ±×·¯³ª ÀÌ Äڵ尡 ¾îµð¿¡ ÀÖ´ÂÁö ã´Âµ¥´Â ÇÑÂü °É·È´Ù. ApiEditText.cppÀÇ ´ÙÀ½ ÇÔ¼ö¿¡ ÇÑÁÙ¸¸ Ãß°¡ÇÏ¸é µÈ´Ù.

 

BOOL CApiEditText::PrintPage(Ae_PrintInfo *pi,int nPage)

{

     ....

          if (pi->bLineNum) {

              if (pi->pLine[l].nLine==0) {

                   wsprintf(szLine,"%d",pi->pLine[l].nPara);

                   SetTextColor(pi->pdc,RGB(128,128,128));

               SetBkMode(pi->pdc,TRANSPARENT);

                   TextOut(pi->pdc,pi->prt.left,pi->prt.top+Line*pi->LineHeight,

                        szLine,lstrlen(szLine));

              }

          }

     }

     SetTextColor(pi->pdc,OldTextColor);

     SetBkColor(pi->pdc,OldBkColor);

     SetBkMode(pi->pdc,OldBkMode);

 

     return bEnd;

}

 

ÁÙ¹øÈ£¸¦ Ãâ·ÂÇÒ ¶§ Àü°æ»öÀº ȸ»öÀ¸·Î ¹Ù²ÙÁö¸¸ ¹è°æ»öÀº º°µµ·Î ¼³Á¤ÇÏÁö ¾Ê¾Ò±â ¶§¹®¿¡ ÁÖ¼®ÀÌ ÀÖ´Â ÁÙÀº ÁÖ¼®ÀÇ ¹è°æ»öÀÌ ±×´ë·Î Àû¿ëµÇ¾î ÀÌ·± Çö»óÀÌ ³ªÅ¸³µ´Ù. ¿øÄ¢´ë·Î ÇÏÀÚ¸é Old¿¡ »ö»óµéÀ» ÀúÀåÇØ ³õ°í »ç¿ë ÈÄ º¹¿øÇØ¾ß ÇÏÁö¸¸ ¼Óµµ ¶§¹®¿¡ ±×·¸°Ô ÇÏÁö ¾Ê¾Æ¼­ ¸»½éÀÌ »ý±ä °ÍÀÌ´Ù.

´ÙÀ½À¸·Î ÀμâÁß ´ëÈ­»óÀÚ°¡ óÀ½¶ã ¶§ StaticÀÌ º¸ÀÌ´Â »¹ÂâÇÑ ¹®Á¦°¡ ÀÖ´Ù. ÀμⰡ ½ÃÀ۵Ǹé Àμâ ÁøÇà °úÁ¤ÀÌ Ãâ·ÂµÇÁö¸¸ ±× Àü¿¡´Â ÄÁÆ®·ÑÀÇ µðÆúÆ® ¹®ÀÚ¿­ÀÌ ±×´ë·Î º¸À̴µ¥ ÀÌ µðÆúÆ® ¹®ÀÚ¿­ÀÌ StaticÀ¸·Î µÇ¾î ÀÖ´Â °ÍÀÌ´Ù. Àμâ ÃʱâÈ­ °úÁ¤ÀÌ ±æ¾î ÀÌ ¹®ÀÚ¿­ÀÌ »ç¿ëÀÚ ´«¿¡ º¸ÀδÙ. IDD_PRINTINGÀÇ ¾Æ·¡ÂÊ ½ºÅÂƽ ĸ¼ÇÀ» "Àμâ ÁغñÁß"À¸·Î º¯°æÇÑ´Ù.

¼¼¹ø° ¹ö±×´Â ´Ù¼Ò ½É°¢Çѵ¥ ÇÑ±Û Á¶¸³Áß¿¡ Ctrl+Z¸¦ ´­·¯ Ãë¼ÒÇÒ ¶§ ´Ù¿îµÇ¾î ¹ö¸°´Ù. »õ ¹®¼­¸¦ ¿­°í "¿ì¸® ³ª¶ó"±îÁö¸¸ ÀÔ·ÂÇÏ¸é ¾ÆÁ÷µµ ÇÑ±Û Á¶¸³ÁßÀÌ´Ù. ÀÌ »óÅ¿¡¼­ Ctrl+Z¸¦ ´©¸£¸é º¸±â ÁÁ°Ô »¸¾î ¹ö¸°´Ù. ÇÁ·Î±×·¥ÀÌ ´Ù¿îµÇ´Â ½É°¢ÇÑ ¹®Á¦ÀÓ¿¡µµ Á¶¸³Áß¿¡ Ãë¼ÒÇÏ´Â °æ¿ì°¡ µå¹°¾î¼­ ¿©Å ¸ô¶ú´ø °Í °°´Ù.

µð¹ö°Å·Î ¿øÀÎÀ» ºÐ¼®ÇØ º¸¸é Undo°¡ È£ÃâµÉ ¶§ ¹®¼­¿¡´Â ´Ù ÀԷµǾî ÀÖÁö¸¸ Á¶¸³ÁßÀÎ '¶ó'ÀÚ°¡ ¾ÆÁ÷ ¾ðµÎ ¹öÆÛ¿¡ ±â·ÏµÇ¾î ÀÖÁö ¾ÊÀº »óÅÂÀÌ´Ù. ÀÌ »óÅ¿¡¼­ Ãë¼Ò¸¦ Çϸé '³ª'ÀÚ¸¸ »èÁ¦µÇ°í ¹öÆÛ´Â "¿ì¸® ¶ó"°¡ µÇ¸ç ij·µÀº '¶ó'ÀÚ¿¡ À§Ä¡ÇÑ´Ù. ±×·±µ¥ ¾ÆÁ÷ ÇÑ±Û Á¶¸³ÁßÀ̱⠶§¹®¿¡ SetCaretÀº '¶ó'ÀÚ ¾Õ 2¹ÙÀÌÆ® À§Ä¡¿¡ ij·µÀ» À§Ä¡½ÃÅ°°íÀÚ Çϴµ¥ ÀÌ À§Ä¡´Â '¸®'ÀÚÀÇ Áß°£¿¡ °ÉÄ¡¹Ç·Î ¹öÆÛÀÇ ¹üÀ§¸¦ ¹þ¾î³ª ´Ù¿îµÈ´Ù.

¹®Á¦ÀÇ ¿øÀÎÀº Undo°¡ È£ÃâµÇ¾úÀ» ¶§ ¾ÆÁ÷µµ ÇѱÛÀÌ Á¶¸³ÁßÀ̶ó´Â °ÍÀÌ´Ù. ÇÑ±Û Á¶¸³À» ¿Ï¼ºÇÏ°í ¾ðµÎ ¹öÆÛ¿¡µµ ¿ÏÀüÈ÷ ±â·ÏÇÑ ÈÄ Undo°¡ È£ÃâµÇ¾î¾ß Çϴµ¥ ±×·¸Áö°¡ ¸øÇØ ¹®Á¦°¡ ¹ß»ýÇÑ °ÍÀÌ´Ù. ÀÌ ¹®Á¦´Â ¾ÆÁÖ º¹ÀâÇÏ´Ù. ÃÖÀûÈ­¸¦ À§ÇØ Á¶¸³Áß¿¡´Â Ư¼öÇÑ Ã³¸®¸¦ ÇÏ°í ÀÖ°í Undo Å°ÀԷµµ Åë»óÀûÀÎ ¸Þ½ÃÁö¸¦ ¹Þ´Â °ÍÀÌ ¾Æ´Ï¶ó ´ÜÃàÅ° ¹è¿­À» µÚÁ® È£ÃâµÇ±â ¶§¹®¿¡ ¼ø¼­¸¦ ÀÓÀÇ Á¶Á¤Çϱ⠾î·Æ´Ù. ù¹ø° ÇØ°áÃ¥Àº ´ÙÀ½°ú °°´Ù.

 

void CApiEdit::Undo()

{

     int from, to, len, dest;

     int tick;

     CApiEditText *pView;

 

     pView=GetActiveView();

 

    if (pView->bComp) {

        WPARAM wParam;

        wParam=MAKEWPARAM(MAKEWORD(buf[pView->off-1], buf[pView->off-2]),0);

        pView->OnImeChar(pView->hWnd,wParam,(LPARAM)0);

        pView->EndComp();

    }

     pView->ExtraX=0;

     ....

 

Undo°¡ È£ÃâµÇ¾úÀ» ¶§ Á¶¸³ÁßÀ̸é OnImeChar ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ¹öÆÛ¿¡ ÀÔ·ÂµÈ ¹®ÀÚ¸¦ ¾ðµÎ ·¹Äڵ忡 °­Á¦·Î ±â·ÏÇÏ°í Á¶¸³À» ¸¶Ä¡µµ·Ï Çß´Ù. ÀÏ´Ü Á×Áö´Â ¾ÊÀ¸¸ç Undoµµ Àß µÈ´Ù. ±×·¯³ª Redo¸¦ ÇØ º¸¸é ¸¶Áö¸·¿¡ ÀÔ·ÂµÈ ¹®ÀÚ¸¸ ³ªÅ¸³­´Ù. ÀÌÀ¯´Â Undo È£Ãâ ÈÄ ÇÑ±Û Á¶¸³À» ¿Ï¼ºÇϱâ À§ÇØ OnImeChar°¡ ´Ù½Ã È£ÃâµÇ±â ¶§¹®ÀÌ´Ù. OS´Â ¾ÆÁ÷ ÇÑ±Û Á¶¸³ÁßÀ̶ó°í »ý°¢ÇÑ´Ù.

ÃÖ¼ÒÇÑ ÇÁ·Î±×·¥ÀÌ ´Ù¿îµÇ´Â °Íº¸´Ù´Â ³´Áö¸¸ ¸®µÎ°¡ Á¦´ë·Î ¾ÈµÇ¹Ç·Î ¹®Á¦°¡ ÇØ°áµÈ °ÍÀº ¾Æ´Ï´Ù. ÀÌ·² ¹Ù¿¡¾ß Â÷¶ó¸® Á¶¸³Áß¿¡´Â Undo¸¦ ÇÏÁö ¸øÇϵµ·Ï ±ÝÁöÇØ ¹ö¸®´Â °ÍÀÌ ´õ ³ªÀ» °Í °°´Ù. ±×·¡¼­ ´ÙÀ½°ú °°ÀÌ ÇÑ±Û Á¶¸³ÁßÀÌ¸é ¾ðµÎ°í ¹¹°í Áý¾î Ä¡¿ì°í ¸®ÅÏÇϵµ·Ï ÇØ ¹ö·È´Ù.

 

if (pView->bComp) {

     return;

}

 

ÀÌ·¨´õ´Ï ¹®Á¦°¡ ´Ù ÇØ°áµÇ¾ú´Ù. Undo°¡ ¸®ÅÏµÈ ÈÄ OnImeChar°¡ È£ÃâµÇ¾î ÇÑ±Û Á¶¸³ÀÌ ¿Ï¼ºµÈ ÈÄ ´Ù½Ã Undo°¡ È£ÃâµÈ´Ù. ¾î°¼­ ÀÌ·¸°Ô µÇ´ÂÁö´Â ¿ä¸ð Á¶¸ð ¶â¾îº¸°í µð¹ö°Å µ¹·Á ºÁµµ ¼ÖÁ÷È÷ Àß ¸ð¸£°Ú´Ù. OnImeChar°¡ È£ÃâµÇ´Â °ÍÀº ÃæºÐÈ÷ ÀÌÇصÇÁö¸¸ Undo°¡ ÀçÈ£ÃâµÇ´Â ÀÌÀ¯´Â ¾Æ¸®¼ÛÇÏ´Ù. ÇÑ±Û Á¶¸³ ¸Þ½ÃÁöÀÇ ¹ß»ý ¼ø¼­°¡ ¿ö³« ƯÀÌÇؼ­ Â÷ÈÄ Á» ´õ ¿¬±¸ÇØ ºÁ¾ßÇÒ ´ë»óÀÌ´Ù. Ȥ½Ã ºñ½ºÅ¸¿¡¼­¸¸ µÇ´Â °Ç ¾Æ´Ñ°¡ ½Í¾î XP¿¡¼­µµ Å×½ºÆ®ÇØ ºÃ´Âµ¥ ¿ª½Ã Àß µ¹¾Æ°£´Ù.

±×·¡¼­ ±×³É ÀÌ Äڵ带 äÅÃÇϱâ·Î Çß´Ù. ¾Æ´Ï, ¾îÂî µ¹¾Æ°¡´ÂÁö Á¦´ë·Î ºÐ¼®µµ ¾È µÈ Äڵ带 ¾²°Ú´Ù´Â ¸»Àΰ¡? ¹°·Ð ±×·¯¸é ¾ÈµÈ´Ù. ±×·¯³ª ´çÀå ³»ÀϺÎÅÍ ÇÁ·ÎÁ§Æ®¿¡ ÅõÀԵǾî¾ß ÇÏ°í ÁÖ¸»¹Û¿¡ ½Ã°£ÀÌ ¾øÀ¸´Ï ÇÑ°¡ÇÏ°Ô ÀÌ·± ÄÚµåÀÇ ¿øÀÎÀ» ºÐ¼®ÇÏ°í ¾É¾Æ ÀÖÀ» ½Ã°£ÀÌ ¾ø´Ù. ¾î·°Å³ª À§ Äڵ带 ¾²¸é ÃÖ¼ÒÇÑ ´Ù¿îµÇÁö´Â ¾Ê´Â´Ù. ³ªµµ ÀÌ·± »óȲÀÌ ¾ÈŸ±õ°í ±×·¯¸é ¾ÈµÈ´Ù´Â °ÍÀº ¾ËÁö¸¸ ¾î¿ µµ¸®°¡ ¾ø´Ù. Â÷ÈÄ ¿¬±¸ÇØ º¼ ´ë»óÀ¸·Î ³²°ÜµÎ°í ÀÏ´Ü ³Ñ¾î°¡µÇ Àå´ãÄÁµ¥ ¸ÓÁö ¾ÊÀº ¹Ì·¡¿¡ º°·Î Å©Áöµµ ¾ÊÀº ÄÚ ´ÙÄ¡°Ô µÉ °ÍÀÌ´Ù.

¶ó.Æ˾÷ ¸Þ´º °³¼±

ApiEdit´Â ÀÚüÀûÀ¸·Î Ŭ¸³º¸µå °ü·Ã ¸í·ÉÀ» Æ˾÷ ¸Þ´º·Î Á¦°øÇÒ »Ó¸¸ ¾Æ´Ï¶ó È£½ºÆ®¿¡°Ô ÇÊ¿äÇÑ ¸í·ÉÀ» Ãß°¡·Î ´õ ¹èÄ¡ÇÒ ¼ö ÀÖµµ·Ï ÇÑ´Ù. ´ç±ÙÀº ApiEditÀÇ ±âº» Æ˾÷ ¸Þ´º¿¡ ´Ý±â ¸í·ÉÀ» Ãß°¡ÇÏ¿© X ¹öÆ°±îÁö À̵¿ÇÏÁö ¾Ê°íµµ ¹®¼­¸¦ ´ÝÀ» ¼ö ÀÖµµ·Ï ÇÑ´Ù. ÀÌ ±â´É ÀÚü´Â ÁÁÀºµ¥ ´Ý±â ¸í·ÉÀÌ ¸Þ´ºÀÇ ³Ê¹« ¾Æ·¡ÂÊ¿¡ ÀÖ´Ù º¸´Ï ¾²±â¿¡ ´Ù¼Ò ºÒÆíÇÑ ¸éÀÌ ÀÖ´Ù.

´ç±ÙÀ» ÅؽºÆ® ºä¾î·Î »ç¿ëÇÒ ¶§´Â ¿©´Â °Í¸¸Å­À̳ª ½Å¼ÓÇÑ ´Ý±âµµ Áß¿äÇÏ´Ù. ÆÄÀÏÅÇ¿¡ ´Ý±â ¹öÆ°À» Á¦°øÇϸé ÁÁ±â´Â ÇÏÁö¸¸ ±â¼úÀûÀ¸·Î ´Ù·®ÀÇ Äڵ尡 ¿ä±¸µÇ´Âµ¥´Ù È­¸é ¸éÀûµµ Ãà³»¹Ç·Î ¹Ù¶÷Á÷ÇÏÁö ¾Ê´Ù. ±×·¡¼­ ´Ý±â ¸í·ÉÀ» °è¼Ó Á¦°øÇ쵂 Æ˾÷ÀÇ Á¦ÀÏ À§¿¡ ¿Ã·Á ¿À¸¥ÂÊ ¸¶¿ì½º ¹öÆ°À¸·Î ½±°Ô ´ÝÀ» ¼ö ÀÖµµ·Ï ¼öÁ¤Çϱâ·Î ÇÑ´Ù.

¶Ç, ÀÌ¿Õ Æ˾÷ ¸Þ´º¿¡ ¼ÕÀ» ´ë´Â ±è¿¡ À§Ä¡ ã±â ¸í·Éµµ Ãß°¡ÇÑ´Ù. Ž»ö±â Æ˾÷¿¡¼­ ÆÄÀÏÀ» ¿­¾úÀ» ¶§ °°Àº µð·ºÅ丮ÀÇ ÆÄÀÏÀ» º¸°í ½ÍÀ» ¶§°¡ ÀÖ´Ù. ´ç±ÙÀÇ Å½»öâ¿¡ ÆÄÀÏÀÌ ¼ÓÇÑ µð·ºÅ丮¸¦ ¹Ù·Î º¸¿© ÁÖ¸é ÁÖº¯ ÆÄÀÏÀ» ºü¸£°Ô ¼±ÅÃÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.

Æ˾÷ ¸Þ´º´Â ApiEditÀÇ ±â´ÉÀÌ ¾Æ´Ï¶ó ´ç±ÙÀÇ ±â´ÉÀÌ´Ù. ApiEdit´Â ºÎ¸ð¿¡°Ô ¸Þ½ÃÁö¸¦ º¸³» Æ˾÷ ¸Þ´º¸¦ ´Þ ¼ö ÀÖ´Â ±âȸ¸¦ Á¦°øÇÏ°í Æ˾÷ ¸Þ´º ¼±Åýÿ¡µµ ¸Þ½ÃÁö¸¦ º¸³» 󸮸¦ ºÎŹÇÑ´Ù. Dangeun.cpp¿¡ ´ÙÀ½ Äڵ带 ÀÛ¼º ¹× Ãß°¡ÇÑ´Ù.

 

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

{

     ....

          // È£½ºÆ®ÀÇ Æ˾÷ Ç׸ñÀ» µî·ÏÇ϶ó.

          if (iMessage == pSi->Ae.GetUserBase()+4) {

              InsertMenu((HMENU)wParam,0,MF_BYPOSITION | MF_STRING,0,"´Ý±â(&Q)");

              InsertMenu((HMENU)wParam,1,MF_BYPOSITION | MF_SEPARATOR,0,NULL);

              AppendMenu((HMENU)wParam,MF_SEPARATOR,0,NULL);

              AppendMenu((HMENU)wParam,MF_STRING,1,"À§Ä¡ ã±â");

              return 0;

          }

          // wParamÀ¸·Î Àü´ÞµÈ È£½ºÆ®ÀÇ Æ˾÷ Ç׸ñÀ» ½ÇÇàÇ϶ó.

          if (iMessage == pSi->Ae.GetUserBase()+5) {

              switch (wParam) {

              case 0:

                   PostMessage(hWnd,WM_CLOSE,0,0);

                   break;

              case 1:

                   SInfo *pSi;

                   pSi=(SInfo *)GetWindowLongPtr(hWnd,0);

                   if (strncmp(pSi->NowFile,"À̸§¾øÀ½",8) != 0) {

                        TCHAR drive[MAX_PATH];

                        TCHAR dir[_MAX_DIR];

 

                        _splitpath(pSi->NowFile, drive, dir, NULL, NULL);

                        lstrcat(drive, dir);

                        GotoFolderInTree(drive);

 

                        if (Option.bShowFileWnd == FALSE) {

                            Option.bShowFileWnd = TRUE;

                             Relayout();

                        }

                   }

                   break;

              }

          }

 

ApiEdit´Â Æ˾÷ ¸Þ´º¿¡ Ç׸ñÀ» Ãß°¡ÇÒ ¶§ UserBase + 4, Ãß°¡µÈ Æ˾÷ Ç׸ñÀ» ¼±ÅÃÇßÀ» ¶§ UserBase + 5ÀÇ ¸Þ½ÃÁö¸¦ º¸³»´Âµ¥ ÀÌ ºÎºÐ¸¸ ¼öÁ¤ÇÏ¸é µÈ´Ù. ÀÌÀü ¹öÀüÀº ¸Þ´º ¸®½ºÆ®ÀÇ Á¦ÀÏ ¾Æ·¡¿¡ Ãß°¡ÇϹǷΠAppendMenu¸¦ »ç¿ëÇߴµ¥ »õ ¹öÀüÀº ¾ÕÂÊ¿¡ Ãß°¡ÇϹǷΠInsertMenu¸¦ »ç¿ëÇÑ´Ù. À§Ä¡ ã±â ¸í·ÉÀº Á¦ÀÏ µÚ¿¡ Ãß°¡ÇϹǷΠAppendMenu¸¦ »ç¿ëÇÏ¸é µÈ´Ù.

´Ý±â ¸í·É¿¡ ´ëÇؼ­´Â ±âÁ¸ Äڵ带 ±×´ë·Î »ç¿ëÇÏ¸é µÇ°í »õ·Î Ãß°¡µÈ À§Ä¡ ã±â ¸í·É¿¡ ´ëÇؼ­´Â Äڵ带 »õ·Î ÀÛ¼ºÇß´Ù. ÆíÁýÁßÀÎ ÆÄÀÏÀÇ °æ·Î¿¡¼­ µð·ºÅ丮¸í¸¸ ÃßÃâÇÏ¿© ÆÄÀÏâÀ¸·Î À̵¿ÇÏ¸é µÈ´Ù. ÆÄÀϸíÀÌ ¾ÆÁ÷ Á¤ÇØÁöÁö ¾Ê¾ÒÀ¸¸é µð½ºÅ©»óÀÇ À§Ä¡°¡ ¾øÀ¸¹Ç·Î ÀÌ ±â´ÉÀ» ¾µ ¼ö ¾ø´Ù. ÆÄÀÏâÀÌ º¸ÀÌÁö ¾Ê´Â »óÅÂÀÌ¸é °­Á¦·Î º¸À̵µ·Ï ¸¸µç´Ù. ¿©±â±îÁö ÀÛ¾÷ÇÑ ÈÄ ½ÇÇàÇØ º¸¸é Æ˾÷ ¸Þ´º¿¡ µÎ°³ÀÇ ¸í·ÉÀÌ ³ªÅ¸³ª°í ±â´Éµµ Àß µ¿ÀÛÇÑ´Ù.

´Ý±â ¸í·ÉÀÌ °¡±õ±â´Â ÇÏÁö¸¸ ÀÌ Ç׸ñÀ» ¿ÞÂÊ ¸¶¿ì½º ¹öÆ°À¸·Î¸¸ ¼±ÅÃÇØ¾ß ÇϹǷΠ¿©ÀüÈ÷ ºÒÆíÇÏ´Ù. Æ˾÷À» ¿À¸¥ÂÊ ¹öÆ°À¸·Î È£ÃâÇßÀ¸¹Ç·Î ¿À¸¥ÂÊ ¹öÆ°À¸·Îµµ Ç׸ñÀ» ¼±ÅÃÇÒ ¼ö ÀÖ´Ù¸é ÈξÀ ´õ ºü¸£°Ô ¸í·ÉÀ» ¼±ÅÃÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. Æ˾÷ ¸Þ´º¸¦ È£ÃâÇÏ´Â ÇÔ¼ö¿¡ TPM_RIGHTBUTTON Ç÷¡±×¸¸ ÁÖ¸é ¿À¸¥ÂÊ ¸¶¿ì½º ¹öÆ°À¸·Îµµ ¸í·ÉÀ» ¼±ÅÃÇÒ ¼ö ÀÖ´Ù.

 

void CApiEditText::OnContextMenu(HWND hWnd, HWND hwndContext, UINT xPos, UINT yPos)

{

     ....

     TrackPopupMenu(hPopup,TPM_LEFTALIGN | TPM_RIGHTBUTTON,(short)xPos,(short)yPos,0,hWnd,NULL);

     DestroyMenu(hPopup);

}

 

ÀÌ ½Ç½ÀÀ» ÇØ º» °á°ú ApiEdit°¡ ³ª¸§´ë·Î È®À强Àº ÁÁÀº °Í °°´Ù. È£½ºÆ®¿¡°Ô ¸Þ´º ÇÚµéÀ» ³Ñ°Ü ÁֹǷΠ¸Þ´º¿¡ ´ëÇØ ÇÒ ¼ö ÀÖ´Â ¸ðµç 󸮸¦ ÇÒ ¼ö ÀÖ´Â ±âȸ¸¦ Á¦°øÇÑ´Ù. ¶Ç ÆÄÀÏâ¿¡¼­ µð·ºÅ丮¸¦ ã¾Æ°¡´Â ÇÔ¼öµµ Àß ¸¸µé¾îÁ® ÀÖ¾î ±×³É È£ÃâÇϱ⸸ ÇÏ¸é µÈ´Ù. Àú·± ÇÔ¼ö¸¦ ¸¸µé¾ú´ø ±â¾ïÁ¶Â÷µµ °¡¹° °¡¹°Çѵ¥ È£ÃâÇß´õ´Ï Àß ½ÇÇàµÇ¾î ´ë°ß½º·´´Ù.

¸¶.ºÐ¼®±â Ãß°¡

´ÙÀ½Àº ±¸¹® ºÐ¼®±â¸¦ Ãß°¡ÇÑ´Ù. ÇöÀç ´ç±ÙÀº C, HTML, SQL Á¤µµÀÇ ±¸¹® ºÐ¼®±â¸¸À» Á¦°øÇϴµ¥ ½Ç½À ÇÁ·ÎÁ§Æ®´Ù º¸´Ï ¾çº¸´Ù´Â ÁúÀ» Áß¿ä½ÃÇÏ¿© °³¼ö°¡ ¸¹Áö ¾Ê´Ù. ÃÖ¼ÒÇÑ ÀÚ¹Ù¿Í C# Á¤µµ´Â ºÐ¼®±â¸¦ Á¦°øÇØ¾ß°Ú´Ù°í ´À²¼Áö¸¸ Çѹø ¼Õ´ëÀÚ¸é ´ë°ø»ç°¡ µÉ°Ô »·ÇØ ÇÒ±î ¸»±î ¸Á¼³¿´¾ú´Ù. °á±¹ Áö±ÝÀº ³»°¡ ÇÊ¿äÇؼ­ ±â´ÉÀ» Ãß°¡ÇØ¾ß ÇÒ »óȲÀÌ´Ù.

´ë´ÜÈ÷ ÀÛ¾÷¾çÀÌ ¸¹°í ½Ã°£µµ ¿À·¡ °É¸®´Â ÁÖÁ¦ÀÌÁö¸¸ ´ÙÇàÈ÷ ±âº» ±¸Á¶°¡ ³ª¸§´ë·Î źźÇؼ­ ¾î·ÆÁö ¾Ê°Ô ±â´ÉÀ» Ãß°¡ÇÒ ¼ö ÀÖ´Ù. ÀÚ¹Ù¿Í C#Àº ¸ðµÎ C++·ÎºÎÅÍ ÆÄ»ýµÈ ¾ð¾îÀÌ¸ç ±×·¸´Ù º¸´Ï ±¸¹®µµ C++ÀÇ ¼­ºê¼ÂÀÌ´Ù. ¹°·Ð ¾ð¾îº°·Î ¾à°£¾¿ È®ÀåµÇ´Â ±¸¹®ÀÌ ÀÖ±â´Â ÇÏ´Ù. ÀÚ¹ÙÀÇ °æ¿ì /**·Î ½ÃÀ۵Ǹé JavaDocÀ¸·Î 󸮵Ǹç C++Àº ///·Î ½ÃÀ۵Ǹé XML ÁÖ¼®ÀÌ´Ù. ¾î·µç µÑ ´Ù ÁÖ¼®À̹ǷΠÀÌ Á¤µµ ±â´ÉÀº ¹«½ÃÇصµ Å« »ó°üÀº ¾ø´Ù.

±×·¡¼­ µÎ ºÐ¼®±â¸¦ ¿ÏÀüÈ÷ »õ·Î ¸¸µå´Â °Íº¸´Ù´Â »ó¼Ó ±â¹ýÀ» Àû±Ø È°¿ëÇÏ¿© ½±°Ô ¸¸µé±â·Î Çß´Ù. ´ÙÀ½ °úÁ¤´ë·Î ÀÛ¾÷À» ÁøÇàÇÏ¸é µÈ´Ù. ¸ÕÀú µÎ ºÐ¼®±âÀÇ ºÎ¸ðÀÎ CParseCpp Ŭ·¡½ºÀÇ ¼±¾ðÀ» ¾à°£ ¼öÁ¤ÇÏ¿© »ó¼ÓÀ» ¹ÞÀ» Áغñ¸¦ ÇØ¾ß ÇÑ´Ù.

 

class CParseCpp : public CParse

{

public:

     CParseCpp();

     ~CParseCpp() {};

     virtual TCHAR *GetInfo(int iIndex);

 

protected:

     virtual void ParseLine(CApiEditText &ae,int nLine,Ae_PrintInfo *pi);

     virtual BOOL IsKeyword(CApiEditText &ae,int s, int e);

     virtual BOOL IsPreProcessor(CApiEditText &ae,int s, int e);

};

 

¾ÖÃÊ¿¡ »ó¼ÓÀ» °í·ÁÇÏÁö ¾Ê´Ù º¸´Ï ¸â¹ö ÇÔ¼öµéÀÌ private¿´´Âµ¥ ÀÌÁ¦ »ó¼ÓÀ» ÇØ¾ß ÇϹǷΠprotected·Î ¹Ù²Ù°í IsKeyword, IsPreProcessor ÇÔ¼ö¸¦ °¡»óÀ¸·Î ¼±¾ðÇÑ´Ù. GetInfo, ParseLine¿¡µµ virtualÀ» ºÙ¿´´Âµ¥ ÀÌ µÑÀº CParse°¡ ¼ø¼ö °¡»óÀ¸·Î ¼±¾ðÇÏ°í ÀÖÀ¸¹Ç·Î ¿ø·¡ºÎÅÍ °¡»óÀ̾ú´Ù. ´ÜÁö ÀÌ ÇÔ¼ö°¡ °¡»óÀÓÀ» Ç¥½ÃÇÏ´Â ÁÖ¼®À» ´õ ºÙÀÎ °Í »ÓÀÌ´Ù.

ºÎ¸ð Ŭ·¡½º°¡ Á¤ºñµÇ¾úÀ¸¹Ç·Î ÀÌÁ¦ ÀÚ½Ä Å¬·¡½ºµéÀ» ¸¸µé¾î º¸ÀÚ. µÑ ´Ù ºñ½ÁÇϹǷΠµû·Î ÀÛ¾÷ÇÒ ÇÊ¿ä¾øÀÌ ÇѲ¨¹ø¿¡ µÑÀ» ºÙÀ̱â·Î ÇÑ´Ù. ºÐ¼®±âµéÀÌ ¿Ë±â Á¾±â ¸ð¿© ÀÖ´Â Parse.h ÆÄÀÏÀ» ¿­°í CParseCpp ¼±¾ð¹® ¾Æ·¡¿¡ CParseJava, CParseCS Ŭ·¡½º¸¦ ´ÙÀ½°ú °°ÀÌ ¼±¾ðÇÑ´Ù.

 

class CParseJava : public CParseCpp

{

public:

     CParseJava();

     ~CParseJava() {};

     virtual TCHAR *GetInfo(int iIndex);

 

protected:

     virtual BOOL IsKeyword(CApiEditText &ae,int s, int e);

     virtual BOOL IsPreProcessor(CApiEditText &ae,int s, int e);

};

 

class CParseCS : public CParseCpp

{

public:

     CParseCS();

     ~CParseCS() {};

     virtual TCHAR *GetInfo(int iIndex);

 

protected:

     virtual BOOL IsKeyword(CApiEditText &ae,int s, int e);

     virtual BOOL IsPreProcessor(CApiEditText &ae,int s, int e);

};

 

ºÐ¼®±âº°·Î ´Þ¶óÁú ¼ö ÀÖ´Â ºÎºÐ¿¡ ´ëÇؼ­¸¸ ÇÔ¼ö¸¦ ÀçÁ¤ÀÇÇß´Ù. ½ÇÁ¦·Î ±¸¹®À» ºÐ¼®ÇÏ´Â ParseLine ÇÔ¼ö´Â ºÎ¸ðÀÇ °ÍÀ» ±×´ë·Î »ç¿ëÇصµ µÈ´Ù. »ç½Ç ParseLine ÇÔ¼ö°¡ ±¸¹® ºÐ¼®ÀÇ ÇÙ½ÉÀε¥ ÀÌ ÇÔ¼ö¸¦ ±×´ë·Î ¾µ ¼ö ÀÖ´Ù´Ï À̰͸¸ Çصµ ¾îµò°¡. °´Ã¼ ÁöÇâÀÌ ÁÁ´Ù´Â °Ô ¹Ù·Î ÀÌ·± °ÍÀ̸ç Àç»ç¿ë¿¡ ÀÇÇØ ¿Ïº®ÇÏ°Ô µ¿ÀÛÇÑ´Ù´Â °ÍÀÌ Á¤¸» °¨µ¿½º·´´Ù. ³ª¸ÓÁö ÇÔ¼öµéÀÇ ±¸Çö ÄÚµå´Â ºñ±³Àû °£´ÜÇÏ´Ù.

 

CParseJava::CParseJava()

{

     arStyle[1].back=RGB(255,249,157);

     lstrcpy(arStyle[2].name,"¹®ÀÚ¿­");

     arStyle[2].fore=RGB(255,0,255);

     lstrcpy(arStyle[3].name,"¹®ÀÚ");

     arStyle[3].fore=RGB(255,0,255);

     lstrcpy(arStyle[4].name,"¼ýÀÚ");

     arStyle[4].fore=RGB(0,128,0);

}

 

TCHAR *CParseJava::GetInfo(int iIndex)

{

     switch (iIndex) {

     case 0:

          return (TCHAR *)4;

     case 1:

          return TEXT(" \t\r\n\"\'\\.,<>:;/()[]{}~!@#%^&*-+=?|");

     case 2:

          return TEXT("//");

     case 3:

          return TEXT("/*");

     case 4:

          return TEXT("*/");

     case 5:

          return TEXT("{");

     case 6:

          return TEXT("}");

     }

     return 0;

}

 

BOOL CParseJava::IsKeyword(CApiEditText &ae,int s, int e)

{

     static TCHAR *keyword=" abstract continue for new switch assert "

          "default if package synchronized boolean do goto private this "

          "break double implements protected int byte else import public "

          "throw throws case enum instanceof return transient catch extends "

          "short try char final interface static void class finally long "

          "strictfp volatile const float native super while "

          "true false null ";

 

     return IsStringExist(keyword,ae.pFrame->buf+s,e-s+1,TRUE);

}

 

BOOL CParseJava::IsPreProcessor(CApiEditText &ae,int s, int e)

{

     static TCHAR *preproc="";

 

     return IsStringExist(preproc,ae.pFrame->buf+s,e-s+1,TRUE);

}

 

»ý¼ºÀÚ´Â ºÎ¸ðÀÇ °ÍÀ» »ó¼Ó¹ÞÁö´Â ¾ÊÁö¸¸ ºÎ¸ðÀÇ µðÆúÆ® »ý¼ºÀÚ°¡ È£ÃâµÇ±â´Â ÇÑ´Ù. ±×·¡¼­ ÀÏ´Ü ºÎ¸ð¿¡°Ô µðÆúÆ® ¼³Á¤À» ºÎŹÇÑ ÈÄ ¹Ù²Ù°í ½ÍÀº °Í¸¸ »ì¦ ¹Ù²Ù¸é µÈ´Ù. »ç½Ç ¾È ¹Ù²ãµµ µÇ±â´Â ÇÏÁö¸¸ ³Ê¹« ¶È°°À¸¸é µµ´ëü ¹¹°¡ ´Þ¶óÁ³´ÂÁö ¿ÀÇظ¦ ¹ÞÀ» °Í °°¾Æ »ö±ò¸¸ ¾à°£ ¹Ù²ã º¸¾Ò´Ù. ¹®ÀÚ¿­°ú ¼ýÀÚÀÇ »ö»ó¸¸ »ì¦ ¹Ù²Ù°í Á» Æ¢¾î º¸À̱â À§ÇØ ÁÖ¼®ÀÇ ¹è°æ»öÀ» ¿¬ÇÑ ³ë¶õ»öÀ¸·Î ¹Ù²å´Ù.

GetInfo´Â case 0¿¡¼­ ¸®ÅÏÇÏ´Â ºÐ¼®±â ¹øÈ£¸¸ ´Ù¸£¸ç ±¸ºÐÀÚ³ª ºí·Ï ±¸Á¶´Â µ¿ÀÏÇÏ´Ù. ºÐ¼®±âº°·Î °íÀ¯ÇÑ ¹øÈ£¸¦ ºÎ¿©ÇØ¾ß Çϴµ¥ SQLÀÌ 3¹øÀ¸·Î ÇÒ´çµÇ¾î ÀÖÀ¸¹Ç·Î »õ·Î Ãß°¡µÇ´Â ÀÚ¹Ù°¡ 4¹ø, C#ÀÌ 5¹øÀÌ´Ù. °¡Àå Â÷À̳ª´Â ºÎºÐÀº Å°¿öµå ¸ñ·ÏÀε¥ ÀÚ¹ÙÀÇ Å°¿öµå¸¦ ¹è¿­¿¡ ¸ðµÎ ±â·ÏÇØ µÎ¾ú´Ù. ÀÌ ¹è¿­ÀÌ ¹Ù²î¸é ±¸¹® ºÐ¼®½Ã Å°¿öµå·Î ÀνĵǴ ´Ü¾î°¡ ´Þ¶óÁø´Ù.

Àüó¸® ¸ñ·ÏÀº ¾Æ¿¹ ¾ø´Ù. ÀÚ¹Ù´Â Àü󸮶ó´Â °³³ä ÀÚü°¡ ¾ø±â ¶§¹®¿¡ Àüó¸® ¸ñ·Ïµµ ´ç¿¬È÷ ºñ¾î ÀÖ´Ù. ÀÚ¹Ù ºÐ¼®±â¸¦ »õ·Î ¸¸µç´Ù¸é Àüó¸® ¿ä¼Ò ÀÚü¸¦ ¾ø¾Ö ¹ö¸®°ÚÁö¸¸ »ó¼ÓÀ» ¹Þ¾Ò±â ¶§¹®¿¡ ±×·¸°Ô ÇÒ ¼ö´Â ¾ø°í Àüó¸® ¸ñ·Ï¸¸ ºñ¿ö µÎ¸é µÈ´Ù. ´ÙÀ½Àº C#ÀÇ ºÐ¼®±â ÄÚµåÀÌ´Ù.

 

CParseCS::CParseCS()

{

     lstrcpy(arStyle[1].name,"ÁÖ¼®");

     arStyle[1].fore=RGB(128,128,128);

     arStyle[1].back=DWORD(-1);

}

 

TCHAR *CParseCS::GetInfo(int iIndex)

{

     switch (iIndex) {

     case 0:

          return (TCHAR *)5;

     case 1:

          return TEXT(" \t\r\n\"\'\\.,<>:;/()[]{}~!@#%^&*-+=?|");

     case 2:

          return TEXT("//");

     case 3:

          return TEXT("/*");

     case 4:

          return TEXT("*/");

     case 5:

          return TEXT("{");

     case 6:

          return TEXT("}");

     }

     return 0;

}

 

BOOL CParseCS::IsKeyword(CApiEditText &ae,int s, int e)

{

     static TCHAR *keyword=" abstract as base bool break byte case catch char "

          "checked class const continue decimal default delegate do double else "

          "enum event explicit extern false finally fixed float for foreach goto "

          "if implicit in int interface internal is lock long namespace new null "

          "object operator out override params private protected public readonly "

          "ref return sbyte sealed short sizeof stackalloc static string struct "

          "switch this throw true try typeof uint ulong unchecked unsafe ushort "

          "using virtual void volatile while ";

 

     return IsStringExist(keyword,ae.pFrame->buf+s,e-s+1,TRUE);

}

 

BOOL CParseCS::IsPreProcessor(CApiEditText &ae,int s, int e)

{

     static TCHAR *preproc=" #define #if #elif #else #endif #error #warning "

          " #line #undef #region #endregion ";

 

     return IsStringExist(preproc,ae.pFrame->buf+s,e-s+1,TRUE);

}

 

ÁÖ¼®ÀÇ Àü°æ»öÀ» ȸ»öÀ¸·Î Á¤ÀÇÇÏ°í ¹è°æ»öÀº Åõ¸íÀ¸·Î Çß´Ù. ºÐ¼®±â ID·Î 5¹øÀ» ÇÒ´çÇÏ°í Å°¿öµå ¸ñ·Ï°ú Àüó¸® ¸ñ·ÏÀ» Á¤ÀÇÇß´Ù. ¿ö³« C++°ú ±¸¹®ÀÌ ºñ½ÁÇϱ⠶§¹®¿¡ º°·Î °íÄ¥ °Ô ¾ø´Ù.

ºÐ¼®±â ÀÚü´Â ¿Ï¼ºµÇ¾úÀ¸¹Ç·Î ÀÌÁ¦ ApiEdit°¡ ÀÌ ºÐ¼®±â¸¦ »ç¿ëÇϵµ·Ï ö½â °®´Ù ºÙÀ̱⸸ ÇÏ¸é µÈ´Ù. ºÐ¼®±â´Â ApiEditÀÇ ¸ðµç ¸â¹ö¸¦ ÀÚÀ¯·Ó°Ô ¾×¼¼½ºÇØ¾ß ÇϹǷΠfriend·Î ÁöÁ¤µÇ¾î¾ß ÇÑ´Ù. CApiEdit Ŭ·¡½º ¼±¾ð¹® ¾ÕÂÊ¿¡ »õ·Î Ãß°¡µÈ ºÐ¼®±âµµ Ä£±¸·Î ÁöÁ¤ÇÑ´Ù.

 

class CApiEdit : public CWindow

{

     friend class CApiEditText;

     friend class CApiEditHexa;

     friend class CParse;

     friend class CParseCpp;

     friend class CParseNull;

     friend class CParseHtml;

     friend class CParseSql;

    friend class CParseJava;

    friend class CParseCS;

 

CApiEditTextÀÇ SetParser ÇÔ¼ö¿¡¼­ Ãß°¡µÈ µÎ Æļ­¸¦ »ý¼ºÇÑ´Ù. ºÐ¼®±â ¹øÈ£¿¡ ´ëÀÀµÇ´Â °´Ã¼¸¦ new ¿¬»êÀÚ·Î »ý¼ºÇϱ⸸ ÇÏ¸é µÈ´Ù. ÀÌÈÄ¿¡µµ ºÐ¼®±â¸¦ »ç¿ëÇÏ´Â ¸ðµç Äڵ忡 À¯»çÇÑ Äڵ尡 »ðÀԵǾî¾ß ÇÑ´Ù. ÇÙ»çºä´Â ±¸¹® ºÐ¼® ±â´ÉÀÌ ¾øÀ¸¹Ç·Î ¼öÁ¤ÇÒ ÇÊ¿ä°¡ ¾ø´Ù.

 

void CApiEditText::SetParser(int ParseType)

{

     if (Parser != NULL) {

          delete Parser;

     }

 

     switch(ParseType) {

     case -1:

          break;

     case 0:

          Parser=new CParseNull;

          break;

     case 1:

          Parser=new CParseCpp;

          break;

     case 2:

          Parser=new CParseHtml;

          break;

     case 3:

          Parser=new CParseSql;

          break;

    case 4:

        Parser=new CParseJava;

        break;

    case 5:

        Parser=new CParseCS;

        break;

     }

 

     Invalidate(-1);

}

 

°³¼ö°¡ ´Ã¾î³µÀ¸¹Ç·Î °¢ Äڵ忡 ´Ã¾î³­ °³¼ö¸¦ ÀνÄÇÒ ¼ö ÀÖµµ·Ï ÇØ¾ß ÇÑ´Ù. ÀÌÀü ¹öÀü¿¡¼­´Â »ó¼ö¸¦ ¹Ù·Î »ç¿ëÇߴµ¥ ÀÌÈÄ ºÐ¼®±â°¡ ´õ ´Ã¾î³¯ ¶§¸¦ ´ëºñÇÏ¿© ºÐ¼®±â °³¼ö¸¦ ¸ÅÅ©·Î·Î Á¤ÀÇÇÑ´Ù. Parse.h ¼±µÎ¿¡ ´ÙÀ½ ¸ÅÅ©·Î¸¦ ÀÛ¼ºÇÏ°í ÇöÀç °³¼öÀÎ 6À¸·Î Á¤ÀÇÇÑ´Ù.

 

#define PARSENUM 6

 

SOption ±¸Á¶Ã¼ÀÇ ºÐ¼®±â Á¤º¸¸¦ È®ÀåÇÑ´Ù. Option.h Çì´õ ÆÄÀÏÀ» ¿­¾î arExt ¹è¿­ÀÇ Å©±â¸¦ »ó¼ö 4¿¡¼­ 6À¸·Î ´Ã¸°´Ù.

 

struct SOption

{

     ....

     TCHAR arExt[PARSENUM][250];

     SParseStyle arStyle[PARSENUM][32];

 

±¸Çö ÆÄÀÏÀÇ Init¿¡¼­ ºÐ¼®±âº°·Î ÇÒ´çµÇ´Â È®ÀåÀÚ¸¦ ÃʱâÈ­ÇÑ´Ù. ÀÚ¹Ù³ª C#À̳ª ¼Ò½º ÆÄÀϸíÀÇ È®ÀåÀÚ°¡ Çϳª¾¿¹Û¿¡ ¾ø¾î¼­ °£´ÜÇÏ´Ù.

 

void SOption::Init()

{

     ....

     lstrcpy(arExt[0],"");

     lstrcpy(arExt[1],"c;cpp;h;hpp");

     lstrcpy(arExt[2],"html;htm;asp;php");

     lstrcpy(arExt[3],"sql");

    lstrcpy(arExt[4],"java");

    lstrcpy(arExt[5],"cs");

     arStyle[0][0].fore=-1;

 

ºÐ¼®±âÀÇ Ãʱ⠽ºÅ¸ÀÏ »ö»ó Á¶»ç¸¦ À§ÇØ ´ÙÀ½ ÇÔ¼ö¸¦ ¼öÁ¤ÇÑ´Ù.

 

void SOption::GetStyleColor()

{

     CParse *Parser;

     int id,i;

 

    for (id=1;id<PARSENUM;id++) {

          switch(id) {

          case 1:

              Parser=new CParseCpp;

              break;

          case 2:

              Parser=new CParseHtml;

              break;

          case 3:

              Parser=new CParseSql;

              break;

        case 4:

           Parser=new CParseJava;

           break;

        case 5:

           Parser=new CParseCS;

           break;

          }

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

              Parser->GetStyleName(i,arStyle[id][i].name);

              Parser->GetStyleColor(i,arStyle[id][i].fore,arStyle[id][i].back);

              if (arStyle[id][i].fore==-2)

                   break;

          }

 

          delete Parser;

     }

}

 

¿ø·¡ÀÇ for¹®Àº for (id=1;id<=3;id++) { ¿ä·¸°Ô µÇ¾î ÀÖ¾ú´Ù. »ó¼ö¸¦ ¾´ °Íµµ ¹Ù¶÷Á÷ÇÏÁö ¾ÊÁö¸¸ <=·Î ºñ±³Çß´Ù´Â °Íµµ ÁÁÁö ¾Ê´Ù. Load, Save¿¡µµ µ¿ÀÏÇÑ ·çÇÁ°¡ Àִµ¥ °°Àº ¹æ½ÄÀ¸·Î ¼öÁ¤ÇÑ´Ù. Dangeun.cppÀÇ SelectParser ÇÔ¼ö¿¡µµ µ¿ÀÏÇÑ ·çÇÁ°¡ ÀÖ´Ù.

 

void SOption::Load(TCHAR *Key)

{

     ....

     for (i=1;i<PARSENUM;i++) {

 

void SOption::Save(TCHAR *Key)

{

     ....

     for (i=1;i<PARSENUM;i++) {

 

void SelectParser(CApiEdit &Ae,TCHAR *path)

{

     ....

     for (i=1;i<PARSENUM;i++) {

     ....

 

´ÙÀ½Àº ´Ù¼Ò À⽺·¯¿î ÀÛ¾÷ÀÌ ÇÊ¿äÇÏ´Ù. ¸Þ´º¿¡ ºÐ¼®±â¸¦ °­Á¦·Î ÁöÁ¤ÇÒ ¼ö ÀÖ´Â ¸í·ÉµéÀÌ Àִµ¥ Ãß°¡µÈ ºÐ¼®±â¿¡ ´ëÇؼ­µµ ´ëÀÀµÇ´Â ¸Þ´º Ç׸ñÀ» ¸¸µé¾î ÁÖ¾î¾ß ÇÑ´Ù. ¸®¼Ò½ºÀÇ ID¸¦ ¼öÁ¤ÇØ¾ß ÇϹǷΠ¼Ö·ç¼ÇÀ» ´Ý¾Æ ³õ°í Á÷Á¢ ÆíÁýÇϵµ·Ï ÇÏÀÚ. resource.h¸¦ ¿­¾î »õ ¸Þ´º Ç׸ñÀÇ ID¸¦ Á¤ÀÇÇÑ´Ù.

 

#define IDM_SYN_NONE                    487

#define IDM_SYN_CPP                     488

#define IDM_SYN_HTML                    489

#define IDM_SYN_SQL                     490

#define IDM_SYN_JAVA                    491

#define IDM_SYN_CS                      492

#define IDM_VIEW_HEXA                   493

#define IDM_VIEW_TOOLBAR                494

 

Áß°£¿¡ µÎ °³ÀÇ Ç׸ñÀÌ ³¢¾î µé¾úÀ¸¹Ç·Î ÀÌÈÄÀÇ Ç׸ñÀº 2¾¿ °ªÀ» Áõ°¡½ÃÄÑ¾ß ÇÑ´Ù. ´ÙÇàÈ÷ ³²´Â ¹øÈ£°¡ µü µÎ°³ ÀÖ¾î 499¹ø±îÁö¸¸ Á¶Á¤ÇÏ¸é µÈ´Ù. ¸¸¾à ¿©À¯°¡ ¾ø´Ù¸é ¸ðµç ID¸¦ ´Ù Á¶Á¤ÇÏ´Â ´ë°ø»ç¸¦ ÇØ¾ß ÇÑ´Ù. rc ÆÄÀÏ¿¡ ¸Þ´º Ç׸ñÀ» Ãß°¡ÇÑ´Ù.

 

BEGIN

    MENUITEM "¾øÀ½(&N)\tAlt+Shift+0",         IDM_SYN_NONE

    MENUITEM "&C/C++\tAlt+Shift+1",         IDM_SYN_CPP

    MENUITEM "&HTML\tAlt+Shift+2",          IDM_SYN_HTML

    MENUITEM "&SQL\tAlt+Shift+3",           IDM_SYN_SQL

    MENUITEM "&Java\tAlt+Shift+4",           IDM_SYN_JAVA

    MENUITEM "C#(&M)\tAlt+Shift+5",           IDM_SYN_CS

END

 

¿©±â±îÁö ÀÛ¾÷ÇÑ ÈÄ ¼Ö·ç¼ÇÀ» ´Ù½Ã ¿­¾î º¸¸é ¸Þ´º Ç׸ñµéÀÌ Àß »ý¼ºµÇ¾î ÀÖÀ» °ÍÀÌ´Ù.

»õ·Î Ãß°¡µÈ ¸Þ´ºÀÇ ¸í·ÉµéÀ» ó¸®ÇÏ°í ¸Þ´º Ç׸ñÀ» °ü¸®ÇÑ´Ù. ±âÁ¸ Äڵ忡 4, 5¹ø ºÐ¼®±â¿¡ ´ëÇÑ Ã³¸®¸¦ Ãß°¡ÇÏ´Â ¾ÆÁÖ ´Ü¼øÇÑ ÄÚµåµéÀÌ´Ù.

 

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

{

     ....

     case IDM_SYN_JAVA:

          pSi->Ae.SetParser(4);

          Option.SetStyleColor(pSi->Ae.GetParser());

          break;

     case IDM_SYN_CS:

          pSi->Ae.SetParser(5);

          Option.SetStyleColor(pSi->Ae.GetParser());

          break;

 

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

{

     ....

          // ¹®¹ý Ç¥½Ã

        for (s=IDM_SYN_NONE;s<=IDM_SYN_CS;s++) DGCHECKMENUITEM(s,FALSE);

          switch (int(pSi->Ae.GetParser()->GetInfo(0))) {

          case 0:DGCHECKMENUITEM(IDM_SYN_NONE,TRUE);break;

          case 1:DGCHECKMENUITEM(IDM_SYN_CPP,TRUE);break;

          case 2:DGCHECKMENUITEM(IDM_SYN_HTML,TRUE);break;

          case 3:DGCHECKMENUITEM(IDM_SYN_SQL,TRUE);break;

        case 4:DGCHECKMENUITEM(IDM_SYN_JAVA,TRUE);break;

        case 5:DGCHECKMENUITEM(IDM_SYN_CS,TRUE);break;

          }

 

´Ã¾î³­ ¸Þ´º¿¡ ´ëÇØ ´ÜÃàÅ° ¸ñ·ÏÀ» Á¦°øÇÑ´Ù. ´ç±ÙÀº À©µµ¿ìÁîÀÇ ¾×¼¿·¯·¹ÀÌÅÍ ±â´É ´ë½Å »ç¿ëÀÚ Á¤ÀÇ °¡´ÉÇÑ °íÀ¯ÀÇ ´ÜÃàÅ° °Ë»ö ¾Ë°í¸®ÁòÀ» »ç¿ëÇϹǷΠ´ÜÃàÅ° ¸ñ·ÏÀ» µû·Î Á¦°øÇØ¾ß ÇÑ´Ù. ShortCut.cpp ÆÄÀÏÀ» ¿­¾î ¹è¿­À» ¼öÁ¤ÇÑ´Ù.

 

SMenuCom arMenuCom[]={

     ....

     {"º¸±â/¹®¹ý °­Á¶/¾øÀ½",IDM_SYN_NONE},

     {"º¸±â/¹®¹ý °­Á¶/C/C++C",IDM_SYN_CPP},

     {"º¸±â/¹®¹ý °­Á¶/HTML",IDM_SYN_HTML},

    {"º¸±â/¹®¹ý °­Á¶/SQL",IDM_SYN_SQL},

    {"º¸±â/¹®¹ý °­Á¶/Java",IDM_SYN_JAVA},

     {"º¸±â/¹®¹ý °­Á¶/C#",IDM_SYN_CS},

 

SShortCut DefaultShortCut[]={

     ....

     {'1',    SC_ALT | SC_SHIFT,        IDM_SYN_CPP,           NULL},

     {'2',    SC_ALT | SC_SHIFT,        IDM_SYN_HTML,              NULL},

     {'3',    SC_ALT | SC_SHIFT,        IDM_SYN_SQL,           NULL},

    {'4',  SC_ALT | SC_SHIFT,      IDM_SYN_JAVA,         NULL},

    {'5',  SC_ALT | SC_SHIFT,      IDM_SYN_CS,            NULL},

     {'0',    SC_ALT | SC_SHIFT,        IDM_SYN_NONE,             NULL},

 

¼³Á¤ ´ëÈ­»óÀÚ¿¡µµ ºÐ¼®±â¸¦ ´Ã¸°´Ù. ÄÞº¸ ¹Ú½º¿¡ »õ·Î Ãß°¡µÈ ºÐ¼®±â¸¦ µî·ÏÇÏ°í ÄÞº¸ ¹Ú½ºÀÇ ¼±ÅÃÀÌ º¯°æµÉ ¶§ ´ëÀÀµÇ´Â Æļ­¸¦ »ý¼ºÇÑ´Ù. µðÆúÆ® ¼Ó¼ºÀ¸·Î µ¹¾Æ°¥ ¶§µµ ´ëÀÀµÇ´Â Æļ­¸¦ »ý¼ºÇØ¾ß ÇÑ´Ù. Áö±Ý±îÁö ÀÛ¾÷Çß´ø ÄÚµåµé°ú °ÅÀÇ À¯»çÇϹǷΠ¼Õ°¡¶ô¸¸ ºÎÁö·±È÷ ³î¸®¸é µÈ´Ù.

 

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

{

     ....

     switch(iMessage) {

     case WM_INITDIALOG:

          hCon=GetDlgItem(hDlg,IDC_PARSER);

          SendMessage(hCon,CB_ADDSTRING,0,(LPARAM)"C/C++");

          SendMessage(hCon,CB_ADDSTRING,0,(LPARAM)"HTML");

          SendMessage(hCon,CB_ADDSTRING,0,(LPARAM)"SQL");

        SendMessage(hCon,CB_ADDSTRING,0,(LPARAM)"Java");

        SendMessage(hCon,CB_ADDSTRING,0,(LPARAM)"C#");

          ....

          case IDC_PARSER:

              ....

                   switch (idx+1) {

                   case 1:

                        Parser=new CParseCpp;

                        break;

                   case 2:

                        Parser=new CParseHtml;

                        break;

                   case 3:

                        Parser=new CParseSql;

                        break;

               case 4:

                   Parser=new CParseJava;

                   break;

               case 5:

                   Parser=new CParseCS;

                   break;

                   }

          ....

          case IDC_BTNDEFSTYLE:

              switch (idx+1) {

              case 1:

                   Parser=new CParseCpp;

                   break;

              case 2:

                   Parser=new CParseHtml;

                   break;

              case 3:

                   Parser=new CParseSql;

                   break;

           case 4:

               Parser=new CParseJava;

               break;

           case 5:

               Parser=new CParseCS;

               break;

              }

 

¿©±â±îÁö ÀÛ¾÷ÇÏ¸é ºÐ¼®±â Ãß°¡°¡ ¿Ï·áµÇ¾ú´Ù. ±×·¯³ª »õ·Î Ãß°¡µÈ ºÐ¼®±âµéÀÌ Á¦´ë·Î µ¿ÀÛÇÏÁö ¾ÊÀ» °ÍÀÌ´Ù. ¿Ö³ÄÇÏ¸é ºÐ¼®±â ¼³Á¤°ªµéÀÇ ÃʱⰪÀº ÃÖÃÊ ½ÇÇà½Ã¿¡ »ý¼ºÀڷκÎÅÍ ±¸ÇØÁö´Âµ¥ »õ ºÐ¼®±âµéÀº »ý¼ºÀÚ°¡ ¾ÆÁ÷ È£ÃâµÇÁö ¾Ê¾Ò±â ¶§¹®ÀÌ´Ù. ¼³Ä¡ ÇØÁ¦ ÈÄ ´Ù½Ã ½ÇÇàÇϸé Á¦´ë·Î ³ªÅ¸³­´Ù. ´ç±ÙÀ» óÀ½ ¼³Ä¡ÇÏ´Â »ç¶÷ÀÇ °æ¿ì¿¡´Â ÀÌ·± ¹®Á¦°¡ ¾ø´Ù.

ÀÌ»óÀ¸·Î ´ç±Ù 1.22 ¾÷±×·¹À̵å ÀÛ¾÷À» ¸¶Ä£´Ù. ¸î°¡Áö ´õ ÇÏ°í ½ÍÀº ÀÛ¾÷ÀÌ ³²¾Æ ÀÖ°í ¾Ë°í ÀÖ´Â ¹ö±×µµ Çϳª ´õ ÀÖ´Ù. ÆÄÀÏ °Ë»ö½Ã UTF-8 ¹®¼­ÀÇ ÇÑ±Û °Ë»öÀÌ Á¦´ë·Î ¾ÈµÈ´Ù. ±×·¯³ª ½Ã°£ °ü°è»ó ´ÙÀ½À¸·Î ¹Ì·ç±â·Î Çß´Ù. ±× ´ÙÀ½ÀÌ ¾ðÁ¦°¡ µÉÁö´Â ¸ð¸£°ÚÁö¸¸ Àû¾îµµ ÀÌ ¹öÀüÀÌ ¸¶Áö¸·Àº ¾Æ´Ò °Í °°´Ù. Â÷ÈÄ À¯´ÏÄÚµå ¹®¼­°¡ Á» ´õ ´ëÁßÈ­µÇ¸é ³»ºÎ Æ÷¸ËÀ» À¯´ÏÄÚµå·Î ÇÏ¿© óÀ½ºÎÅÍ ´Ù½Ã ¸¸µé°Ô µÉÁöµµ ¸ð¸¥´Ù.

ÀÌ ÀÛ¾÷À» Çϴµ¥ ´ë·« ÀÌƲ Á¤µµ°¡ ¼Ò¿äµÇ¾ú´Âµ¥ ¿À·£¸¸¿¡ C ÄÚµùÀ» ÇÏ¿© ²Ï³ª Áñ°Å¿ü´Ù. ¿ª½Ã ºñÁÖ¾ó ½ºÆ©µð¿À´Â ¼Õ¿¡ Âø °¨±â´Â ¸ÀÀÌ ÀÖ´Ù. ¿äÁò ÀÌŬ¸³½º·Î ÀÚ¹Ù ÄÚµùÀ» Çϴµ¥ ±â´ëÇß´ø °Í¸¸Å­ ÀÚ¹Ù°¡ ½â ¸¶À½¿¡ µéÁö ¾ÊÀ¸¸ç ÀÌŬ¸³½ºµµ ºñÁÖ¾ó ½ºÆ©µð¿À¿¡ ºñÇØ ±×´ÙÁö ÁÁ¾Æ º¸ÀÌÁö ¾Ê´Â´Ù. C/C++ÀÌ ¾ð¾î ½ºÆѸ¸À¸·Î º»´Ù¸é ÀÚ¹Ù¿¡ µÚÁöÁö¸¸ ½Ç¹« ¾ð¾î·Î´Â ¾ÆÁ÷±îÁöµµ ÀüÇô ¼Õ»öÀÌ ¾ø´Â ¾ð¾îÀÓÀÌ ºÐ¸íÇÏ´Ù.