ÇÁ·Î±×·¥ °³¹ß°úÁ¤À̶õ ¹ö±×¿ÍÀÇ ²÷ÀÓ¾ø´Â ÀüÀïÀ̶ó°í Ç¥ÇöÇصµ ÁÁÀ» Á¤µµ·Î ´ëºÎºÐÀÇ ½Ã°£À» µð¹ö±ë¿¡ ÇÒ¾ÖÇØ¾ß ÇÑ´Ù. ´ç±Ù °³¹ß°úÁ¤¿¡¼µµ ¹°·Ð ¼ö¸¹Àº ¹ö±×µéÀÌ ¹ß°ßµÇ¾ú°í ¹ß°ßµÇ´Â Á·Á· ÀÌÀü ÇÁ·ÎÁ§Æ®·Î µ¹¾Æ°¡ ´Ù½Ã ¼öÁ¤ÇØ ¿Ô´Ù. ¿©±â¼ ¼öÁ¤ÇÒ ¹ö±×µéÀº º£Å¸2 ÀÌÈÄ¿¡ ¹ß°ßµÈ °ÍµéÀε¥ °£´ÜÇÑ ¹ö±×µéÀ̹ǷΠÀÌÀü ÇÁ·ÎÁ§Æ®¸¦ ¼öÁ¤ÇÏÁö ¸»°í ¸¶Áö¸· ÇÁ·ÎÁ§Æ®¸¸ ¼öÁ¤Çϱâ·Î ÇÑ´Ù.
ù ¹ø° ¹ö±×´Â ÀÚµ¿°³Çà »óÅ·Π½ÃÀÛÇÏÁö ¾Ê°í ¸¶ÁøÀÌ º¸ÀÌ´Â »óÅÂÀÏ ¶§ ij·µÀÌ ¸¶Áø ¾È¿¡ À§Ä¡ÇÑ´Ù´Â Á¡ÀÌ´Ù. ÀÌ ¹ö±×´Â ÃʱâÈ °úÁ¤ÀÇ Æ¯¼öÇÔÀ¸·Î ÀÎÇØ ¹ß»ýÇÑ °ÍÀε¥ SetCaret¿¡¼ ij·µÀ» Æ÷¸ËÆÿµ¿ª ¾ÈÀ¸·Î ³Ö¾îÁÖ´Â Äڵ忡 ¹®Á¦°¡ ÀÖ¾ú´Ù. ij·µÀÌ ¼öÆò Æ÷¸ËÆÿµ¿ªÀ» ¹þ¾î³ª¸é ȸéÀÇ Áß¾ÓÀ¸·Î ¿Å±âµµ·Ï µÇ¾î Àִµ¥ ÀÌ Äڵ忡 ÀÛ¾÷¿µ¿ªÀÇ ÆøÀÌ 0ÀÌ ¾Æ´Ï¶ó´Â Á¶°ÇÀÌ ÇÊ¿äÇÏ´Ù.
void CApiEdit::SetCaret(BOOL bUpdatePrevX/*=TRUE*/, BOOL bScrollToCaret/*=TRUE*/)
{
RECT crt;
....
GetXYFromOff(toff,x,y);
GetClientRect(hWnd,&crt);
if (bScrollToCaret && crt.right) {
SendNotify(AEN_MOVE);
if (nWrap==0) {
if ((x+caretwidth > xPos+frt.right) || (x < xPos+MarginWidth)) {
xPos=max(0,x-frt.right/2);
bScroll=TRUE;
}
}
´ç±ÙÀÇ Â÷Àϵ忡¼ CApiEdit °´Ã¼¸¦ »ý¼ºÇÑ Á÷ÈÄ¿¡ SetSetting ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ÄÁÆ®·ÑÀÇ ¿©·¯ °¡Áö ¼³Á¤»óŸ¦ Á¶Á¤ÇÑ´Ù. À̶§ SetWrap(0) È£Ãâ¹®¿¡¼ SetCaretÀ» È£ÃâÇÏ¿© ij·µÀÇ Ãʱâ À§Ä¡¸¦ ÁöÁ¤Çϴµ¥ À̶§´Â ¾ÆÁ÷ WM_SIZE ¸Þ½ÃÁö°¡ 󸮵ÇÁö ¾Ê¾Ò±â ¶§¹®¿¡ frt°¡ Æ÷¸ËÆÿµ¿ªÀ» Á¦´ë·Î Ç¥ÇöÇÏÁö ¸øÇÏ´Â »óÅÂÀÌ´Ù. ÀÌ »óÅ´ë·Î ij·µ À§Ä¡¿Í ¼öÆò½ºÅ©·Ñ À§Ä¡¸¦ Á¶Á¤ÇÏ´Ù º¸¸é xPos°¡ MarginWidth·Î ÃʱâÈµÇ¾î ¸¶Ä¡ ¸¶ÁøÆø¸¸Å ¿À¸¥ÂÊÀ¸·Î ½ºÅ©·ÑµÇ¾î ÀÖ´Â °ÍÀ¸·Î Âø°¢ÇÏ°Ô µÈ´Ù. ±×·¡¼ ij·µÀÌ ¸¶Áø ¾ÈÂÊ, Áï ¼öÆòÁÂÇ¥ 0¿¡ ³ªÅ¸³ª´Âµ¥ Æ÷¸ËÆÿµ¿ªÀÌ Á¶»çµÇÁö ¾Ê¾ÒÀ» ¶§´Â ij·µÀÌ ÀÖ´Â °÷À¸·Î ½ºÅ©·Ñ ÇÏÁö ¾Êµµ·Ï ÇÏ¿´´Ù. ÀÛ¾÷¿µ¿ªÀÇ Å©±â¸¦ ±¸Çغ¸°í ÆøÀÌ 0ÀÌ¸é ¾ÆÁ÷ WM_SIZE¸¦ ó¸®ÇÏÁö ¾ÊÀº °ÍÀ¸·Î ÆÇ´ÜÇÑ´Ù.
µÎ ¹ø° ¹ö±×´Â ÆÄÀÏÅÇÀÇ À̹ÌÁö °ü¸® ¹ö±×Àε¥ ¡®À̸§¾øÀ½ 1¡¯À» »õ·Î ¸¸µé¾î ÆíÁýÇϸé ÀÌ ÆÄÀÏÀÌ ¼öÁ¤µÇ¾úÀ¸¹Ç·Î »¡°£»öÀ¸·Î Ç¥½ÃµÉ °ÍÀÌ´Ù. ÀÌ »óÅ¿¡¼ ´Ù¸¥ ÆÄÀÏÀ» ¿¸é OpenFromFile¿¡¼ New ÇÔ¼ö¸¦ È£ÃâÇÏ°í DGChildProcÀÇ WM_CREATE¿¡¼ »õ·Î ¸¸µé¾îÁø â¿¡ ¡®À̸§¾øÀ½ 1¡¯À̶ó´Â ÆÄÀϸíÀ» ºÙ¿©ÁØ´Ù. NewChild¿¡¼¸¸ g_NewNo¸¦ Áõ°¡½ÃÅ°µµ·Ï Çسõ¾Ò±â ¶§¹®¿¡ »õ·Î ¿¸®´Â âÀÇ À̸§ÀÌ ÀϽÃÀûÀ¸·Î ¡®À̸§¾øÀ½ 1¡¯ÀÌ µÈ ÈÄ ÃʱâÈ°¡ ¿Ï·áµÈ ÈÄ OpenFileToChild ÇÔ¼ö¿¡ ÀÇÇØ Á¤È®ÇÑ ÆÄÀϸíÀ» ´Ù½Ã ¹Þ°Ô µÈ´Ù.
ÀÌ °úÁ¤¿¡¼ »õ·Î ¿¸®´Â âÀÇ SetText ÇÔ¼ö°¡ AEN_CHGMODI ÅëÁö ¸Þ½ÃÁö¸¦ º¸³»¸é SetStatusText ÇÔ¼ö¿¡¼ ¡®À̸§¾øÀ½ 1¡¯ âÀ» ã¾Æ À̹ÌÁö¸¦ ÆĶõ»öÀ¸·Î º¯°æÇÏ°Ô µÈ´Ù. Áï, FindFileTab ÇÔ¼ö°¡ ÀÓ½ÃÀûÀ¸·Î ºÙ¿©Áø À̸§À¸·ÎºÎÅÍ ´ë»ó ÅÇÀ» À߸ø ã´Â °ÍÀÌ´Ù. ÀÌ ¹®Á¦´Â ±Ùº»ÀûÀ¸·Î pSi->NowFile¿¡ ÆÄÀϸíÀ» ºÙ¿©ÁÖ´Â ½Ã±â¸¦ À߸ø ¼±ÅÃÇ߱⠶§¹®¿¡ ¹ß»ýÇÑ´Ù. NewChild ÇÔ¼ö¿¡ ´ÙÀ½ Äڵ带 Ãß°¡ÇÑ´Ù.
HWND NewChild()
{
HWND hChild;
SInfo *pSi;
g_NewNo++;
hChild=New();
pSi=(SInfo *)GetWindowLong(hChild,0);
wsprintf(pSi->NowFile,"À̸§¾øÀ½ %d",g_NewNo);
SetWindowText(hChild,pSi->NowFile);
AddFileTab(pSi->NowFile);
return hChild;
}
»õ·Î ¸¸µé¾îÁø â¿¡ ÆÄÀϸíÀ» ºÙÀÌ´Â ½Ã±â¸¦ âÀÌ ¿ÏÀüÈ÷ ¸¸µé¾îÁö°í ³ ´ÙÀ½À¸·Î À̵¿½ÃÄ×´Ù. DGChildProcÀÇ WM_CREATE¿¡¼ pSi->NowFile¿¡ ÆÄÀϸíÀ» ´ëÀÔÇÏ°í À©µµ¿ìÀÇ Ä¸¼ÇÀ» º¯°æÇÏ´Â ÄÚµå´Â »èÁ¦ÇÑ´Ù. ´ë½Å pSi->NowFile¿¡ ºó ¹®ÀÚ¿À» ´ëÀÔÇÏ¿© ´ëÀÀµÇ´Â ÅÇÀ» ãÁö ¸øÇϵµ·Ï ÇÏ¿´´Ù.
LRESULT CALLBACK DGChildProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
switch(iMessage) {
case WM_CREATE:
....
pSi->Ae.Create(0,0,0,0,WS_CHILD | WS_VISIBLE,1,hWnd);
SetSetting(pSi->Ae);
wsprintf(pSi->NowFile,"");
return 0;
¹®¼Ã¢¿¡ ÆíÁýÆÄÀÏÀÇ À̸§À» ÁÖ´Â ÄÚµå´Â »õ ¹®¼Ã¢À» ¸¸µå´Â NewChild ÇÔ¼ö¿Í ±âÁ¸ ¹®¼¸¦ ¿ÏÀüÈ÷ ¿¾úÀ» ¶§ÀÎ OpenFileToChild¿¡¸¸ ÀÖµµ·Ï Çß´Ù. ÀÌÁ¦ ÀÓ½ÃÀûÀÎ À̸§À¸·ÎºÎÅÍ ÅÇÀ» À߸ø ã´Â °æ¿ì°¡ ¾ø¾îÁú °ÍÀÌ´Ù.
¼¼ ¹ø° ¹ö±×´Â ´Ü¾î ã±â ÇÔ¼öÀÎ GetNowWord¿¡ Àִµ¥ ÀÌ ÇÔ¼ö´Â ¾ÕÂÊ ±¸ºÐÀÚ¸¦ ã°í ±¸ºÐÀÚ ´ÙÀ½ ¹®ÀÚºÎÅÍ ´ÙÀ½ ±¸ºÐÀÚ±îÁö¸¦ ´Ü¾î·Î °Ë»öÇÑ´Ù. ´Ü ¹®¼ óÀ½°ú ³¡, ±¸ºÐÀÚ°¡ ¿¬¼ÓÀÎ °æ¿ì¿¡ ´ëÇؼ´Â ¾ÕÂÊ ±¸ºÐÀÚ¿¡¼ ´ÙÀ½ ¹®ÀÚ·Î À̵¿ÇÏÁö ¾Ê°í ´ÙÀ½ ±¸ºÐÀÚ¸¦ ãµµ·Ï ÇÏ¿´´Ù. ÀÌ ÄÚµå´Â ´ë°³ÀÇ °æ¿ì ¹®Á¦°¡ ¾øÁö¸¸ ¾ÆÁÖ Æ¯º°ÇÑ °æ¿ì¿¡ Á¦´ë·Î µ¿ÀÛÇÏÁö ¾Ê´Â´Ù. ¾î¶² °æ¿ìÀΰ¡ ÇÏ¸é ¹®¼ óÀ½¿¡ ±¸ºÐÀÚ°¡ ÀÖ°í ´Ü¾î°¡ À̾îÁö´Â °æ¿ì, ±¸Ã¼ÀûÀÎ ¿¹¸¦ µéÀÚ¸é #include ¶ó´Â ¹®ÀÚ¿·Î ½ÃÀÛµÉ ¶§ÀÌ´Ù.
À̶§ include¸¦ ´õºíŬ¸¯Çصµ ´Ü¾î·Î ¼±ÅõÇÁö ¾Ê´Âµ¥ ¾ÕÂÊÀ¸·Î ±¸ºÐÀÚ #À» ãÀº ÈÄ ÀÌ ÀÚ¸®¿¡¼ ´ÙÀ½ ¹®ÀÚ·Î À̵¿ÇÏÁö ¾Ê°í ´ÙÀ½ ±¸ºÐÀÚ¸¦ ã±â ¶§¹®ÀÌ´Ù. ±×·¡¼ ¹®¼ÀÇ Ã³À½ÀÌ°í ù ¹®ÀÚ°¡ ±¸ºÐÀÚÀ̸é ÀÏ´Ü ÇÑ Ä ´ÙÀ½À¸·Î À̵¿ÇÑ ÈÄ ´Ü¾î¸¦ ãµµ·Ï ÇÏ¿´´Ù. if¹®ÀÇ nPos!=0 Á¶°Ç¿¡ ù ¹®ÀÚ°¡ ±¸ºÐÀÚÀÎÁö Á¶»çÇÏ´Â Á¶°ÇÀ» OR·Î ¿¬°áÇÑ´Ù. Áï ¹®¼ óÀ½ÀÌ´õ¶óµµ ±× À§Ä¡ÀÇ ¹®ÀÚ°¡ ±¸ºÐÀÚÀ̸é ÀÏ´Ü ±¸ºÐÀÚ¸¦ °Ç³Ê ¶Ùµµ·Ï ÇÔÀ¸·Î½á ±¸ºÐÀÚ ´ÙÀ½ÀÇ ´Ü¾î¸¦ ¼±ÅÃÇϵµ·Ï Çß´Ù.
void CApiEdit::GetNowWord(int nPos, int &s, int &e)
{
for (;;nPos--) {
if (IsDelimiter(nPos)==TRUE || nPos==0) {
break;
}
}
if ((nPos != 0 || IsDelimiter(nPos)) &&
nPos != doclen && IsDelimiter(nPos+1)==FALSE) {
nPos++;
}
s=nPos;
³× ¹ø° ¹ö±×´Â ºñ±³Àû °£´ÜÇÑ ½Ç¼ö¿¡¼ ºñ·ÔµÇ¾ú´Ù. UpdateLineInfo ÇÔ¼ö´Â Á¤·ÄÇÑ °á°ú ÃÑ ÁÙ ¼ö°¡ ¸¸ÁÙÀÌ ³Ñ¾î°¡°Å³ª ¶Ç´Â ¸¸ÁÙ ÀÌÇÏ·Î ÁÙ¾îµé ¶§ ¸¶Áø ÆøÀ» µ¿ÀûÀ¸·Î Á¶Á¤Çϱâ À§ÇØ WM_SIZE ¸Þ½ÃÁö¸¦ ´Ù½Ã º¸³»´Âµ¥ À̶§ GetXYFromOff°¡ ÂüÁ¶ÇÏ´Â off°¡ ¹«È¿À̱⠶§¹®¿¡ ¹«ÇÑ ·çÇÁ·Î ºüÁ®µå´Â ¹®Á¦°¡ ÀÖ´Ù. ÀÌ ¹®Á¦¸¦ ÇØ°áÇÏ·Á¸é ÀÏ´Ü UpdateLineInfo ÇÔ¼ö°¡ ¿ÏÀüÈ÷ ½ÇÇàÀ» ¸¶Ä£ ÈÄ ´Ù½Ã Á¤·ÄÇØ¾ß ÇϹǷΠSendMessage ´ë½Å PostMessage¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù.
´Ù¼¸ ¹ø° ¹ö±×µµ »ç¼ÒÇÑ ½Ç¼ö·Î ÀÎÇØ ¹ß»ýÇÑ °ÍÀε¥ ¹ö±×¶ó±âº¸´Ù´Â ÄÚµåÀÇ ¿ÀŸ¶ó°í º¸´Â °ÍÀÌ ¿ÀÈ÷·Á ¸ÂÀ» °Í °°´Ù. µ¤¾î¾²±â ¸ðµåÀÏ ¶§ SetCaret ÇÔ¼ö¿¡¼ ij·µÀ» ÇöÀç À§Ä¡ÀÇ ¹®ÀÚÆøÀ¸·Î °è»êÇϴµ¥ ÇöÀç À§Ä¡´Â off°¡ ¾Æ´Ï¶ó ÇÑ±Û Á¶¸³ÁßÀÏ ¶§ÀÇ À§Ä¡¸¦ °í·ÁÇÑ toff¿©¾ß ÇÑ´Ù.
void CApiEdit::SetCaret(BOOL bUpdatePrevX/*=TRUE*/, BOOL bScrollToCaret/*=TRUE*/)
{
....
if (bOvr) {
if (IsDBCS(toff)) {
if (buf[toff] == '\r') {
caretwidth=arChWidth[' '];
} else {
caretwidth=GetCharWidth(buf+toff,2);
}
} else {
caretwidth=GetCharWidth(buf+toff,1);
}
}
¿©¼¸ ¹ø° ¹ö±×´Â IsDBCS ¸â¹öÇÔ¼ö¿¡ Àִµ¥ ÀÌ ÇÔ¼ö¸¦ ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇÑ´Ù. IsDBCSLeadByte ÇÔ¼ö¸¦ »ç¿ëÇÏÁö ¾Ê°í ÃÖ»óÀ§ ºñÆ®°¡ 1ÀÎÁö º¸µµ·Ï Çß´Ù.
inline BOOL CApiEdit::IsDBCS(int nPos)
{
return ((buf[nPos] & 0x80) != 0/*IsDBCSLeadByte(buf[nPos])*/
|| (buf[nPos]==¡®\r¡¯ && buf[nPos+1]==¡®\n¡¯));
}
µÎ ¹æ½Ä°£ÀÇ Â÷ÀÌÁ¡Àº °ÅÀÇ ¾øÀ¸¸ç 0x80À¸·Î ½ÃÀ۵Ǵ ¹®ÀÚ¸¦ 2¹ÙÀÌÆ® ¹®ÀÚ·Î º¼ °ÍÀΰ¡ ¾Æ´Ï¸é 1¹ÙÀÌÆ® ¹®ÀÚ·Î º¼ °ÍÀΰ¡¸¸ ´Ù¸£´Ù. IsDBCSLeadByte ÇÔ¼ö´Â 0x80À» 1¹ÙÀÌÆ®·Î Á¶»çÇϴµ¥ ÀÌ µ¿ÀÛÀÌ ÇÑ±Û ¹®¼¿Í´Â ¸ÂÁö ¾Ê´Â °æ¿ì°¡ ÀÖ´Ù. Á¶ÇÕÇü ¹®¼¸¦ ÄÁ¹öÆÃÇÒ °æ¿ì 0x80¹®ÀÚ°¡ ³ªÅ¸³¯ ¼ö Àִµ¥ À̶§ ÀÌ ¹®ÀÚ¸¦ 2¹ÙÀÌÆ®·Î Á¶»çÇÏÁö ¾ÊÀ¸¸é ÇѱÛÀÇ °æ°è¿¡ °ÉÄ¡±â ¶§¹®¿¡ ´Ù¿îµÉ À§ÇèÀÌ ÀÖ´Ù. Åë»óÀÇ °æ¿ì 0x80ÄÚµå´Â ÅؽºÆ® ÆÄÀÏ¿¡ ³ªÅ¸³ªÁö ¾Ê±â ¶§¹®¿¡ Å« Â÷À̸¦ ´À³¢±â´Â ¾î·Æ´Ù.