´ç±Ù 1.0Àº ÅؽºÆ®¸¸À» ´Ù·ç¾ú´Ù. ±×·¯³ª ½ÇÁ¦·Î ÅؽºÆ® ÆÄÀÏÀ̶ó ÇÏ´õ¶óµµ ¹®ÀÚ°¡ ¾Æ´Ñ ´Ù¸¥ Á¤º¸, ¿¹¸¦ µé¾î ÆùÆ®¿¡ ¾ø´Â ±×·¡ÇÈ ¹®ÀÚ³ª ÅؽºÆ® ÆÄÀÏ¿¡´Â ³ª¿Ã ¼ö ¾ø´Â Äڵ尡 ÀÖÀ» °¡´É¼ºÀº Ç×»ó ÀÖ´Ù. °³¹ßÁß¿¡ À߸ø ¸¸µé¾îÁø ÆÄÀÏ, ´Ù¿î·Îµå ¹Þ´Ù°¡ Áß°£¿¡ À߸° ÆÄÀÏ, ÇÏµå µð½ºÅ©ÀÇ ¹°¸®ÀûÀÎ ¿À·ù·Î ÀÎÇØ ¼Õ»óµÈ ÆÄÀÏ µîÀÇ °æ¿ì ¿ÂÀüÇÑ ÅؽºÆ® ÆÄÀÏÀÌ ¾Æ´Ï´Ù. ÀÌ·± ÆÄÀÏÀÌ ±×¸® ÈçÇÏÁö´Â ¾ÊÁö¸¸ ¹®Á¦´Â ÀÌ·± ÆÄÀÏÀ» ¿¸é ´ç±ÙÀÌ ´Ù¿îµÈ´Ù´Â Á¡ÀÌ´Ù.
´ç±ÙÀº Àμ⠰¡´ÉÇÑ ¹®ÀÚ¸¸ ´ã°í ÀÖ°í Áß°£¿¡ ³Î ¹®ÀÚ°¡ ¾øÀ¸¸ç Á¦¾î Äڵ嵵 Á¤È®ÇÏ°Ô ÀÛ¼ºµÇ¾î ÀÖ´Â ÆÄÀϸ¸ ¿ ¼ö ÀÖ´Ù. ÀÌ°ÍÀº 1.0ÀÇ ¹ö±×¶ó±âº¸´Ù´Â ÇÑ°è¶ó°í Ç¥ÇöÇØ¾ß ¿ÇÀ» °ÍÀÌ´Ù. ¹®Á¦°¡ µÈ´Ù´Â °ÍÀº ¾Ë¾ÒÁö¸¸ ÅؽºÆ® ÆíÁý±â´ä°Ô ÆíÁý µ¥ÀÌÅ͸¦ ¿ÂÀüÇÑ ÅؽºÆ®·Î¸¸ ±¹ÇÑÇß´ø °ÍÀÌ´Ù. ±×·¯³ª ÇÁ·Î±×·¥Àº ¾î¶°ÇÑ ±¸Á¶ÀÇ µ¥ÀÌÅÍ°¡ ÀԷµǴõ¶óµµ ÃÖ¼ÒÇÑ Á×Áö´Â ¸»¾Æ¾ß ÇÑ´Ù. ±×°ÍÀÌ Á¦´ë·Î º¸À̴°¡ ¾Æ´Ñ°¡´Â »ó°üÇÒ ÇÊ¿ä¾øÀÌ ÀÖ´Â ±×´ë·Î Ãâ·ÂÇϱ⸸ ÇÏ¸é µÈ´Ù.
ÅؽºÆ® ÆíÁý±â°¡ ´Ù·ç¾î¾ß ÇÒ µ¥ÀÌÅÍ´Â ¹®ÀÚ¿ÀÌ ¾Æ´Ï¶ó ÀÓÀÇÀÇ ÀÌÁø ¹ÙÀÌÆ® ½ºÆ®¸²ÀÌ´Ù. ÀÌ Àå¿¡¼´Â Çí»ç ºä¸¦ À§ÇØ ÀÌÁø µ¥ÀÌÅ͸¦ ÆíÁýÇÒ ¼ö ÀÖµµ·Ï ´ç±ÙÀÇ ±¸Á¶¸¦ ¹Ù²Ü °ÍÀÌ´Ù. NULLÀÌ ¹®¼ÀÇ ³¡ÀÌ ¾Æ´Ï¸ç ¹®¼ Áß°£¿¡ NULLÀº ¹°·Ð ÀÓÀÇÀÇ ¾î¶² ¹ÙÀÌÆ®¶óµµ ³ªÅ¸³¯ ¼ö ÀÖ´Ù. ÇöÀç±îÁö ÀÛ¼ºµÈ ´ç±ÙÀ¸·Î Arches.bmp ÆÄÀÏÀ» ¿¸é "BMv("±îÁö¹Û¿¡ ³ª¿ÀÁö ¾Ê´Âµ¥ ÀÌ ¹®ÀÚ ´ÙÀ½¿¡ 0ÀÌ Àֱ⠶§¹®ÀÌ´Ù.
¹®ÀÚ¿Àº Ç×»ó NULL·Î ³¡³ª±â ¶§¹®¿¡ lstrlen ÇÔ¼ö·Î ¾ðÁ¦µçÁö Á¤È®ÇÑ ±æÀ̸¦ ±¸ÇÒ ¼ö ÀÖ´Ù. ±×·¯³ª ÀÌÁø µ¥ÀÌÅÍ´Â ÀÌ·± °¡Á¤ÀÌ ¾ø±â ¶§¹®¿¡ µ¥ÀÌÅ͸¸ Àü´Þ¹Þ¾Æ¼´Â ±æÀ̸¦ Á¤È®ÇÏ°Ô ¾Ë ¼ö ¾ø´Ù. Áß°£¿¡µµ NULL¹®ÀÚ°¡ ¿Ã ¼ö ÀÖÀ¸¸ç ³¡¿¡ ¹Ýµå½Ã NULLÀÌ ÀÖ´Ù´Â º¸Àåµµ ¾ø´Ù. ±×·¡¼ µ¥ÀÌÅ͸¦ ´Ù·ç´Â ¸ðµç ÇÔ¼ö°¡ µ¥ÀÌÅÍ »Ó¸¸ ¾Æ´Ï¶ó ±æÀÌ¿¡ ´ëÇÑ Á¤º¸¸¦ º°µµ·Î Àü´Þ¹Þ¾Æ¾ß ÇÑ´Ù.
¹®¼ ÀÚü¸¦ ±â¾ïÇÏ´Â buf ¸â¹ö´Â ÇöÀç TCHAR *ÇüÀ¸·Î µÇ¾î Àִµ¥ ÀÓÀÇÀÇ µ¥ÀÌÅ͸¦ ´Ù·ç·Á¸é ¿øÄ¢ÀûÀ¸·Î BYTE * ŸÀÔÀ̾î¾ß ÇÑ´Ù. ±×·¯³ª ±âº» ºäÀÇ ÆíÀǸ¦ À§ÇØ ÀÌ Å¸ÀÔÀº ±×´ë·Î À¯ÁöÇϱâ·Î ÇÑ´Ù. buf¸¦ BYTE *·Î º¯°æÇÒ °æ¿ì ÀÌ ¸â¹ö¸¦ ÀÐ°í ¾²´Â ¸ðµç ÇÔ¼öµéÀ» ¼öÁ¤ÇØ¾ß ÇϹǷΠ½Ã°£ ³¶ºñ°¡ ½ÉÇÏ´Ù. TCHAR *·Î ŸÀÔÀ» À¯ÁöÇ쵂 ÇÊ¿äÇÒ ¶§¸¸ BYTE *·Î ij½ºÆÃÇÒ °ÍÀÌ´Ù. ¾îÂ÷ÇÇ µÑ ´Ù 1¹ÙÀÌÆ® ±æÀ̸¦ °¡Áö°í ¸Þ¸ð¸® °ü¸® ÇÔ¼öµéÀº void *¸¦ Àμö·Î ÃëÇϱ⠶§¹®¿¡ Á¤È®ÇÑ Å¸ÀÔÀ» °¡Áú ÇÊ¿ä±îÁö´Â ¾ø´Ù.
±×·³ Áö±ÝºÎÅÍ buf¸¦ ´Ù·ç´Â ¸ðµç ÇÔ¼ö¸¦ ¼öÁ¤ÇØ º¸ÀÚ. °¡Àå ¸ÕÀú ¼öÁ¤ÇØ¾ß ÇÒ ´ë»óÀº ¹®¼¿¡ µ¥ÀÌÅ͸¦ »ðÀÔ, »èÁ¦ÇÏ´Â Insert, Delete ÇÔ¼öÀÌ´Ù. Insert´Â »ðÀÔ À§Ä¡¿Í ´ë»ó ¹®ÀÚ¿À» Àμö·Î Àü´Þ¹Þ´Âµ¥ ¿©±â¿¡ ±æÀÌ Á¤º¸¸¦ Ãß°¡ÇÏ¿© ÀÌÁø ½ºÆ®¸²µµ »ðÀÔÇϵµ·Ï ¼öÁ¤ÇØ¾ß ÇÑ´Ù. ApiEdit Ŭ·¡½ºÀÇ Insert ÇÔ¼ö¸¦ ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇÑ´Ù. ±¸Çö ÆÄÀÏÀÇ ÇÔ¼ö º»Ã¼»Ó¸¸ ¾Æ´Ï¶ó Çì´õ ÆÄÀÏÀÇ ¿øÇü ¼±¾ðµµ ¹°·Ð ¼öÁ¤ÇØ¾ß ÇÑ´Ù.
void CApiEdit::Insert(int nPos, TCHAR *str, int len, BOOL bRec/*=TRUE*/)
{
int len;
....
needlen=doclen+len;
if (needlen > buflen) {
buflen = needlen+1024;
buf=(TCHAR *)realloc(buf,buflen);
if (buf == NULL) {
}
}
len=lstrlen(str);
if (len==0) return;
movelen=doclen-nPos;
....
Insert ÇÔ¼ö´Â »ðÀÔÇÒ ¹®ÀÚ¿ strÀÇ ±æÀ̸¦ lenÀ̶ó´Â º°µµÀÇ Àμö·Î Àü´Þ¹Þ´Â´Ù. strÀÌ ´õ ÀÌ»ó ¹®ÀÚ¿ÀÌ ¾Æ´Ï¹Ç·Î lstrlenÀ¸·Î »ðÀ﵃ µ¥ÀÌÅÍÀÇ ±æÀ̸¦ ±¸ÇÒ ¼ö ¾ø´Ù. Áö¿ª º¯¼ö lenÀº »èÁ¦ÇÏ°í len=lstrlen(str); ´ëÀÔ¹®µµ »èÁ¦ÇÑ´Ù. ÇÊ¿äÇÑ ¸Þ¸ð¸®¾çÀÎ needlenÀº ÇöÀç ¹®¼ ±æÀÌ doclen¿¡¼ »ðÀ﵃ µ¥ÀÌÅÍÀÇ ±æÀ̸¦ ´õÇÏ¸é µÈ´Ù. ÇÊ¿äÇÑ ¸Þ¸ð¸® °è»ê¿¡ NULL¹®ÀÚºÐÀº Æ÷ÇÔÇÏÁö ¾Ê¾Æµµ µÇ¸ç ¸Þ¸ð¸® À̵¿½Ã¿¡µµ NULL¹®ÀÚ´Â º¸Á¸ÇÒ ÇÊ¿ä°¡ ¾ø´Ù. ±æÀÌ °è»ê¿¡ ±ÍÂú°Ô ºÙ¾î ÀÖ´ø +1Àº ¸ðµÎ Á¦°ÅµÉ °ÍÀÌ´Ù. Delete´Â ¿ø·¡ºÎÅÍ »èÁ¦ÇÒ µ¥ÀÌÅÍÀÇ ±æÀ̸¦ Àü´Þ¹Þ°í ÀÖÀ¸¹Ç·Î ¿øÇü º¯È°¡ ¾ø°í ÀÏ´ÜÀº ±×´ë·Î »ç¿ëÇصµ µÈ´Ù. ´Ù¸¸ À̵¿ ±æÀ̸¦ °è»êÇÒ ¶§ NULL¹®ÀÚ º¸Á¸ÀÇ ÇÊ¿ä°¡ ¾ø¾îÁ³´Ù. +1¸¸ ¾ø¾Ö¸é µÈ´Ù.
void CApiEdit::Delete(int nPos, int nCount, BOOL bRec/*=TRUE*/)
{
....
movelen=doclen-nPos-nCount;
±âº» ºäÀÇ Insert ÇÔ¼öµµ ±æÀ̸¦ Àü´Þ¹Þµµ·Ï ¼öÁ¤ÇÑ´Ù. ºä°¡ ±æÀ̸¦ ¸ÕÀú Àü´Þ¹Þ¾Æ¾ß ÇÁ·¹ÀÓÀÇ Insert¿¡°Ô ±æÀÌ Á¤º¸¸¦ ¾Ë·ÁÁÙ ¼ö ÀÖ´Ù.
void CApiEditText::Insert(int nPos, TCHAR *str, int len, BOOL bRec/*=TRUE*/)
{
int nCrLf=0,i;
int r,c;
int nowPara;
TCHAR *p=str;
if (pFrame->bReadOnly)
return;
pFrame->Insert(nPos,str,len,bRec);
bLineEnd=FALSE;
UpdateLineInfo(nPos,len);
UpdateScrollInfo();
for (i=0;i<len;i++) {
if (*p=='\r')
nCrLf++;
p++;
}
if (nCrLf) {
....
}
pFrame->UpdateViews(this,nPos,len);
}
±âº» ºä´Â ÅؽºÆ® ºäÀ̹ǷΠÅؽºÆ®¸¸ ÀÔ·ÂµÉ °ÍÀÌ°í ±æÀ̸¦ Àü´Þ¹ÞÁö ¾Ê´õ¶óµµ lstrlen ÇÔ¼ö·Î ±æÀ̸¦ Á¶»çÇصµ »ó°ü¾øÀ» °Í °°´Ù. ±×·¯³ª Çí»ç ºä¿¡¼ ÀÌÁø µ¥ÀÌÅ͸¦ ÆíÁýÇϸé UpdateViews ÇÔ¼ö¸¦ ÅëÇØ ÀÌ ÇÔ¼ö°¡ °£Á¢ÀûÀ¸·Î È£ÃâµÉ ¼ö Àֱ⠶§¹®¿¡ ÀÌÁø µ¥ÀÌÅÍÀÇ ±æÀ̸¦ Àü´Þ ¹Þ¾Æ¾ß ÇÑ´Ù. °³Çà ÄÚµåÀÇ °³¼ö¸¦ ¼¿ ¶§µµ while¹®À¸·Î *p°¡ NULLÀÌ ¾Æ´Ñµ¿¾È ·çÇÁ¸¦ µ¹¾Æ¼´Â ¾ÈµÇ¸ç len±æÀ̸¸Å °Á¦·Î ·çÇÁ¸¦ µ¹·Á¾ß ÇÑ´Ù.
µ¥ÀÌÅ͸¦ »ðÀÔÇÏ´Â Insert ÇÔ¼öÀÇ ¿øÇüÀÌ ¹Ù²î¾úÀ¸¹Ç·Î ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÏ´Â ¸ðµç °÷À» ¼öÁ¤ÇØ¾ß ÇÑ´Ù. ¿¹»óÇÏ´Ù½ÃÇÇ ¾ÆÁÖ ¸¹Àºµ¥ Insert·Î °Ë»öÇÏ¸é¼ µÎ ¹ø° ÀμöÀÇ ±æÀ̸¦ ¼¼ ¹ø° Àμö¿¡ ½á ÁÖ¸é µÈ´Ù. ¿¹¸¦ µé¾î OnChar¿¡ Insert(off,szChar); È£Ãâ¹®Àº Insert(off, szChar, lstrlen(szChar));¿Í °°ÀÌ ¼öÁ¤ÇÑ´Ù. lstrlen(µÎ¹ø° Àμö)½ÄÀ» ¼¼ ¹ø° Àμö¿¡ Àû±â¸¸ ÇÏ¸é µÈ´Ù. ¼öÁ¤ ´ë»óÀº ´ëºÎºÐ ApiEditText.cpp¿¡ ÁýÁߵǾî ÀÖ´Ù.
À§Ä¡ |
¿ø·¡ ÄÚµå |
¼öÁ¤µÈ ÄÚµå |
OnChar |
Insert(off,szChar) |
Insert(off,szChar,lstrlen(szChar)) |
OnImeChar |
Insert(off,szChar) |
Insert(off,szChar,lstrlen(szChar)) |
OnImeComposition |
Insert(off,szComp,FALSE) |
Insert(off,szComp,lstrlen(szComp),FALSE) |
IDM_AE_PASTE |
Insert(off,dest) Insert(off,ptr) |
Insert(off,dest,lstrlen(dest)) Insert(off,ptr,lstrlen(ptr)) |
ReplaceText |
Insert(off,to) |
Insert(off,to,lstrlen(to)) |
ProcessIndent |
Insert(off,szIndent)-µÎ°÷ |
Insert(off,szIndent,lstrlen(szIndent)) |
InsertText |
Insert(off,Text) |
Insert(off,Text,lstrlen(Text)) |
CopyChar |
Insert(off,szTemp) |
Insert(off,szTemp,lstrlen(szTemp)) |
Find.cppÀÇ SendOutputToWindow |
pSi->Ae.GetActiveView()->Insert(pSi->Ae.GetOffset(),buf) |
pSi->Ae.GetActiveView()->Insert(pSi-> Ae.GetOffset(),buf,lstrlen(buf)) |
ÀÌÁø ½ºÆ®¸²À» ´Ù·é´Ù´õ´Ï ¿Ö ¶Ç lstrlenÀΰ¡ ÀǾÆÇÒ °ÍÀÌ´Ù. ÅؽºÆ® ºä¿¡¼ Á÷Á¢ ÀԷ¹޴ µ¥ÀÌÅÍ´Â Ç×»ó ¹®ÀÚ¿À̸ç lstrlen ÇÔ¼ö·Î ±æÀ̸¦ Á¶»çÇÒ ¼ö ÀÖ´Ù. OnChar¿¡¼ Å°º¸µå¸¦ ÅëÇØ ÀԷ¹ÞÀº µ¥ÀÌÅͳª °Ë»öâ¿¡¼ Àü¼ÛµÇ´Â °Ë»ö °á°ú´Â ¹®ÀÚ¿ÀÌ ºÐ¸íÇϹǷΠlstrlen ÇÔ¼ö¸¦ ½á¾ß ÇÑ´Ù. InsertText·Î ÀԷ¹޴ µ¥ÀÌÅ͵µ ÇöÀç±îÁö ³¯Â¥, ½Ã°£ °°Àº ¹®ÀÚ¿ »ÓÀÌ¸ç ¾ÕÀ¸·Îµµ ÀÌ ÇÔ¼ö·Î´Â ¹®ÀÚ¿¸¸ »ðÀÔÇϵµ·Ï ÇÒ °ÍÀÌ´Ù. È£½ºÆ®´Â InsertText·Î ÀÌÁø µ¥ÀÌÅ͸¦ »ðÀÔÇؼ´Â ¾ÈµÈ´Ù.
´Ù¸¸ ÇÑ°¡Áö Á» ÀÌ»óÇÑ Á¡ÀÌ Àִµ¥ ºÙ¿© ³Ö±â¿¡ ÀÇÇØ »ðÀԵǴ µ¥ÀÌÅÍ´Â ¹®ÀÚ¿ÀÌ ¾Æ´Ò ¼öµµ ÀÖ´Ù. ¸¸¾à Çí»ç ºä¿¡¼ 0x55 0x00 0x56 ÀÌ·± µ¥ÀÌÅ͸¦ º¹»çÇؼ ÅؽºÆ® ºä¿¡ ºÙ¿© ³Ö´Â´Ù°í ÇÑ´Ù¸é ÀÌ µ¥ÀÌÅÍ´Â ÀÌÁø µ¥ÀÌÅÍÀÌ´Ù. ±×·¯³ª ÅؽºÆ® ÆíÁý±â°¡ ºÙ¿© ³Ö´Â ŸÀÔÀº CF_TEXTÀ̱⠶§¹®¿¡ ³Î Á¾·á ¹®ÀÚ¿À̶ó°í °¡Á¤Çϸç 0x00ÀÌÇϴ Ŭ¸³º¸µå¿¡ ¾ø´Â °ÍÀ¸·Î Ãë±ÞÇصµ ³í¸®ÀûÀ¸·Î Ʋ¸®Áö ¾Ê´Ù.
ÀÌ¿Ü¿¡ CopyString, ChangeCase, ConvertSpaceTab, RemoveExtraSpace, BlockIndent, InsertComment µî¿¡¼ Insert ÇÔ¼ö¸¦ È£ÃâÇϴµ¥ ÀÌ ÇÔ¼öµéÀº ´Ù¸¥ ¹®Á¦¿Í ÇÔ²² ÇØ°áÇØ¾ß ÇÏ´Â °ÍµéÀ̹ǷΠÀá½Ã ÈÄ ¾Æ¿¹ »õ·Î ÀÛ¼ºÇÒ °ÍÀÌ´Ù. FindText¿Í ReplaceTextµµ ÀÌÁø °Ë»ö ¹× ´ëü°¡ °¡´ÉÇϵµ·Ï ¼öÁ¤ÇØ¾ß Çϴµ¥ ÀÏ´Ü ÄÄÆÄÀϸ¸ °¡´ÉÇÏ°Ô ÇØ µÎ¾ú´Ù. ÀÌ µÎ ÇÔ¼ö´Â ½Ç½ÀÀÇ Á¾¹ÝºÎ¿¡¼ ¼öÁ¤ÇÒ °ÍÀÌ´Ù. ´ÙÀ½Àº ¹®¼¸¦ ´Ù·ç´Â ÇÁ·¹ÀÓÀÇ ÇÔ¼öµéÀ» ¼öÁ¤ÇÑ´Ù. ÇÁ·¹ÀÓÀÌ °ü¸®ÇÏ´Â ¹®¼´Â ÀÓÀÇÀÇ ÀÌÁø µ¥ÀÌÅ͸¦ ÀԷ¹ÞÀ» ¼ö ÀÖ¾î¾ß ÇÑ´Ù. Æ÷¸ËÀ» ºÐ¼®ÇÏ´Â AnalyzeFormat ÇÔ¼ö¸¦ ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇÑ´Ù.
DWORD CApiEdit::AnalyzeFormat(TCHAR *Text, int dwSize)
{
int result;
TCHAR *p,*p2;
result=IS_TEXT_UNICODE_UNICODE_MASK | IS_TEXT_UNICODE_REVERSE_MASK;
if (IsTextUnicode(Text,lstrlen(Text),&result)) {
return AE_FORMAT_UNICODE;
}
if (dwSize != -1) {
for (p=Text;p-Text < dwSize;p++) {
if (*p==0) {
return AE_FORMAT_BINARY;
}
}
}
p=strchr(Text,'\r');
if (p==NULL || p-Text >= dwSize) {
p2=strchr(Text,'\n');
if (p2==NULL || p2-Text >= dwSize) {
return AE_FORMAT_WIN;
} else {
return AE_FORMAT_UNIX;
}
} else {
if (p+1-Text < dwSize && *(p+1)=='\n') {
return AE_FORMAT_WIN;
} else {
return AE_FORMAT_MAC;
}
}
}
ÀÌÁø Æ÷¸ËÀÎÁö ÆǺ°ÇÒ ¶§´Â dwSizeÀÌÀü¿¡ NULLÀÌ ÀÖ´ÂÁö º»´Ù. Áß°£¿¡ NULL¹®ÀÚ°¡ ÀÖ´Ù¸é ÀÌ´Â ÀÌÁø Æ÷¸ËÀÌ´Ù. '\r', '\n'À» ãÀ» ¶§µµ strchrÀÌ ¹è¿ ¹üÀ§¸¦ ³Ñ¾î¼¸é ÇØ´ç ¹®ÀÚ°¡ ¾ø´Â °ÍÀ¸·Î °£ÁÖÇÑ´Ù. ConvertFormat ÇÔ¼ö´Â ¿øÇüÀÌ ¹Ù²ï´Ù. ¹®¼°¡ ³Î Á¾·á ¹®ÀÚ¿ÀÌ ¾Æ´Ï±â ¶§¹®¿¡ ¿øº» ¹®¼ÀÇ ±æÀ̸¦ Àμö·Î Àü´Þ¹Þ¾Æ¾ß ÇÑ´Ù.
int CApiEdit::ConvertFormat(DWORD from, DWORD to, TCHAR *src, int srclen, TCHAR *&dest)
{
....
if (to==AE_FORMAT_WIN) {
switch (from) {
case AE_FORMAT_UNIX:
Find='\n';
break;
case AE_FORMAT_MAC:
Find='\r';
break;
}
while (s-src < srclen) {
if (*s==Find) {
*d++='\r';
*d++='\n';
s++;
} else {
*d++=*s++;
}
}
*d=0;
} else {
switch (to) {
case AE_FORMAT_UNIX:
Find='\n';
break;
case AE_FORMAT_MAC:
Find='\r';
break;
}
while (s-src < srclen) {
if (*s=='\r') {
*d++=Find;
s++;
s++;
} else {
*d++=*s++;
}
}
*d=0;
}
return lstrlen(dest);
}
·çÇÁ ³»ºÎ¿¡¼µµ *s°¡ NULLÀÌ ¾Æ´Ñµ¿¾È º¯È¯À» ¹Ýº¹ÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó srclen±æÀ̸¸Å¸¸ º¯È¯ÇÏ¸é µÈ´Ù. º¯È¯ °á°ú ¹öÆÛ¿¡ NULL Á¾·á ¹®ÀÚ¿À» ºÙ¿©¾ß ÇÑ´Ù. º¯È¯ ¿øº»Àº NULL Á¾·á ¹®ÀÚ¿ÀÌ ¾Æ´ÏÁö¸¸ º¯È¯µÈ °á°ú ¹®ÀÚ¿ÀÇ ±æÀ̸¦ Á¶»çÇϱâ À§ÇØ NULL Á¾·á ¹®ÀÚ¿·Î ¸¸µé¾î¾ß ÇÑ´Ù. ´Ü, ÀÌÁø ÆÄÀÏÀÎ °æ¿ì´Â ±×·¸Áö°¡ ¾ÊÀºµ¥ ¾îÂ÷ÇÇ ÀÌÁø ÆÄÀÏ¿¡ ´ëÇؼ´Â ÀÌ ÇÔ¼ö°¡ È£ÃâµÇÁöµµ ¾Ê´Â´Ù. ºäÀÇ IDM_AE_PASTE¿¡ ConvertFormat ÇÔ¼ö È£Ã⠺κÐÀÌ ÀÖÀ¸¹Ç·Î ¼öÁ¤ÇÑ´Ù.
void CApiEditText::OnCommand(HWND hWnd, int id, HWND hwndCtl, UINT codeNotify)
{
case IDM_AE_PASTE:
if (Format != AE_FORMAT_WIN) {
pFrame->ConvertFormat(Format,AE_FORMAT_WIN,ptr,lstrlen(ptr),dest);
Insert(off,dest,lstrlen(dest));
free(dest);
....
¹®¼ Æ÷¸ËÀ» Á¤È®ÇÏ°Ô ÆǺ°Çϱâ À§ÇØ ±æÀÌ Á¤º¸¸¦ Àü´ÞÇØ¾ß ÇÑ´Ù. ÇÁ·¹ÀÓÀÇ SetText ÇÔ¼ö´Â ¿ÏÀüÈ÷ ´Ù½Ã ÀÛ¼ºÇÑ´Ù.
void CApiEdit::SetText(TCHAR *TextBuf, int dwSize)
{
TCHAR *dest;
InitDoc();
dwFormat=AnalyzeFormat(TextBuf, dwSize);
switch (dwFormat) {
case AE_FORMAT_WIN:
case AE_FORMAT_BINARY:
GetActiveView()->Insert(0,TextBuf,dwSize,FALSE);
break;
default:
ConvertFormat(dwFormat,AE_FORMAT_WIN,TextBuf,dwSize,dest);
GetActiveView()->Insert(0,dest,lstrlen(dest),FALSE);
free(dest);
break;
}
}
Æ÷¸Ë º¯È¯À» ÇÏÁö ¾ÊÀ» ¶§´Â Àμö·Î Àü´ÞµÈ dwSize¸¸Å, Áï ÆÄÀÏÀÇ ½ÇÁ¦ ±æÀ̸¸Å¸¸ µ¥ÀÌÅ͸¦ »ðÀÔÇÏ°í Æ÷¸ËÀ» º¯È¯ÇßÀ» ¶§´Â lstrlenÇÔ¼ö·Î º¯È¯ ÈÄÀÇ ±æÀ̸¦ Á¶»çÇÑ´Ù. À¯´Ð½º³ª ¸ÅŲÅä½Ã ¶Ç´Â À¯´ÏÄÚµå Æ÷¸ËÀº À©µµ¿ìÁî Æ÷¸ËÀ¸·Î °Á¦ º¯È¯µÇ¹Ç·Î lstrlenÀ» ½áµµ ¾ÈÀüÇÏ´Ù. GetTextµµ ¼öÁ¤ÇÑ´Ù.
void CApiEdit::GetText(TCHAR *TextBuf, int BufSize , int s/*=-1*/, int e/*=-1*/)
{
TCHAR *dest;
int len;
if (s==-1) {
switch (dwFormat) {
case AE_FORMAT_WIN:
case AE_FORMAT_BINARY:
memcpy(TextBuf,buf,min(doclen,BufSize));
break;
default:
len=ConvertFormat(AE_FORMAT_WIN,dwFormat,buf,doclen,dest);
memcpy(TextBuf,dest,min(len,BufSize));
free(dest);
break;
}
} else {
memcpy(TextBuf,buf+s,min(BufSize,e-s));
}
}
int CApiEdit::GetTextLength()
{
TCHAR *dest;
int len;
switch (dwFormat) {
case AE_FORMAT_WIN:
case AE_FORMAT_BINARY:
len=doclen;
break;
default:
len=ConvertFormat(AE_FORMAT_WIN,dwFormat,buf,doclen,dest);
free(dest);
break;
}
return len;
}
lstrcpy(n) ÇÔ¼ö¸¦ ¾²Áö ¾Ê°í ³Î Á¾·á ¹®ÀÚµµ ºÙÀÏ ÇÊ¿ä°¡ ¾ø´Ù. ´Þ¶ó°í ÇÑ ¸¸Å¸¸ Á¤È®ÇÏ°Ô ÁÖ¸é µÈ´Ù. ÇÊ¿äÇÒ °æ¿ì È£ÃâÃø¿¡¼ ³Î Á¾·á ¹®ÀÚ¸¦ Á÷Á¢ ºÙ¿©¼ »ç¿ëÇØ¾ß ÇÑ´Ù. GetText°¡ ¹öÆÛ ³¡¿¡ NULLÀ» ºÙÀÌÁö ¾ÊÀ¸¹Ç·Î ÀÌ ÇÔ¼ö·Î ¹®¼ÀÇ ÀϺθ¦ Á¶»çÇÏ´Â ¸ðµç ºÎºÐÀ» ¼öÁ¤ÇØ¾ß ÇÑ´Ù.
void OnCommand(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
....
case IDM_SEARCH_WORD:
case IDM_SEARCH_WORDUP:
int nStart;
pSi->Ae.GetSelect(s,e);
if (s==e) {
pView->GetNowWord(pSi->Ae.GetOffset(),s,e);
}
if (e-s > 255 || e-s <= 0) {
break;
}
pSi->Ae.GetText(szTemp,256,s,e);
szTemp[e-s]=0;
arFind[0].Add(szTemp);
szTempÀÇ µÚ¿¡ NULL¹®ÀÚ¸¦ Á÷Á¢ ºÙ¿©¾ß ÇÑ´Ù. 1.0¿¡¼ abs(s-e)·Î ¼±Åà ¿µ¿ªÀÇ ±æÀ̸¦ ±¸Çß¾ú´Âµ¥ ÀϽÃÀûÀÎ ¹®Á¦·Î ÀÎÇØ Àý´ë°ªÀ» ÃëÇß¾ú´Ù. ±×·¯³ª ÀÌÁ¦ GetSelect°¡ s,e¸¦ Á¤±ÔÈÇؼ Á¶»çÇϹǷΠ¼±Åà ¿µ¿ªÀÇ ±æÀÌ´Â e-s·Î °£´ÜÇÏ°Ô ±¸ÇÒ ¼ö ÀÖ´Ù. Find.cppÀÇ ´ÙÀ½ ¼¼ ±ºµ¥µµ ´õ ¼öÁ¤ÇÑ´Ù.
BOOL CALLBACK FindDlgProc(HWND hDlg,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
....
if (Option.bInitFind) {
hActive=(HWND)SendMessage(g_hMDIClient,WM_MDIGETACTIVE,0,NULL);
pSi=(SInfo *)GetWindowLong(hActive,0);
pSi->Ae.GetSelect(s,e);
if (s==e) {
pSi->Ae.GetActiveView()->GetNowWord(pSi->Ae.GetOffset(),s,e);
}
if (e-s <= 255 && e-s > 0) {
pSi->Ae.GetText(szTemp,256,s,e);
szTemp[e-s]=0;
SetDlgItemText(hDlg,IDC_FIND_WHAT,szTemp);
}
BOOL CALLBACK FileFindDlgProc(HWND hDlg,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
....
if (Option.bInitFind) {
hActive=(HWND)SendMessage(g_hMDIClient,WM_MDIGETACTIVE,0,NULL);
if (hActive != NULL) {
pSi=(SInfo *)GetWindowLong(hActive,0);
pSi->Ae.GetSelect(s,e);
if (s==e) {
pSi->Ae.GetActiveView()->GetNowWord(pSi->Ae.GetOffset(),s,e);
}
if (e-s <= 255 && e-s > 0) {
pSi->Ae.GetText(szTemp,256,s,e);
szTemp[e-s]=0;
SetDlgItemText(hDlg,IDC_FIND_WHAT,szTemp);
}
void OpenFileFromOutput(int idx)
{
....
pSi->Ae.GetText(Text,MAX_PATH,toff,toff+lstrlen(LastFIF));
Text[lstrlen(LastFIF)]=0;
¸ðµÎ °°Àº ¹æ½ÄÀÌ´Ù. bInitFind ¿É¼ÇÀÌ ¼±ÅõǾî ÀÖÀ¸¸é ÇöÀç ´Ü¾î¸¦ ÃëÇϴµ¥ À̶§µµ GetText·Î Á¶»çÇÑ ´Ü¾î³¡¿¡ NULL¹®ÀÚ¸¦ Á÷Á¢ ºÙ¿©¾ß ÇÑ´Ù. ¹®¼°¡ ¹Ýµå½Ã NULL·Î ³¡³ªÁö ¾Ê¾Æµµ µÇ¹Ç·Î È£½ºÆ®ÀÇ SaveToFile ÇÔ¼öµµ ¼öÁ¤ÇÑ´Ù.
BOOL SaveToFile(HWND hChild,TCHAR *Path)
{
....
len=pSi->Ae.GetTextLength();
TextBuf=(TCHAR *)malloc(len);
pSi->Ae.GetText(TextBuf,len);
À¯´ÏÄÚµå ¹®ÀÚ¿À» °í·ÁÇÏ¿© 2¹ÙÀÌÆ® ¿©À¯ºÐÀ» ´õ ÇÒ´çÇßÀ¸³ª ÀÌÁ¦ ±×·² ÇÊ¿ä°¡ ¾øÀ¸¹Ç·Î +2¸¦ Á¦°ÅÇÑ´Ù. ¹°·Ð Á¦°Å ¾ÈÇصµ ¹öÆÛ°¡ ³²À» »ÓÀ̹ǷΠº° ÀÌ»óÀº ¾ø´Ù. OpenFileToChild ÇÔ¼öµµ ¼öÁ¤ÇØ¾ß Çϴµ¥ ¾ÆÁ÷Àº À¯´ÏÄÚµå º¯È¯ ¹®Á¦·Î ÀÎÇØ ±âÁ¸ Äڵ尡 ÇÊ¿äÇϹǷΠÀá½Ã ÈÄ ¼öÁ¤ÇÒ °ÍÀÌ´Ù. ±âº»ÀûÀÎ »ðÀÔ, »èÁ¦ ÇÔ¼öÀÇ ¿øÇüÀÌ ¹Ù²î´Ù º¸´Ï ¿©±â Àú±â ¼öÁ¤ÇÒ °÷ÀÌ ¸¹´Ù. ÇöÀç »óÅ¿¡¼µµ ¾ÆÁ÷ ÄÄÆÄÀÏÀº µÇÁö ¾ÊÀ¸¸ç ÀÌ ÀýÀÌ ³¡³¯ ¶§±îÁö ¼öÁ¤À» °è¼ÓÇØ¾ß ÇÑ´Ù.
Ãë¼Ò ·¹Äڵ嵵 ÀÌÁø µ¥ÀÌÅ͸¦ ±â·ÏÇÒ ¼ö ÀÖµµ·Ï ¼öÁ¤ÇÑ´Ù. »ðÀÔ, »èÁ¦µÈ µ¥ÀÌÅÍ°¡ ¹®ÀÚ¿ÀÌ ¾Æ´Ï¹Ç·Î dataÀÇ ±æÀ̸¦ ½Ç½Ã°£À¸·Î Á¶»çÇÒ ¼ö ¾øÀ¸¸ç µû·Î ÀúÀåÇØ¾ß ÇÑ´Ù. ApiEdit.hÀÇ UndoRecord±¸Á¶Ã¼¿¡ µ¥ÀÌÅ͸¦ ±æÀ̸¦ ±â¾ïÇÏ´Â len¸â¹ö¸¦ Ãß°¡ÇÑ´Ù.
struct UndoRecord
{
BYTE action;
BYTE status;
int pos;
int len;
union {
TCHAR *data;
int *dest;
};
int tick;
};
data¿¡ ±â·ÏµÇ´Â µ¥ÀÌÅÍ´Â ¹®ÀÚ¿ÀÌ ¾Æ´Ñ ÀÌÁø ½ºÆ®¸²ÀÌÁö¸¸ ŸÀÔÀº °è¼Ó TCHAR *¸¦ À¯ÁöÇϱâ·Î ÇÑ´Ù. Ãë¼Ò ·¹ÄÚµåÀÇ Å¸ÀÔÀÌ º¯°æµÇ¾úÀ¸¹Ç·Î ÀÌ ·¹Äڵ带 »ç¿ëÇÏ´Â ¸ðµç ÇÔ¼öµéµµ ¼öÁ¤µÇ¾î¾ß ÇÒ °ÍÀÌ´Ù. Ãë¼Ò ·¹Äڵ带 °ü¸®ÇÏ´Â ¼¼ ÇÔ¼ö¸¦ ¼öÁ¤Çϴµ¥ ¿øÇü¿¡ µ¥ÀÌÅÍÀÇ ±æÀ̸¦ Àü´ÞÇÏ´Â lenÀμö°¡ Ãß°¡µÈ´Ù.
void CApiEdit::URInsert(int nPos, TCHAR *str, int len)
{
if (CanRedo()) {
ClearRedo();
} else {
if (pUR[nowur].action==UR_INSERT) {
if (pUR[nowur].pos + pUR[nowur].len==nPos) {
AllocURData(nowur,pUR[nowur].len+len,5);
memcpy(pUR[nowur].data+pUR[nowur].len,str,len);
pUR[nowur].len+=len;
if (str[0]==' ' || str[0]=='\r') {
NextRecord();
}
return;
} else {
NextRecord();
}
} else {
if (pUR[nowur].action != UR_NONE) {
NextRecord();
}
}
}
AllocURData(nowur,len+8,0);
pUR[nowur].action=UR_INSERT;
pUR[nowur].pos=nPos;
pUR[nowur].tick=URtick;
pUR[nowur].len=len;
memcpy(pUR[nowur].data,str,len);
}
void CApiEdit::URDelete(int nPos, TCHAR *str, int len)
{
TCHAR *t;
if (CanRedo()) {
ClearRedo();
} else {
if (pUR[nowur].action==UR_DELETE) {
if (str[0]==' ' || str[0]=='\r') {
NextRecord();
} else {
if (pUR[nowur].pos - len==nPos) {
AllocURData(nowur,pUR[nowur].len+len,5);
t=(TCHAR *)malloc(_msize(pUR[nowur].data));
memcpy(t,str,len);
memcpy(t+len,pUR[nowur].data,pUR[nowur].len);
pUR[nowur].len+=len;
memcpy(pUR[nowur].data,t,pUR[nowur].len);
free(t);
pUR[nowur].pos = nPos;
return;
} else if (pUR[nowur].pos == nPos) {
AllocURData(nowur,pUR[nowur].len+len,5);
memcpy(pUR[nowur].data+pUR[nowur].len,str,len);
pUR[nowur].len+=len;
return;
} else {
NextRecord();
}
}
} else {
if (pUR[nowur].action != UR_NONE) {
NextRecord();
}
}
}
AllocURData(nowur,len+8,0);
pUR[nowur].action=UR_DELETE;
pUR[nowur].pos=nPos;
pUR[nowur].tick=URtick;
pUR[nowur].len=len;
memcpy(pUR[nowur].data,str,len);
}
void CApiEdit::URMove(int nPos, int Dest,TCHAR *str, int len)
{
if (CanRedo()) {
ClearRedo();
} else {
if (pUR[nowur].action != UR_NONE) {
NextRecord();
}
}
AllocURData(nowur,sizeof(int)*2,0);
pUR[nowur].action=UR_MOVE;
pUR[nowur].pos=nPos;
pUR[nowur].tick=URtick;
pUR[nowur].dest[0]=Dest;
pUR[nowur].dest[1]=len;
}
±â·ÏµÇ´Â µ¥ÀÌÅÍÀÇ ±æÀ̸¦ lstrlenÇÔ¼ö·Î ±¸ÇßÀ¸³ª ÀÌÁ¦ ¹®ÀÚ¿ÀÌ ¾Æ´Ï¹Ç·Î Àμö·Î Àü´ÞµÈ lenÀ» ´ë½Å »ç¿ëÇØ¾ß Çϸç NULL¹®ÀÚ¸¦ À§ÇÑ ¿©ºÐÀÇ °ø°£À» ÇÒ´çÇÒ ÇÊ¿äµµ ¾ø´Ù. µ¥ÀÌÅ͸¦ ±â·ÏÇÒ ¶§³ª º´ÇÕÇÒ ¶§µµ lstrcpy ÇÔ¼ö³ª lstrcat ÇÔ¼ö¸¦ »ç¿ëÇÒ ¼ö ¾øÀ¸¸ç memcpy¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù. URMoveÀÇ strÀμö´Â ±æÀ̸¦ ¾Ë±â À§ÇØ Àü´ÞµÇ¾úÀ¸³ª ÇöÀç´Â lenÀÌ µû·Î Àü´ÞµÇ¹Ç·Î »ç½Ç»ó ÇÊ¿ä¾ø´Â ¼ÀÀÌ´Ù. ¾ø¾Ö ¹ö¸®´Â °ÍÀÌ ±ò²ûÇÏÁö¸¸ ´ÙÀ½¿¡ ¶Ç ÇÊ¿äÇØÁúÁöµµ ¸ð¸£¹Ç·Î ÀÏ´ÜÀº ±×³É µÎ±â·Î ÇÑ´Ù. ÀÌ ÇÔ¼öµéÀÇ ¿øÇüÀÌ ¹Ù²î¾úÀ¸¹Ç·Î È£ÃâÇÏ´Â ¸ðµç °÷À» ¼öÁ¤ÇÏ¿© Ãë¼Ò ·¹ÄÚµåÀÇ ±æÀ̸¦ Àü´ÞÇÑ´Ù. ¹®¼¸¦ º¯°æÇÏ´Â °¡Àå ±âº»ÀûÀÎ ÇÔ¼öÀÎ Insert, Delete ÇÔ¼öºÎÅÍ ¼öÁ¤ÇÏÀÚ.
void CApiEdit::Insert(int nPos, TCHAR *str, int len, BOOL bRec/*=TRUE*/)
{
if (bRec) {
URInsert(nPos,str,len);
}
void CApiEdit::Delete(int nPos, int nCount, BOOL bRec/*=TRUE*/)
{
if (bRec) {
t=(TCHAR *)malloc(nCount);
memcpy(t,p,nCount);
URDelete(nPos,t,nCount);
free(t);
}
¿øÄ¢»ó ¹®¼¸¦ ÆíÁýÇÏ´Â ÄÚµå´Â ¸ðµÎ Insert, Delete¸¦ ÅëÇØ¾ß ÇϹǷΠ¿©±â¸¸ ¼öÁ¤ÇÏ¸é µÈ´Ù. ±×·¯³ª ÃÖÀûÈ¿¡ ÀÇÇØ ÅؽºÆ® ºä¿¡¼ Á÷Á¢ Ãë¼Ò ·¹Äڵ带 ÀÛ¼ºÇÏ´Â ºÎºÐÀÌ ÀÖÀ¸¹Ç·Î ¿©±âµµ ¼öÁ¤ÇØ¾ß ÇÑ´Ù.
LRESULT CApiEditText::OnImeChar(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
if (bComp) {
pFrame->URInsert(off-lstrlen(szChar),szChar,lstrlen(szChar));
pFrame->buf[off-2]=szChar[0];
pFrame->buf[off-1]=szChar[1];
void CApiEditText::CopyString(BOOL bCopy, int from, int &to, int len, BOOL bRec/*=TRUE*/)
{
TCHAR *t;
int orito=to;
t=(TCHAR *)malloc(len);
memcpy(t,pFrame->buf+from,len);
Insert(to,t,len,FALSE);
if (bCopy==FALSE) {
if (to > from) {
Delete(from,len,FALSE);
to-=len;
} else {
Delete(from+len,len,FALSE);
}
}
if (bRec) {
if (bCopy) {
pFrame->URInsert(to,t,len);
} else {
pFrame->URMove(from,orito,t,len);
}
}
free(t);
}
OnImeChar´Â ÅؽºÆ®¸¦ Á÷Á¢ ÀÔ·ÂÇϹǷΠlstrlenÀ¸·Î ±æÀ̸¦ Á¶»çÇÒ ¼ö ÀÖÀ¸³ª CopyStringÀº ¿ÜºÎ¿¡¼ °£Á¢ÀûÀ¸·Î È£ÃâµÉ ¼öµµ Àֱ⠶§¹®¿¡ Àμö·Î Àü´ÞµÈ len ±æÀ̸¦ »ç¿ëÇØ¾ß ÇÑ´Ù. Ãë¼Ò ·¹Äڵ带 »ç¿ëÇÏ´Â Undo, Redo ÇÔ¼ö´Â Ãë¼Ò ·¹Äڵ忡 ÀúÀåµÈ ±æÀ̸¦ »ç¿ëÇÑ´Ù.
void CApiEdit::Undo()
{
....
for (;;) {
switch (pUR[nowur].action) {
case UR_INSERT:
pView->Delete(pUR[nowur].pos,pUR[nowur].len,FALSE);
pView->SetOffset(pUR[nowur].pos);
break;
case UR_DELETE:
pView->Insert(pUR[nowur].pos,pUR[nowur].data,pUR[nowur].len,FALSE);
pView->SetOffset(pUR[nowur].pos+pUR[nowur].len);
break;
....
void CApiEdit::Redo()
{
....
for (;;) {
switch (pUR[nowur].action) {
case UR_INSERT:
pView->Insert(pUR[nowur].pos,pUR[nowur].data,pUR[nowur].len,FALSE);
pView->SetOffset(pUR[nowur].pos+pUR[nowur].len);
break;
case UR_DELETE:
pView->Delete(pUR[nowur].pos,pUR[nowur].len,FALSE);
pView->SetOffset(pUR[nowur].pos);
break;
....
¿©±â±îÁö ÀÛ¾÷Çϸé ÀÌÁø µ¥ÀÌÅÍ¿¡ ´ëÇÑ ÆíÁý ±â·ÏÀ» ÀÛ¼ºÇÏ°í °ü¸®ÇÒ ¼ö ÀÖ´Ù.
Çí»ç ÆíÁýÀÌ °¡´ÉÇÏ·Á¸é ÀÓÀÇÀÇ ÀÌÁø ½ºÆ®¸²¿¡ ´ëÇؼ Ç×»ó Á¤È®ÇÏ°Ô Ãâ·ÂÇØ¾ß ÇÑ´Ù. ÁÙ ³¡°ú ¹®¼ ³¡À» ã´Â ¹æ¹ý¿¡ º¯È°¡ ÇÊ¿äÇϹǷΠAeIs ¸ÅÅ©·Î¸¦ ¼öÁ¤ÇÑ´Ù. ¼öÁ¤Çϱâ ÀüÀÇ ¸ÅÅ©·Î´Â ´ÙÀ½°ú °°ÀÌ Á¤ÀǵǾî ÀÖ´Ù.
#define AeIsWhiteSpace(c) ((c)==' ' || (c) == '\t')
#define AeIsLineEnd(c) ((c)=='\r' || (c) == 0)
°ø¹é ¹®ÀÚ¸¦ ã´Â ¸ÅÅ©·Î´Â ±×´ë·Î ¾µ ¼ö ÀÖÁö¸¸ ÁÙ ³¡À» ã´Â ¸ÅÅ©·Î´Â ¼öÁ¤ÀÌ ÇÊ¿äÇÏ´Ù. ¹®ÀÚ c°¡ °³Çà ÄÚµåÀ̰ųª NULLÀÏ ¶§¸¦ ¹®¼ ³¡À¸·Î º¸°í ÁÙ ³¡À¸·Î ÆÇ´ÜÇϴµ¥ ÀÌ °¡Á¤Àº ÀÌÁ¦ Ʋ¸± ¼ö ÀÖÀ¸¹Ç·Î ±æÀ̸¦ ºñ±³ÇØ¾ß ÇÑ´Ù.
#define AeIsWhiteSpace(c) ((c)==' ' || (c) == '\t')
#define AeIsDocEnd(p) ((p)-pFrame->buf == pFrame->doclen)
#define AeIsLineEnd(p) (pFrame->IsEnterCode(p) || AeIsDocEnd(p))
Àü´ÞÇÑ Æ÷ÀÎÅÍÀÇ ¿ÀÇÁ¼ÂÀÌ ¹®¼ ±æÀÌÀÎ doclen°ú ÀÏÄ¡ÇÒ ¶§ ¹®¼ÀÇ ³¡ÀÎÁö ÆÇ´ÜÇÏ´Â AeIsDocEnd ¸ÅÅ©·Î¸¦ »õ·Î ¸¸µé¾ú´Ù. ÁÙ ³¡ÀÎÁö¸¦ ÆÇ´ÜÇÏ´Â ¹æ½Äµµ ´Þ¶óÁö´Âµ¥ CR, LF°¡ ¹Ýµå½Ã ±ÔÄ¢¿¡ ¸Â°Ô ³ªÅ¸³ªÁö ¾Ê±â ¶§¹®¿¡ CR°ú LF°¡ ¼ø¼´ë·Î ³ªÅ¸³ª¾ß¸¸ °³Çà ÄÚµå¶ó°í ÆÇ´ÜÇÒ ¼ö ÀÖ´Ù. CR¸¸ Àִٰųª LF CR¼øÀ¸·Î µÇ¾î ÀÖÀ¸¸é °³Çà ÄÚµå·Î ÀÎÁ¤µÇÁö ¾Ê´Â´Ù. ¹®¼ ³¡Àº ¿©ÀüÈ÷ ÁÙ ³¡À¸·Î ÀÎÁ¤µÇ¹Ç·Î AeIsDocEnd ¸ÅÅ©·Î¸¦ È£ÃâÇÑ´Ù.
ÁöÁ¤ÇÑ À§Ä¡°¡ °³Çà ÄÚµåÀÎÁö¸¦ ÆÇ´ÜÇÏ´Â ¹æ¹ýÀÌ º¹ÀâÇϹǷΠ¸ÅÅ©·Î ¼öÁØ¿¡¼ ÆÇ´ÜÇϱâ´Â ¾î·Æ´Ù. ±×·¡¼ °³Çà Äڵ带 ÆÇ´ÜÇÏ´Â ¼¼ °³ÀÇ ÇÔ¼ö¸¦ Ãß°¡ÇÑ´Ù. ¹®¼¸¦ ´Ù·ç´Â ÇÔ¼öµéÀ̹ǷΠ´ç¿¬È÷ ÇÁ·¹ÀÓÀÇ ¸â¹ö°¡ µÇ¾î¾ß ÇÑ´Ù. ¿©·¯ °¡Áö ¹æ¹ýÀ¸·Î °³Çà Äڵ带 ÆǺ°ÇÒ ¼ö ÀÖµµ·Ï Áߺ¹ Á¤ÀÇÇß´Ù.
BOOL CApiEdit::IsEnterCode(int nPos)
{
return IsEnterCode(buf,doclen,buf+nPos);
}
BOOL CApiEdit::IsEnterCode(TCHAR *p)
{
return IsEnterCode(buf,doclen,p);
}
BOOL CApiEdit::IsEnterCode(TCHAR *tbuf,int len,TCHAR *p)
{
return (*p=='\r' && p-tbuf+1 < len && p[1]=='\n');
}
¼¼¹ø° ÇÔ¼ö´Â ±æÀÌ lenÀÇ ¹öÆÛ tbuf¿¡ ¼ÓÇØ ÀÖ´Â Æ÷ÀÎÅÍ p°¡ °³Çà ÄÚµåÀÎÁö °Ë»çÇÑ´Ù. Á¤È®ÇÑ °Ë»ç¸¦ À§ÇØ ¹öÆÛÀÇ ±æÀ̵µ °°ÀÌ Àü´ÞÇØ¾ß ÇÑ´Ù. °Ë»çÇÏ·Á´Â °÷ÀÇ À§Ä¡°¡ lenº¸´Ù ÃÖ¼ÒÇÑ µÎ Ä ´õ ¾Õ¿¡ ÀÖ¾î¾ß ÇÑ´Ù. len-1ÀÚ¸®¿¡ ±×·¯´Ï±î ¹öÆÛ ³¡¿¡ CRÀÌ ÀÖ°í len¿¡ ¿ì¿¬È÷ LF°¡ ÀÖ´Â °æ¿ì´Â °³Çà Äڵ尡 ¾Æ´Ï´Ù. À̶§ÀÇ LF´Â ¹öÆÛÀÇ ÀϺΰ¡ ¾Æ´Ï¹Ç·Î ¾Æ¿¹ °è»ê¿¡ Æ÷ÇÔ½ÃÅ°Áö ¸»¾Æ¾ß ÇÑ´Ù. ³ª¸ÓÁö µÎ ÇÔ¼ö´Â ¼¼ ¹ø° ÇÔ¼ö¸¦ È£ÃâÇϴµ¥ ¹öÆÛ´Â bufÀÌ°í ÀÌ ¹öÆÛÀÇ ±æÀÌ´Â doclenÀ¸·Î °íÁ¤µÇ¾î ÀÖ´Ù. ¿ÀÇÁ¼ÂÀ¸·Îµµ Á¶»çÇÒ ¼ö ÀÖ°í Æ÷ÀÎÅͷεµ Á¶»çÇÒ ¼ö ÀÖ´Ù.
°³Çà Äڵ带 ÆÇ´ÜÇϴµ¥ ÇÑ ¹®Àڷθ¸À¸·Î´Â ºÎÁ·ÇÏ¸ç µÚÀÇ ¹®ÀÚ±îÁö °°ÀÌ ºÁ¾ß Çϱ⠶§¹®¿¡ AeIsLineEndÀÇ Àμö°¡ ¹®ÀÚ¿¡¼ Æ÷ÀÎÅÍ·Î º¯°æµÈ °ÍÀÌ´Ù. ¸ÅÅ©·ÎÀÇ ¿øÇüÀÌ º¯°æµÇ¾úÀ¸¹Ç·Î °ü·Ã Äڵ嵵 ¸ðµÎ ¼öÁ¤ÇØ¾ß ÇÑ´Ù. ApiEditText.cpp¿¡ ´Ù¼¸ ±ºµ¥°¡ ÀÖ´Ù.
À§Ä¡ |
¿ø·¡ ÄÚµå |
¼öÁ¤µÈ ÄÚµå |
VK_HOME |
AeIsLineEnd(pFrame->buf[toff]) |
AeIsLineEnd(pFrame->buf+toff) |
ProcessIndent |
AeIsLineEnd(pFrame->buf[toff]) |
AeIsLineEnd(pFrame->buf+toff) |
CopyChar |
AeIsLineEnd(pFrame->buf[toff]) |
AeIsLineEnd(pFrame->buf+toff) |
IsParaEmpty |
AeIsLineEnd(*p) |
AeIsLineEnd(p) |
InsertComment |
AeIsLineEnd(*s) |
AeIsLineEnd(s) |
Á¤·ÄÀÇ ÇÙ½É ÇÔ¼öÀÎ GetLine¸¦ ¼öÁ¤ÇÏ¿© NULLÀ» ¹®¼ ³¡À¸·Î º¸Áö ¾Ê°í AeIsDocEnd ÇÔ¼ö¸¦ È£ÃâÇÏ°í °³Çà ÄÚµå Á¡°Ë ·çƾµµ IsEnterCode ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù.
void CApiEditText::GetLine(int Line, int &s, int &e)
{
....
if (Line == 0) {
p=pFrame->buf;
s=0;
} else {
p=pFrame->buf+pLine[Line-1].End;
if (AeIsDocEnd(p)) {
s=-1;
e=-1;
return;
}
if (pFrame->IsEnterCode(p)) {
p+=2;
}
s=p-pFrame->buf;
}
if (nWrap == 0 && RightWrap == 0) {
while
(!AeIsLineEnd(p)) {
if
(pFrame->IsDBCS(p-pFrame->buf)) {
p++;
}
p++;
}
} else {
for (acwidth=MarginWidth,Head=p;;) {
....
if
(AeIsLineEnd(p)) {
EndPos=p;
break;
}
....
ÀÚµ¿ °³Çà »óÅ°¡ ¾Æ´Ï´õ¶óµµ DBCS Á¡°ËÀ» ÇÏ¸é¼ °³Çà Äڵ带 ã¾Æ¾ß ÇÑ´Ù. ±×·¸Áö ¾Ê°í ¹«Á¶°Ç ¹ÙÀÌÆ® Á¡°Ë¸¸ ÇÒ °æ¿ì B0 0D 0A´Â °³Çà Äڵ尡 ¾Æ´Ô¿¡µµ °³Çà ÄÚµå·Î À߸ø Çؼ®ÇÏ°Ô µÈ´Ù. ÀÌ ÄÚµå´Â B0 0D°¡ ÇÑ ¹®ÀÚ·Î Àνĵǰí 0A°¡ ¶Ç Çѹ®ÀÚ·Î ÀνĵǾî¾ß ÇÑ´Ù. Àμâ¿ëÀÇ GetLineµµ ¹°·Ð ¼öÁ¤ÇØ¾ß ÇÑ´Ù. ¼öÁ¤ÇÏ´Â ¹æ¹ýÀº µ¿ÀÏÇÏ´Ù.
°³Çà Äڵ带 °ËÃâÇÏ´Â ¸ðµç °÷À» ¼öÁ¤ÇÑ´Ù. ¿ÀÇÁ¼Â À§Ä¡ÀÇ ¹®ÀÚ ÄÚµå¿Í '\r'À» Á÷Á¢ ºñ±³ÇÏ´Â ¹æ½ÄÀ» »ç¿ëÇߴµ¥ '\r'¸¸À¸·Î °³Çà ÄÚµå¶ó°í º¼ ¼ö ¾ø°Ô µÇ¾ú´Ù. ¼öÁ¤ÇÒ °÷ÀÌ Á» ¸¹´Ù. ¸ÕÀú ÇÁ·¹ÀÓ¿¡ 4±ºµ¥ ÀÖ´Ù.
À§Ä¡ |
¿ø·¡ ÄÚµå |
¼öÁ¤µÈ ÄÚµå |
IsDBCS |
buf[nPos]=='\r' && buf[nPos+1]=='\n' |
IsEnterCode(nPos) |
GetPrevOff |
buf[n]=='\r' && buf[n+1]=='\n' |
IsEnterCode(n) |
FindParaStart |
buf[n]=='\r' && buf[n+1]=='\n' |
IsEnterCode(n) |
IncludeEnter |
buf[nPos]=='\r' |
IsEnterCode(nPos) |
nPosÀ§Ä¡°¡ '\r'ÀÌ°í ±× ´ÙÀ½ À§Ä¡°¡ '\n'ÀÏ ¶§¸¦ °³Çà ÄÚµå·Î ÆÇ´ÜÇߴµ¥ º°µµÀÇ ¸ÅÅ©·Î ÇÔ¼ö°¡ ¸¸µé¾îÁ® ÀÖÀ¸¹Ç·Î ÀÌ ÇÔ¼ö¸¦ ¾²µµ·Ï ÇÏÀÚ. ´ÙÀ½Àº ºäÀÇ ÇÔ¼ö¸¦ ¼öÁ¤ÇÑ´Ù.
À§Ä¡ |
¿ø·¡ÄÚµå |
¼öÁ¤µÈ ÄÚµå |
VK_LEFT |
pFrame->buf[pFrame->GetPrevOff(off)]=='\r' |
pFrame->IsEnterCode(pFrame->GetPrevOff(off)) |
VK_RIGHT |
pFrame->buf[pLine[r].End]=='\r' pFrame->buf[off]!='\r' |
pFrame->IsEnterCode(pLine[r].End) !pFrame->IsEnterCode(off) |
VK_END |
pFrame->buf[off]]!='\r' && pFrame->buf[off]!=0 |
!AeIsLineEnd(pFrame->buf+off) |
OnChar |
pFrame->buf[off] != '\r' |
!pFrame->IsEnterCode(off) |
OnImeChar |
pFrame->buf[off] != '\r' |
!pFrame->IsEnterCode(off) |
OnImeComposition |
pFrame->buf[off] != '\r' |
!pFrame->IsEnterCode(off) |
SetCaret |
pFrame->buf[toff] == '\r' |
pFrame->IsEnterCode(toff) |
Insert |
*p=='\r' |
pFrame->IsEnterCode(str,len,p) |
Delete |
p[i]=='\r' |
pFrame->IsEnterCode(p+i) |
GetRCFromOff |
pFrame->buf[pLine[r].End] == 0 || pFrame->buf[pLine[r].End] == '\r' |
AeIsLineEnd(pFrame->buf+pLine[r].End) |
GetXPosOnLine |
pFrame->buf[p-pFrame->buf]!='\r' && pFrame->buf[p-pFrame->buf]!=0 |
!AeIsLineEnd(p) |
DrawSegment |
pFrame->buf[SegOff+len] == '\r' |
pFrame->IsEnterCode(SegOff+len) |
GetOffFromXY |
pFrame->buf[p-pFrame->buf]!='\r' && pFrame->buf[p-pFrame->buf]!=0 |
!AeIsLineEnd(p) |
UpdateLineInfo |
pFrame->buf[e]=='\r' |
pFrame->IsEnterCode(e) |
BeginPrint |
pFrame->buf[e]=='\r' |
pFrame->IsEnterCode(e) |
ƯÁ¤ À§Ä¡ÀÇ Äڵ带 '\r' ¹®ÀÚ »ó¼ö¿Í ºñ±³ÇÏ´Â °ÅÀÇ ¸ðµç °÷À» IsEnterCode ¶Ç´Â AeIsLineEnd È£Ãâ·Î ¹Ù²ã¾ß ÇÑ´Ù. ´Ü '\r'°ú Á÷Á¢ ºñ±³ÇÏ´Â Äڵ带 ±×´ë·Î »ç¿ëÇØ¾ß ÇÏ´Â °÷µµ Àִµ¥ OnChar¿¡¼ ÀÔ·ÂµÈ Å°°¡ EnterÅ°ÀÎÁö °Ë»çÇÒ ¶§´Â ¿©ÀüÈ÷ '\r'ÀÌ »ç¿ëµÈ´Ù. À̶§ »ç¿ëµÈ '\r'Àº ¹®ÀÚ Äڵ尡 ¾Æ´Ï¶ó Å° ÄÚµåÀ̹ǷΠIsEnterCode·Î ¹Ù²ã¼´Â ¾ÈµÈ´Ù. InsertÀÇ °æ¿ì ¹®¼»ó¿¡ ÀÖÁö ¾ÊÀº µ¥ÀÌÅ͸¦ °Ë»çÇϹǷΠ¼¼ ¹ø° IsEnterCode ÇÔ¼ö¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù. GetDocInfo´Â ¸¹ÀÌ °íÃÄ¾ß ÇÑ´Ù.
int CApiEditText::GetDocInfo(int type)
{
int i;
int count=0;
int han=0;
TCHAR *p=pFrame->buf;
switch (type) {
case AE_DOC_TOTALPARA:
return pLine[TotalLine-1].nPara;
case AE_DOC_WORD:
for (;!AeIsDocEnd(p);) {
if
(AeIsWhiteSpace(*p) || pFrame->IsEnterCode(p)) {
while
((AeIsWhiteSpace(*p) || *p=='\r' || *p=='\n') && !AeIsDocEnd(p))
p++;
} else {
count++;
while
(!AeIsWhiteSpace(*p) && *p!='\r' && *p!='\n' &&
!AeIsDocEnd(p))
p++;
}
}
break;
case AE_DOC_EXSPACESIZE:
for (;!AeIsDocEnd(p);p++) {
if (!(AeIsWhiteSpace(*p) || *p=='\r' || *p=='\n')) {
count++;
}
}
break;
case AE_DOC_CHAR:
case AE_DOC_HAN:
for (;!AeIsDocEnd(p);p++) {
....
¿©±â¼ °³Çà Äڵ尡 ¾Æ´Ñ CR, LF´Â ´Ü¼øÇÑ ¹®ÀÚ·Î °è»êÇÏ¿´´Ù.
°³Çà ÄÚµå, ¹®¼ ³¡ µîÀ» Á÷Á¢ ´Ù·ç´Â ÆíÁý °ü·Ã ÇÔ¼öµéÀ» ¼öÁ¤ÇÑ´Ù. ÀÌ ÇÔ¼öµéÀº ¹öÆÛ¸¦ Á÷Á¢ ¼öÁ¤Çϱ⠶§¹®¿¡ ¸¹Àº ºÎºÐÀ» °íÃÄ¾ß ÇÑ´Ù. RemoveExtraSpace ÇÔ¼ö´Â ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇÑ´Ù.
void CApiEditText::RemoveExtraSpace()
{
int SelFirst, SelSecond;
TCHAR *src,*dest;
TCHAR *s,*d;
int len;
int nDiff;
if (SelStart==SelEnd) {
SelFirst=0;
SelSecond=pFrame->doclen;
} else {
SelFirst=min(SelStart,SelEnd);
SelSecond=max(SelStart,SelEnd);
}
len=SelSecond-SelFirst;
src=(TCHAR *)malloc(len);
dest=(TCHAR *)malloc(len);
memcpy(src,pFrame->buf+SelFirst,len);
s=src+len-1;
d=dest+len-1;
nDiff=0;
for (;;) {
*d=*s;
if (s==src)
break;
d--;
s--;
if (pFrame->IsEnterCode(src,len,s+1)) {
while (AeIsWhiteSpace(*s) && s!=src) {
s--;
nDiff--;
}
}
}
if (nDiff) {
pFrame->StartUndoGroup();
Delete(SelFirst,len);
Insert(SelFirst,d,len+nDiff);
pFrame->EndUndoGroup();
....
¹®ÀÚ¿À» ´Ù·ç´Â °ÍÀÌ ¾Æ´Ï¹Ç·Î NULL ¹®ÀÚºÐÀº ÇÒ´ç·®¿¡¼ Á¦¿ÜÇÏ°í lstrcpynÀ¸·Î ¿øº» ¹®ÀÚ¿À» º¹»çÇÏ´Â ´ë½Å memcpy·Î º¹»çÇß´Ù. º¹»ç ½ÃÀÛ À§Ä¡µµ Á¦ÀÏ ³¡ ¹®ÀÚÀÎ src+len-1À¸·Î ¼³Á¤ÇÏ°í °³Çà ÄÚµåÀÎÁö °Ë»çÇÏ´Â Äڵ嵵 IsEnterCode ÇÔ¼ö·Î ¼öÁ¤ÇÑ´Ù. ³ª¸ÓÁö ÆíÁý ÇÔ¼öµéµµ ºñ½ÁÇÑ ¹æ½ÄÀ¸·Î ¼öÁ¤ÇÑ´Ù. BlockIndent ÇÔ¼ö´Â ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇÑ´Ù.
void CApiEditText::BlockIndent(BOOL bUnindent)
{
....
src=(TCHAR *)malloc(ed-st);
dest=(TCHAR *)malloc(ed-st+(pr2-pr1+1)*TabWidth);
memcpy(src,pFrame->buf+st,ed-st);
s=src;
d=dest;
nDiff=0;
if (!bUnindent) {
for (;;) {
if (!IsParaEmpty(s)) {
MakeIndentString(1,d,4096);
d=d+lstrlen(d);
nDiff++;
}
while
(!pFrame->IsEnterCode(src,ed-st,s) && s != src+ed-st) {
*d++=*s++;
}
if (s==src+ed-st) {
*d=*s;
break;
} else {
*d++=*s++;
*d++=*s++;
}
}
if (SelFirst!=st) {
SelFirst+=(pFrame->bSpaceForTab ? TabWidth:1);
}
SelSecond+=(pFrame->bSpaceForTab ? TabWidth:1)*nDiff;
} else {
for (;;) {
....
while
(!pFrame->IsEnterCode(src,ed-st,s) && s != src+ed-st) {
*d++=*s++;
}
if (s==src+ed-st) {
*d=*s;
break;
} else {
*d++=*s++;
*d++=*s++;
}
}
SelSecond-=nDiff;
}
pFrame->StartUndoGroup();
Delete(st,ed-st);
Insert(st,dest,d-dest);
pFrame->EndUndoGroup();
....
¹öÆÛÀÇ µ¥ÀÌÅ͸¦ Á¡°ËÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó Àӽà ¹öÆÛ¸¦ ´ë»óÀ¸·Î ÇϹǷΠAeIsLineEnd ¸ÅÅ©·Î¸¦ ¾µ ¼ö ¾ø´Ù. InsertCommentµµ °ÅÀÇ À¯»çÇÏ´Ù
void CApiEditText::InsertComment(BOOL bUnComment)
{
....
src=(TCHAR *)malloc(ed-st);
dest=(TCHAR *)malloc(ed-st+(pr2-pr1+1)*clen);
memcpy(src,pFrame->buf+st,ed-st);
s=src;
d=dest;
nDiff=0;
if (!bUnComment) {
for (;;) {
for (i=0;i<clen;i++) {
*d++=szComment[i];
nDiff++;
}
while
(!pFrame->IsEnterCode(src,ed-st,s) && s != src+ed-st) {
*d++=*s++;
}
if (s==src+ed-st) {
*d=*s;
break;
} else {
*d++=*s++;
*d++=*s++;
}
}
if (SelFirst!=st) {
SelFirst+=clen;
}
SelSecond+=nDiff;
} else {
for (;;) {
if (_strnicmp(s,szComment,clen)==0) {
s+=clen;
nDiff-=clen;
if (bFirstPara) {
SelFirst+=nDiff;
SelFirst=max(SelFirst,st);
bFirstPara=FALSE;
}
}
while
(!pFrame->IsEnterCode(src,ed-st,s) && s != src+ed-st) {
*d++=*s++;
}
if (s==src+ed-st) {
*d=*s;
break;
} else {
*d++=*s++;
*d++=*s++;
}
}
SelSecond+=nDiff;
}
pFrame->StartUndoGroup();
Delete(st,ed-st);
Insert(st,dest,d-dest);
pFrame->EndUndoGroup();
ChangeCase ÇÔ¼ö´Â ¸¹ÀÌ ¼öÁ¤µÇ¾î¾ß ÇϹǷΠ¿ÏÀüÈ÷ ´Ù½Ã ÀÛ¼ºÇÏ´Â °ÍÀÌ ´õ ÁÁ´Ù.
void CApiEditText::ChangeCase(int action)
{
int SelFirst, SelSecond;
int len;
TCHAR *tbuf;
TCHAR *p;
int toff;
if (SelStart == SelEnd) {
switch (action) {
case 0:
case 1:
case 2:
if (AeIsDocEnd(pFrame->buf+off)) {
return;
}
SelFirst=SelSecond=off;
if (pFrame->IsDBCS(off)) {
len=2;
} else {
len=1;
}
break;
case 3:
GetNowWord(off,SelFirst,SelSecond);
len=SelSecond-SelFirst;
break;
case 4:
return;
}
} else {
SelFirst=min(SelStart,SelEnd);
SelSecond=max(SelStart,SelEnd);
len=SelSecond-SelFirst;
}
tbuf=(TCHAR *)malloc(len);
memcpy(tbuf,pFrame->buf+SelFirst,len);
switch (action) {
case 0:
p=tbuf;
while (p-tbuf < len) {
if (IsCharLower(*p)) {
*p-=0x20;
}
p++;
}
break;
case 1:
p=tbuf;
while (p-tbuf < len) {
if (IsCharUpper(*p)) {
*p+=0x20;
}
p++;
}
break;
case 2:
p=tbuf;
while (p-tbuf < len) {
if (IsCharUpper(*p)) {
*p+=0x20;
} else if (IsCharLower(*p)) {
*p-=0x20;
}
p++;
}
break;
case 3:
p=tbuf;
if (IsCharLower(*p)) {
*p-=0x20;
}
p++;
while (p-tbuf < len) {
if (IsDelimiter(SelFirst+(p-tbuf)-1)) {
if (IsCharLower(*p)) {
*p-=0x20;
}
} else {
if (IsCharUpper(*p)) {
*p+=0x20;
}
}
p++;
}
break;
case 4:
p=tbuf;
toff=SelFirst;
while (AeIsWhiteSpace(pFrame->buf[toff]) && toff > 0)
toff--;
if (toff==0 || pFrame->IsEnterCode(toff-1) || pFrame->buf[toff]=='.') {
if (IsCharLower(*p)) {
*p-=0x20;
}
} else {
if (IsCharUpper(*p)) {
*p+=0x20;
}
}
p++;
while (p-tbuf < len) {
if (*p=='.' || pFrame->IsEnterCode(tbuf,len,p-1)) {
p++;
while (AeIsWhiteSpace(*p) && p-tbuf < len)
p++;
if (p-tbuf == len)
break;
if (IsCharLower(*p)) {
*p-=0x20;
}
} else {
if (IsCharUpper(*p)) {
*p+=0x20;
}
}
p++;
}
break;
}
pFrame->StartUndoGroup();
Delete(SelFirst,len);
Insert(SelFirst,tbuf,len);
pFrame->EndUndoGroup();
if (SelStart==SelEnd && action < 3) {
off=pFrame->GetNextOff(off);
}
free(tbuf);
Invalidate(SelFirst);
SetCaret();
}
ConvertSpaceTab ÇÔ¼öµµ ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇÑ´Ù.
void CApiEditText::ConvertSpaceTab(BOOL bToSpace)
{
....
src=(TCHAR *)malloc(len);
memcpy(src,pFrame->buf+SelFirst,len);
for (s=src,i=0;s-src != len;s++) {
if (*s=='\t')
i++;
}
dest=(TCHAR *)malloc(len+i*(TabWidth-1));
s=src;
d=dest;
nDiff=0;
if (bToSpace) {
while (s-src < len) {
if (*s=='\t') {
for (i=0;i<TabWidth;i++) {
*d++=' ';
}
nDiff+=(TabWidth-1);
s++;
} else {
*d++=*s++;
}
}
} else {
while (s-src < len) {
bFind=TRUE;
for (i=0;i<TabWidth;i++) {
if (s[i]==0 || s[i]!=' ') {
bFind=FALSE;
break;
}
}
if (bFind) {
*d++='\t';
s+=TabWidth;
nDiff+=(-TabWidth+1);
} else {
*d++=*s++;
}
}
}
*d=*s;
SelSecond += nDiff;
pFrame->StartUndoGroup();
Delete(SelFirst,len);
Insert(SelFirst,dest,d-dest);
....
ÆíÁý °ü·Ã ÇÔ¼öµéÀ» ¸ðµÎ ¼öÁ¤Çß´Ù. ¿©±â±îÁö ÀÛ¾÷ÇÑ ÈÄ ÄÄÆÄÀÏÇϸé ÀÏ´ÜÀº ¿¡·¯¾øÀÌ Àß ÄÄÆÄÀ쵃 °ÍÀÌ´Ù. ¸¸¾à ÀÌ »óÅ¿¡¼ ÄÄÆÄÀÏ ¿¡·¯°¡ ¹ß»ýÇÑ´Ù¸é ÀÛ¾÷ °úÁ¤ Áß¿¡ ÀϺθ¦ ´©¶ôÇ߰ųª À߸ø ¼öÁ¤ÇÑ °æ¿ìÀ̹ǷΠ¿¡·¯ ¸Þ½ÃÁö ³»¿ë´ë·Î ¼öÁ¤ÇÑ´Ù.
¹ÝÂÊ DBCS¶õ ÇÑ±Û 2¹ÙÀÌÆ®ÀÇ ¾ÕÂÊ 1¹ÙÀÌÆ®¸¸ ¹®¼ ³¡¿¡ °É·Á ÀÖ´Â ºñÁ¤»óÀûÀÎ ÄÚµåÀÌ´Ù. ¹®¼ ³¡¿¡¼¸¸ ³ªÅ¸³¯ ¼ö ÀÖÀ¸¸ç Áß°£¿¡´Â Àý´ë·Î ³ªÅ¸³¯ ¼ö ¾ø´Ù. ¿¹¸¦ µé¾î ´ÙÀ½ ´Ù¼¸ ¹ÙÀÌÆ®·Î ±¸¼ºµÈ ªÀº ¹®¼¸¦ °¡Á¤ÇØ º¸ÀÚ.
¾ÕÂÊÀÇ 4¹ÙÀÌÆ®´Â ¸ðµÎ ¿µ¹®ÀÚÀ̹ǷΠ1¹ÙÀÌÆ® ¹®ÀÚÀÌÁö¸¸ ¸¶Áö¸· B0´Â 2¹ÙÀÌÆ®ÀÇ ÇѱÛÀÌ´Ù. ±×·¯³ª ¹®¼°¡ ¿©±â¼ ³¡³µ±â ¶§¹®¿¡ ÇѱÛÀ» ±¸¼ºÇÏ´Â µÚÂÊ Äڵ带 ±¸ÇÒ ¼ö ¾ø´Ù. ÀÌ ¹®¼°¡ ¸Þ¸ð¸®·Î ¿Ã¶ó¿À¸é ¹®¼°¡ ¿Ã¶ó¿Â µÚÂÊÀÇ ¸Þ¸ð¸®±îÁöµµ ¹®¼ÀÇ ÀϺκÐÀ¸·Î ÀνÄÇÏ°í Ãâ·ÂÇϰųª À̵¿ÇÏ°Ô µÉ °ÍÀÌ´Ù. ¹°·Ð ÀÌ·± ¹ÝÂÊ DBCS°¡ ½ÇÁ¦·Î ³ªÅ¸³¯ ºóµµ´Â Áö±ØÈ÷ ³·Áö¸¸ Ȥ½Ã¶óµµ ÀÌ·± Äڵ尡 Á¸ÀçÇϸé ÇÁ·Î±×·¥ÀÌ ´Ù¿îµÇ´Â Ä¡¸íÀûÀÎ ¹®Á¦¸¦ ÀÏÀ¸Å³ ¼ö ÀÖ´Ù.
ÀÌ·± ¹®¼¸¦ ÇöÀç ¹æ½Ä´ë·Î Á¤·ÄÇϸé B0¸¦ ¸¸³µÀ» ¶§ 2¹ÙÀÌÆ® ¹®ÀÚ·Î ÀνÄÇÏ¿© ¹®¼ÀÇ µÞºÎºÐ±îÁö Á¤·ÄÇØ ¹ö¸± °ÍÀ̸ç ÀÌ·¸°Ô Á¤·ÄµÈ Á¤º¸¸¦ ÂüÁ¶Çϸé ÇÁ·Î±×·¥ÀÌ ¾î¶»°Ô µ¿ÀÛÇÏ°Ô µÉ Áö ¿¹ÃøÇϱ⠾î·Æ´Ù. ±×·¡¼ ÀÌ·± ¹®ÀÚ¸¦ ¸¸³¯ ¶§´Â ºñ·Ï ¹®ÀÚÀÇ °æ°èÀÌ´õ¶óµµ ¿©±â¸¦ ÁÙ ³¡À¸·Î À߶ó¾ß ÇÏ¸ç ±×·¯±â À§Çؼ´Â ¹ÝÂÊÂ¥¸® DBCS ¹®ÀÚ¸¦ 1¹ÙÀÌÆ® ¹®ÀÚ·Î Ãë±ÞÇØ¾ß ÇÑ´Ù. IsDBCS ÇÔ¼ö¸¦ ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇÑ´Ù.
BOOL CApiEdit::IsDBCS(int nPos)
{
return (IsDBCSLeadByte(buf[nPos]) && (nPos+1 < doclen)
|| IsEnterCode(nPos));
}
DBCS ¹®ÀÚÀÇ µÚÂÊ ¹ÙÀÌÆ®µµ ¹®¼ ¹üÀ§¿¡ ¼ÓÇÏ´ÂÁö¸¦ Á¡°ËÇß´Ù. ÀÌ·¸°Ô ÇÏ¸é ¹ÝÂÊÂ¥¸® DBCS ¹®ÀÚ´Â SBCS·Î Ãë±ÞµÈ´Ù. ´ÙÀ½ Ç׿¡¼ ³íÇÒ ÅؽºÆ® Ãâ·Â ¹®Á¦·Î ÀÎÇØ 0x80À» SBCS·Î Ãë±ÞÇϱâ À§ÇØ IsDBCSLeadByte ÇÔ¼ö¸¦ ´Ù½Ã ä¿ëÇß´Ù. 1.0 ¸¶Áö¸·¿¡¼ ÇÑ±Û Á¶ÇÕÇü°úÀÇ ¹®Á¦ ¶§¹®¿¡ 0x80À» Á¦¿ÜÇß¾ú´Âµ¥ ÀÌÁ¦ ÀÌÁø ÆíÁýÀÌ °¡´ÉÇØÁ³À¸¹Ç·Î ¿î¿µÃ¼Á¦ÀÇ ÆÇ´ÜÀ» µû¶ú´Ù.
ÀÌ ÇÔ¼ö¸¦ ¼öÁ¤ÇÔÀ¸·Î½á ¹ÝÂÊ DBCS·Î ÀÎÇÑ Á¤·Ä ¹®Á¦´Â ÇØ°áÇÒ ¼ö ÀÖ´Ù. ±×·¯³ª ÀÌ·¸°Ô ¸¸µé¾îÁø ¹ÝÂÊÂ¥¸® DBCS ¹®Àڴ ȥÀÚ¼ Ãâ·ÂµÉ ¼ö ÀÖ¾î¾ß ÇϹǷΠ0x80ÀÌ ³Ñ´Â 1¹ÙÀÌÆ® ¹®ÀÚµµ ÆøÀ» °¡Á®¾ß ÇÑ´Ù. ¶ÇÇÑ ¹®¼ Áß°£¿¡ NULLÀÌ ³ª¿Ã ¼öµµ ÀÖ°í 0x80µµ SBCS·Î Ãë±ÞµÇ¹Ç·Î ÀÌ Äڵ嵵 ¹®ÀÚÆøÀ» °¡Á®¾ß ÇÑ´Ù. ¹®ÀÚÆøÀ» ÀúÀåÇÏ´Â arChWidth ¹è¿ÀÇ Å©±â¸¦ 256À¸·Î ´Ã¸®°í PrepareCharWidth¿¡¼ ¸ðµç ¹®ÀÚµéÀÇ ÆøÀ» Á¶»çÇÑ´Ù.
class CApiEditText : public CWindow
{
....
int arChWidth[256];
void CApiEditText::PrepareCharWidth(HDC hdc)
{
....
for (i=0;i<=255;i++) {
Char[0]=i;
GetTextExtentPoint32(hdc, Char, 1, &sz);
arChWidth[i]=(BYTE)sz.cx;
}
arChWidth[0]=arChWidth[32];
1~127±îÁö Á¶»çÇß¾úÀ¸³ª 0~255·Î ¹üÀ§¸¦ ³ÐÇû°í 1.0¿¡¼´Â NULL¹®ÀÚ°¡ °ø¹é°ú °°Àº ÆøÀ» °¡Á³À¸³ª ÀÌÁ¦ ½ÇÁ¦ ÆøÀ» °è»êÇß´Ù. arChWidth[0]¿¡ °ø¹éÆøÀ» ´ëÀÔÇÏ´Â ÄÚµå´Â »èÁ¦ÇÑ´Ù. GetCharWidth¿¡¼ ÀÌ ¹®ÀÚÀÇ ÆøÀ» Á¶»çÇÒ ¶§ ij½ºÆÃÇÑ´Ù. TCHARÇüÀº ºÎÈ£°¡ Àֱ⠶§¹®¿¡ 0x80ÀÌ -129°¡ µÇ¹Ç·Î BYTE *ÇüÀ¸·Î ij½ºÆÃÇÑ ÈÄ Àоî¾ß 0x80ÀÌ ³Ñ´Â 1¹ÙÀÌÆ® ¹®ÀÚµµ ÆøÀ» Á¦´ë·Î Á¶»çÇÒ ¼ö ÀÖ´Ù.
int CApiEditText::GetCharWidth(TCHAR *ch, int len)
{
....
if (len==1) {
return arChWidth[*(BYTE *)ch];
....
¹ÝÂÊ DBCSÀÇ ¹ß»ý ºóµµ´Â »ý°¢º¸´Ù ÈξÀ ´õ ³ô´Ù. ´Ù¿î·Îµå ¹Þ´Ù°¡ Áß´ÜµÈ °æ¿ì ¿ì¿¬È÷ ¹ß»ýÇÒ ¼öµµ ÀÖÁö¸¸ ´ç±ÙÀÇ °æ¿ì´Â ´õ ÀÚÁÖ ¹ß»ýÇÒ ¼ö Àִµ¥ ¿Ö³ÄÇϸé Çí»ç ºä¸¦ Áö¿øÇϱ⠶§¹®ÀÌ´Ù. ÆÄÀÏ ³¡À¸·Î °¡¼ B0 A1À» Ãß°¡ÇÒ ¶§ óÀ½ ÀÔ·ÂÇÑ B0°¡ ÀϽÃÀûÀ¸·Î ¹ÝÂÊ DBCS°¡ µÇ´Â °ÍÀÌ´Ù. ¹®¼¸¦ Ãâ·ÂÇÏ´Â DrawLine ÇÔ¼öµµ ¼öÁ¤ÇØ¾ß ÇÑ´Ù. ¿¹»óÄ¡ ¸øÇß´ø ¹®Á¦°¡ ÀÖ´Ù.
int CApiEditText::DrawLine(HDC hdc, int Line)
{
....
for (;;) {
for (len=0;;) {
if (nowoff+len == pLine[Line].End || len > 4096) {
if (SelStart != SelEnd && nowoff >= SelFirst && nowoff < SelSecond) {
bInSel=TRUE;
} else {
bInSel=FALSE;
}
break;
}
if (pFrame->buf[nowoff+len] == '\t') {
if (len == 0)
len=1;
if (SelStart != SelEnd && nowoff >= SelFirst && nowoff < SelSecond) {
bInSel=TRUE;
} else {
bInSel=FALSE;
}
break;
}
¿ø·¡ ÄÚµå´Â ÅÇÀ» ¸ÕÀú Á¡°ËÇÏ°í ÁÙ ³¡À» Á¡°ËÇßÀ¸³ª µÎ Á¶°ÇÀÇ Á¡°Ë ¼ø¼¸¦ ¹Ù²Ù¾î¾ß ÇÑ´Ù. ÀÌÀü ¹öÀü¿¡¼ º° »ý°¢¾øÀÌ Á¶°Ç¹®µéÀ» ¼öÆò ¹èÄ¡Çß¾ú´Âµ¥ ¹®¼ ³¡¿¡ Ç×»ó NULL¹®ÀÚ°¡ ÀÖ¾ú±â ¶§¹®¿¡ ÁÙ µÚÂʱîÁö ÀÐÀ» À§ÇèÀÌ ¾ø¾ú´Ù. ±×·¯³ª Áö±ÝÀº NULLÀÌ ¾ø°í doclen º¯¼ö·Î¸¸ ¹®¼ ±æÀ̸¦ ÆÇ´ÜÇÑ´Ù. ¹®¼ Á¦ÀÏ ³¡¿¡ ÀÖ´Â TabÀ» »èÁ¦Çϸé doclenÀÌ 1 ÁÙ¾îµé »Ó Tab¹®ÀÚ°¡ NULL¹®ÀÚ·Î µ¤¿©ÁöÁö ¾Ê´Â´Ù. ÀÌ »óÅ¿¡¼ TabÀ» ¸ÕÀú Á¡°ËÇØ ¹ö¸®¸é ÁÙ ³¡À» Áö³ªÃÄ ¹ö¸°´Ù.
¿©±â±îÁö ÀÛ¾÷Çϸé ÀÓÀÇÀÇ ÀÌÁø ½ºÆ®¸²À» ÀÐÀ» ¼ö ÀÖ°í ¾î¶² ÆÄÀÏÀ» ¿´õ¶óµµ ÃÖ¼ÒÇÑ Á×Áö´Â ¾Ê´Â´Ù. ÀÏ´Ü Á¦´ë·Î ¼öÁ¤Çß´ÂÁö ÄÄÆÄÀϺÎÅÍ ÇØ º¸µÇ Á÷Á¢ ÀÛ¾÷Çß´Ù¸é Çѵΰ³ÂëÀÇ ¿ÀŸ°¡ ÀÖÀ» ¼ö ÀÖÀ¸¹Ç·Î ²Ä²ÄÇÏ°Ô ¼öÁ¤ÇÏÀÚ. ½ÇÇàÇÑ ÈÄ Arches.bmp ÆÄÀÏÀ» ¿¾î º¸¸é ÀÌ ÆÄÀÏÀÇ ³»¿ë Àüü°¡ ´Ù º¸ÀδÙ.
ºñÆ®¸Ê µ¥ÀÌÅ͸¦ ±×´ë·Î ÅؽºÆ® ÆíÁý±â·Î »Ñ¸° °ÍÀ̹ǷΠÀÌ»óÇÏ°Ô º¸ÀÌ´Â °ÍÀÌ ´ç¿¬ÇÏ´Ù. ¹®¼ ³»¿ë Àüü°¡ º¸À̱â´Â ÇÏÁö¸¸ ¾ÆÁ÷ ¹®Á¦°¡ ¸¹Àºµ¥ ºí·ÏÀ» ¼±ÅÃÇØ º¸¸é µÚÂÊ ±ÛÀÚµéÀÇ À§Ä¡°¡ º¯ÇÏ´Â °ÍÀ» º¼ ¼ö ÀÖ´Ù. ÀÌ ¹®Á¦µµ °°ÀÌ ÇØ°áÇØ¾ß ÇÑ´Ù.
´ç±ÙÀÇ ±âº» ÅؽºÆ® Ãâ·Â ÇÔ¼ö´Â TextOutÀÌ´Ù. ±âº»ÀûÀÎ ÅؽºÆ® Ãâ·Â ÇÔ¼ö·Î Àß »ç¿ëÇØ ¿Ô´Âµ¥ ÀÌ °£´ÜÇÑ ÇÔ¼ö¿¡ ¸î°¡Áö ¹®Á¦°¡ ÀÖ´Ù. Á¤»óÀûÀÎ ¹®ÀÚ Äڵ带 Ãâ·ÂÇÏ¸é ¾Æ¹« ¹®Á¦°¡ ¾øÀ¸³ª ±Û²Ã¿¡ Á¤ÀǵÇÁö ¾ÊÀº ¹®ÀÚ¸¦ Ãâ·ÂÇÒ ¶§ ¾à°£ ÀÌ»óÇÑ µ¿ÀÛÀ» ÇÑ´Ù. ´ç±ÙÀº ÀÌÁø ½ºÆ®¸²À» Ãâ·ÂÇØ¾ß ÇϹǷΠÇöÀç ±Û²Ã¿¡ Á¤ÀǵÇÁö ¾ÊÀº ¹®ÀÚ¶óµµ ÃÖ¼ÒÇÑ µðÆúÆ® 󸮴 ÇØ¾ß Çϴµ¥ ÀÌ ÇÔ¼ö°¡ ¿øÇϴ´ë·Î µ¿ÀÛÇÏÁö ¾Ê´Â °ÍÀÌ´Ù. ´ÙÀ½ Å×½ºÆ® ¿¹Á¦·Î TextOut ÇÔ¼ö¸¦ Å×½ºÆ®ÇØ º¸ÀÚ.
HWND hList;
BOOL bUseSystem=TRUE;
BYTE str[16]={0xa0,0x00,0x31,0x32,0x33,};
BYTE str2[16]={0x80,0x31};
BYTE str3[16]={0x41,0x42,0x43,0x80,0x44,0x45,0x46};
BYTE str4[16]={0x41,0x42,0x43,0x44,0x45,0x46};
BYTE str5[16]={0x00,0x00};
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
SIZE sz;
TCHAR Mes[256];
HFONT font, oldfont;
switch(iMessage) {
case WM_CREATE:
hList=CreateWindow("listbox",NULL,WS_CHILD | WS_VISIBLE | WS_BORDER,
200,10,300,150,hWnd,(HMENU)0,g_hInst,NULL);
return 0;
case WM_LBUTTONDOWN:
bUseSystem=!bUseSystem;
InvalidateRect(hWnd,NULL,TRUE);
return 0;
case WM_PAINT:
SendMessage(hList,LB_RESETCONTENT,0,0);
hdc=BeginPaint(hWnd, &ps);
if (!bUseSystem) {
font=CreateFont(16,0,0,0,0,0,0,0,HANGEUL_CHARSET,3,2,1,
VARIABLE_PITCH | FF_ROMAN,"±¼¸²");
oldfont=(HFONT)SelectObject(hdc,font);
}
SetBkColor(hdc,RGB(0,0,255));
// ÇѲ¨¹ø¿¡ Ãâ·Â
TextOut(hdc,10,10,(TCHAR *)str,5);
// °³º° ¹®ÀÚº°·Î Ãâ·Â
TextOut(hdc,10,30,(TCHAR *)str,2);
GetTextExtentPoint32(hdc,(TCHAR *)str,2,&sz);
TextOut(hdc,10+sz.cx,30,(TCHAR *)str+2,3);
// 0xa0 0x00 0x31ÀÇ ÆøÀÌ ¾Õ µÎ ¹ÙÀÌÆ®ÀÇ Æø°ú °°À½
GetTextExtentPoint32(hdc,(TCHAR *)str,1,&sz);
wsprintf(Mes,"0xa0ÀÇ Æø=%d",sz.cx);
SendMessage(hList,LB_ADDSTRING,0,(LPARAM)Mes);
GetTextExtentPoint32(hdc,(TCHAR *)str,2,&sz);
wsprintf(Mes,"0xa0, 0x00ÀÇ Æø=%d",sz.cx);
SendMessage(hList,LB_ADDSTRING,0,(LPARAM)Mes);
GetTextExtentPoint32(hdc,(TCHAR *)str,3,&sz);
wsprintf(Mes,"0xa0, 0x00, 0x31ÀÇ Æø=%d",sz.cx);
SendMessage(hList,LB_ADDSTRING,0,(LPARAM)Mes);
GetTextExtentPoint32(hdc,(TCHAR *)str,4,&sz);
wsprintf(Mes,"0xa0, 0x00, 0x31, 0x32ÀÇ Æø=%d",sz.cx);
SendMessage(hList,LB_ADDSTRING,0,(LPARAM)Mes);
// 0x80 Å×½ºÆ®
TextOut(hdc,10,60,(TCHAR *)str2,1);
TextOut(hdc,10,80,(TCHAR *)str2,2);
TextOut(hdc,10,110,(TCHAR *)str3,7);
TextOut(hdc,10,130,(TCHAR *)str4,6);
// 0x00 Å×½ºÆ®
TextOut(hdc,10,160,(TCHAR *)str5,1);
TextOut(hdc,10,180,(TCHAR *)str5,2);
GetTextExtentPoint32(hdc,(TCHAR *)str5,1,&sz);
wsprintf(Mes,"0x00ÀÇ Æø=%d",sz.cx);
SendMessage(hList,LB_ADDSTRING,0,(LPARAM)Mes);
GetTextExtentPoint32(hdc,(TCHAR *)str5,2,&sz);
wsprintf(Mes,"0x00, 0x00ÀÇ Æø=%d",sz.cx);
SendMessage(hList,LB_ADDSTRING,0,(LPARAM)Mes);
if (!bUseSystem) {
SelectObject(hdc,oldfont);
DeleteObject(font);
}
EndPaint(hWnd, &ps);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}
¿©·¯ °¡Áö ¹®ÀÚ¿À» ±Û²Ã°ú Ãâ·Â ¹æ½ÄÀ» ¹Ù²ã°¡¸ç Ãâ·ÂÇÑ °ÍÀÌ´Ù. ½ÇÇà °á°ú´Â ´ÙÀ½°ú °°Àºµ¥ ¿ÞÂÊÀº ½Ã½ºÅÛ ±Û²Ã·Î, ¿À¸¥ÂÊÀº ±¼¸² ±Û²Ã·Î Ãâ·ÂÇÑ °ÍÀÌ´Ù. ¿©·¯ °¡Áö ¹®Á¦Á¡ÀÌ ÀÖÀ½À» ¾Ë ¼ö ÀÖ´Ù.
¹®Á¦Á¡ 1 : a0, 00, 31, 32, 33 ÀÇ ¹ÙÀÌÆ®¸¦ Ãâ·ÂÇϴµ¥ Àüü¸¦ Çѹø¿¡ Ãâ·ÂÇÑ °Í°ú a0, 00À» ¸ÕÀú Ãâ·ÂÇÏ°í ±× Æø¸¸Å ¶ç¿î ÈÄ 31,32,33À» Ãâ·ÂÇÑ °á°ú°¡ ´Ù¸£´Ù. ¿Ö ´Ù¸¥°¡Çϸé a0,00ÀÇ ÆøÀÌ 16À¸·Î Á¶»çµÇ´Âµ¥ ±× µÚ¿¡ 31¸¦ Çϳª ´õ ºÙ¿©µµ ¿ª½Ã ÆøÀÌ 16À¸·Î Á¶»çµÇ±â ¶§¹®ÀÌ´Ù. ±×·¸´Ù¸é ¹®ÀÚ 1ÀÇ ÆøÀÌ 0À̶ó´Â ¾ê±â°¡ µÇ´Âµ¥ ÀÌ´Â ºÐ¸íÈ÷ Ʋ¸° °á°úÀÌ´Ù.
¹®Á¦Á¡ 2: 0x80Àº ½Ã½ºÅÛ¿¡ ÀÇÇØ SBCS·Î Á¤ÀǵǾî ÀÖ°í ÀÌ ¹®ÀÚ¸¦ ´Üµ¶À¸·Î Ãâ·ÂÇϸé À¯·Î Ç¥½Ã°¡ Ãâ·ÂµÈ´Ù. ±×·¯³ª 0x80 ´ÙÀ½¿¡ ¹®ÀÚ°¡ Çϳª ´õ ÀÖÀ¸¸é À¯·Î ¹®ÀÚ°¡ Ãâ·ÂµÇÁö ¾Ê´Â´Ù. »Ó¸¸ ¾Æ´Ï¶ó µÚ¿¡ ¹®ÀÚ°¡ ´õ ÀÖÀ» ¶§ÀÇ ÆøÀÌ Æ²·ÁÁø´Ù.
¹®Á¦Á¡ 3: 0x80ÀÌ ¹®ÀÚ¿ Áß°£¿¡ ÀÖÀ» ¶§ ±Û²ÃÀÇ ¸ð¾çÀÌ Æ²·ÁÁö¸ç ÀåÆòµµ ´õ Ä¿Áø´Ù. ´Ù¸¥ ÄÚµå´Â ¹®Á¦°¡ µÇÁö ¾Ê´Âµ¥ À¯µ¶ 0x80¸¸ ±×·¸´Ù. ½Ã½ºÅÛ ±Û²ÃÀÌ ¾Æ´Ñ ´Ù¸¥ ±Û²ÃÀ» »ç¿ëÇϸé ÀÌ ¹®Á¦´Â ³ªÅ¸³ªÁö ¾Ê´Â´Ù.
¹®Á¦Á¡ 4: 0x00, 0x00¸¦ Ãâ·ÂÇϸé ÀÚ½ÅÀÇ ÆøÀ» ³ÑÃļ ÀÌ»óÇÑ ¹®ÀÚ°¡ Ãâ·ÂµÈ´Ù. 0x00´Â SBCSÀ̸ç ÆøÀÌ 8À̶ó°í º¸°íµÇÁö¸¸ ½ÇÁ¦ Ãâ·ÂµÈ °á°ú´Â 8º¸´Ù ÈξÀ ´õ Å©´Ù.
ÇÑ°¡Áöµµ ¾Æ´Ï°í ¿©·¯ °¡Áö·Î °ñÄ¡¾ÆÇ ¹®Á¦µéÀÌ ÇѲ¨¹ø¿¡ ³ªÅ¸³ª´Âµ¥ ÀÌ ¹®Á¦°¡ ´õ °ñÄ¡ ¾ÆÇ ÀÌÀ¯´Â ¿î¿µÃ¼Á¦ ¹öÀü¸¶´Ù Áõ»óÀÌ Á¶±Ý¾¿ ´Ù¸£´Ù´Â Á¡ÀÌ´Ù. ÀÌ°ÍÀ» ¿î¿µÃ¼Á¦ÀÇ ¹ö±×¶ó°í °¨È÷ ´ÜÁ¤Áþ±â´Â ¾î·Æ´Ù. ÀÌ·¸°Ô µÇ¾î¾ß¸¸ ÇÏ´Â ¼³¸íÇϱâ Èûµç »çÁ¤ÀÌ ÀÖ´Â °ÍÀÎÁö, ¾Æ´Ï¸é ³»°¡ ¹» À߸ø ¾Ë°í ÀÖ´Â °ÍÀÎÁö´Â ¸ð¸¦ ÀÏÀÌ´Ù.
ºÐ¸íÇÑ °ÍÀº TextOutÀÇ µ¿ÀÛÀÌ ³»°¡ ¹Ù¶ó´Â °Í°ú´Â ´Ù¸£´Ù´Â Á¡À̸ç ÀÌ ÇÔ¼öÀÇ ¼ºñ½º¸¦ ¹Þ¾Æ¼´Â ÀÓÀÇÀÇ ÀÌÁø ½ºÆ®¸²À» ±ò²ûÇÏ°Ô Ãâ·ÂÇϱâ Èûµé´Ù´Â °ÍÀÌ´Ù. ÀÌ·± °æ¿ì´Â ¸»½éÀÌ ÀÖ´Â ÇÔ¼ö¸¦ ¾²Áö ¸»°í ´Ù¸¥ ¹æ¹ýÀ» ½ÃµµÇØ¾ß ÇÑ´Ù. ´ÙÀ½ ÇÔ¼ö´Â ¹®ÀÚÀÇ ÆøÀ» °³º°ÀûÀ¸·Î ÇÕ»êÇؼ ÇѲ¨¹ø¿¡ Ãâ·ÂÇÑ´Ù.
void CApiEditText::AeTextOut(HDC hdc,int x,int y,TCHAR *str,int len)
{
int i;
int *lpDx;
int boff;
boff=str-pFrame->buf;
lpDx=(int *)malloc(len*sizeof(int));
for (i=0;i<len;) {
if (pFrame->IsDBCS(boff+i)) {
lpDx[i++]=GetCharWidth(str+i,2);
lpDx[i++]=0;
} else {
lpDx[i++]=GetCharWidth(str+i,1);
}
}
ExtTextOut(hdc,x,y,0,NULL,str,len,lpDx);
free(lpDx);
}
PrepareCharWidth¿¡¼ ¹Ì¸® Á¶»çÇØ ³õÀº °³º° ¹®ÀÚÀÇ ÆøÀ» ±¸ÇØ °¢ ¹®ÀÚ°¡ Ãâ·ÂµÉ ÁÂÇ¥¸¦ ¹è¿¿¡ °Á¦·Î ÁöÁ¤ÇÑ ÈÄ ExtTextOutÀ¸·Î Ãâ·ÂÇß´Ù. ÇÔ¼öÀÇ ¿øÇüÀº TextOut°ú µ¿ÀÏÇÏ´Ù. DrawSegment¿¡¼ TextOut ´ë½Å ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù.
void CApiEditText::DrawSegment(HDC hdc, int &x, int y, int SegOff, int len, BOOL ignoreX,
COLORREF fore, COLORREF back)
{
....
AeTextOut(hdc,x,y,pFrame->buf+SegOff,len);
ÀÌ·¸°Ô ÇÏ¸é ¾ÕµÚ Äڵ忡 µû¶ó ÆøÀÌ ´Þ¶óÁö´Â ¹®Á¦¸¦ ÇØ°áÇÒ ¼ö Àִµ¥ ù¹ø°, µÎ¹ø° ¹®Á¦´Â ÇØ°áµÇ¾ú´Ù. ±×·¯³ª ¼¼¹ø°, ³×¹ø° ¹®Á¦´Â ¾ÆÁ÷ ÇØ°áµÇÁö ¾Ê¾Ò´Âµ¥ ÀÌ ¹®Á¦´Â XP¿¡¼ ½Ã½ºÅÛ ±Û²ÃÀ» ¾²°í ÀÖ°í 0x80 ¹®ÀÚ¿ÀÌ Áß°£¿¡ ÀÖÀ» ¶§¸¸ ¹®Á¦°¡ µÈ´Ù. ²À ÇØ°áÇÏ·Á¸é ´ÙÀ½Ã³·³ ÇÒ ¼ö´Â ÀÖ´Ù.
void CApiEditText::AeTextOut(HDC hdc,int x,int y,TCHAR *str,int len)
{
int i;
int boff;
int nx,byte;
boff=str-pFrame->buf;
for (nx=x,i=0;i<len;) {
if (pFrame->IsDBCS(boff+i)) {
byte=2;
} else {
byte=1;
}
TextOut(hdc,nx,y,str+i,byte);
nx+=GetCharWidth(str+i,byte);
i+=byte;
}
}
°¢°¢ÀÇ ¹®ÀÚ¸¦ °³º°ÀûÀ¸·Î µû·Î Ãâ·ÂÇÔÀ¸·Î½á 0x80 ¹®ÀÚ¸¦ Ç×»ó ´Üµ¶ Ãâ·ÂÇß´Ù. ÀÌ ¹æ¹ýÀº ½ÃµµÇØ º¼¸¸Àº ÇÏÁö¸¸ äÅÃÀº ÇÏÁö ¾Ê±â·Î ÇÑ´Ù. ÃÖÃÊÀÇ TextOutÀ¸·Î Ãâ·ÂÇÏ´Â ¹æ½Ä°ú ExtTextOutÀ¸·Î Ãâ·ÂÇÏ´Â ¹æ½ÄÀº °ÅÀÇ ¼Óµµ Â÷ÀÌ°¡ ¾øÁö¸¸ ¸¶Áö¸· ¹æ½ÄÀº 4¹è Á¤µµ ¼Óµµ°¡ ´À·Á ¾µ ¼ö ¾ø´Ù. Àß ¹ß»ýÇÏÁöµµ ¾Ê´Â ¹®Á¦ÀÏ »Ó´õ·¯ Ȥ½Ã ¹ß»ýÇÏ´õ¶óµµ Ä¡¸íÀûÀÎ ¹®Á¦¸¦ ÀÏÀ¸Å°Áö´Â ¾Ê´Âµ¥ ÀÌ·± ¹®Á¦ ÇØ°áÀ» À§ÇØ ÇÁ·Î±×·¥ÀÌ 4¹è³ª ´À·ÁÁ®¾ß ÇÑ´Ù¸é ÇØ°áÇÏÁö ¾Ê´Â ÆíÀÌ ´õ ÇÕ¸®ÀûÀÎ ¼±ÅÃÀÌ´Ù.
´ÙÀ½Àº Á٠óÀ½¿¡ °ø¹é ±ÝÁö ¿É¼Ç¿¡ ´ëÇÑ ¹ö±×ÀÌ´Ù. ÀÌ ¿É¼ÇÀ» ¼±ÅÃÇØ ³õÀº »óÅ¿¡¼ »õ ¹®¼¸¦ ¸¸µé°í ÀÚµ¿ °³Çà ¸ðµå¿¡¼ a, °ø¹é, b, °ø¹éÀ» ÀÔ·ÂÇØ ³õÀº »óÅ¿¡¼ BS¿Í ½ºÆäÀ̽º Å°¸¦ ¹ø°¥¾Æ ´·¯ º¸¸é b°¡ ¹ØÀ¸·Î ³»·Á°¬´Ù ¿Ã¶ó¿Ô´Ù¸¦ ¹Ýº¹ÇÒ °ÍÀÌ´Ù. ÀÌ·¸°Ô µÇ´Â ¿øÀº GetLine ÇÔ¼öÀÇ ³¡¿¡ Á¤·Ä ¹ö±×°¡ Àֱ⠶§¹®ÀÌ´Ù.
void CApiEditText::GetLine(int Line, int &s, int &e)
{
....
if (bNoFirstSpace && *p==' ' && EndPosNoSpace!=NULL) {
p=EndPosNoSpace;
}
e=p-pFrame->buf;
}
Á٠óÀ½ °ø¹é ±ÝÁö ¿É¼ÇÀÌ ¼±ÅõǾî ÀÖ°í ´ÙÀ½ Á٠óÀ½ÀÌ °ø¹éÀÌ°í ÀÌ ÁÙ¿¡ °ø¹éÀÌ ¾Æ´Ñ ¸¶Áö¸· ¹®ÀÚ°¡ ÀÖ´Ù¸é ¿©±â¼ ÀÚ¸¥´Ù´Â ¶æÀÌ´Ù. °ø¹éÀÌ ¾Æ´Ñ ¸¶Áö¸· ¹®ÀÚ°¡ ÀÚµ¿À¸·Î ´ÙÀ½ ÁÙ·Î ³»·Á°£´Ù. ±×·±µ¥ BS·Î ¹®¼¸¦ »èÁ¦ÇÒ ¶§ ³¡ÀÇ °ø¹éÀ» ½ÇÁ¦·Î »èÁ¦ÇÏÁö ¾Ê°í ¹®¼ ±æÀ̸¸ 1·Î ÁÙÀ̱⠶§¹®¿¡ ÀÌ °ø¹éÀÌ Á¤·Ä¿¡ ¿µÇâÀ» ¹ÌÄ¡´Â °ÍÀÌ´Ù. ¹®Á¦¸¦ ÇØ°áÇÏ·Á¸é ´ÙÀ½°ú °°ÀÌ Á¶°ÇÀ» ´õ Ãß°¡ÇØ¾ß ÇÑ´Ù.
if (bNoFirstSpace && p < pFrame->buf+pFrame->doclen && *p==' ' && EndPosNoSpace!=NULL) {
p=EndPosNoSpace;
}
e=p-pFrame->buf;
}
p°¡ À¯È¿ÇÑ ¹®¼ ¹üÀ§¿¡ ÀÖ´Â Æ÷ÀÎÅÍÀÎÁö¸¦ ¸ÕÀú Á¡°ËÇϸé ÀÌ ¹®Á¦°¡ ÇØ°áµÈ´Ù. ½ÇÁ¦·Î´Â ¿©±â¿¡ ÀÚµ¿ °³ÈþÀ̶ó´Â Á¶°ÇÀÌ ´õ Ãß°¡µÇ¾î¾ß ÇÏÁö¸¸ ÀÚµ¿ °³ÇàÀÌ ¾Æ´Ò ¶§´Â EndPosNoSpace°¡ Ç×»ó 0À̹ǷΠÀÌ Á¶°ÇÀ» ±»ÀÌ ºÙÀÏ ÇÊ¿ä°¡ ¾ø´Ù. ¹®¼ ±æÀÌ°¡ Á¤È®ÇØÁ³°í ¸¶Áö¸· ¹®ÀÚ°¡ NULLÀÌ ¾Æ´Ò ¼öµµ Àֱ⠶§¹®¿¡ Àü¿¡ ¾ø´ø ¹®Á¦µéÀÌ ¹ß»ýÇÑ´Ù.