´ç±Ù 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++ÀÌ ¾ð¾î ½ºÆѸ¸À¸·Î º»´Ù¸é ÀÚ¹Ù¿¡ µÚÁöÁö¸¸ ½Ç¹« ¾ð¾î·Î´Â ¾ÆÁ÷±îÁöµµ ÀüÇô ¼Õ»öÀÌ ¾ø´Â ¾ð¾îÀÓÀÌ ºÐ¸íÇÏ´Ù.