¿©±â±îÁö ÀÚµ¿°³Çà ±â´ÉÀÇ ÇÙ½É ÇÔ¼öÀÎ GetLineSub ÇÔ¼ö¸¦ ÀÛ¼ºÇß´Ù. ÁÙÀÇ ³¡À» Á¦´ë·Î ãÀ» ¼ö ÀÖ°Ô µÇ¾úÀ¸¹Ç·Î ÀÌÁ¦ °ÅÀÇ ´Ù ¸¸µç °Å³ª ´Ù¸§¾ø°í ¸î¸î °ü·Ã ÇÔ¼öµé¸¸ °íÄ¡¸é µÈ´Ù. ÁÙ ³¡À» ã±â¸¸ ÇÑ´Ù°í Çؼ ÀÚµ¿°³ÇàÀÌ µÇ´Â °ÍÀÌ ¾Æ´Ï¶ó ´Ù¸¥ ÇÔ¼öµéµµ GetLineSub°¡ ã¾Æ³õÀº ÁÙ ³¡ Á¤º¸¸¦ Àß ÀÌ¿ëÇϵµ·Ï ¼öÁ¤µÇ¾î¾ß ÇÑ´Ù.
¸ÕÀú GetLine ÇÔ¼öÀÇ p+=2¸¦ ´ÙÀ½ ÄÚµå·Î ¼öÁ¤ÇÑ´Ù.
void GetLine(int Line, int &s, int &e)
{
....
if (*p == ¡®\r¡¯) {
p+=2;
}
p+=2´Â ÁÙÀÇ ³¡À» ãÀº ÈÄ¿¡ ´ÙÀ½ ÁÙÀÇ Ã³À½À¸·Î À̵¿Çϱâ À§ÇØ \r\nÀ» °Ç³Ê ¶Ù´Â ÄÚµåÀÌ´Ù. ±×·¯³ª ÀÚµ¿°³ÇàÀÌ µÇ´Â Áö±ÝÀº ¹«Á¶°Ç µÎ Ä µÚ·Î À̵¿Çؼ´Â ¾ÈµÇ¸é °³ÇàÄڵ忡 ÀÇÇØ °Á¦ °³ÇàµÈ °æ¿ì¸¸ À̵¿ÇØ¾ß ÇÑ´Ù. ÀÚµ¿°³ÇàµÈ °æ¿ì´Â ¾ÆÁ÷ ¹°¸®ÀûÀÎ ÁÙÀÌ ¿ÏÀüÈ÷ ³¡³ªÁö ¾Ê¾ÒÀ¸¸ç ¹Ù·Î µÚ¿¡ ¹®ÀÚ°¡ °è¼Ó ÀÖ´Ù.
ÀÚµ¿°³ÇàµÈ °æ¿ì ¾Õ ÁÙÀÇ ³¡Àº ´ÙÀ½ ÁÙÀÇ ½ÃÀÛ°ú °°Àº À§Ä¡°¡ µÈ´Ù. ±×·¡¼ ÀÌ °æ¿ì´Â p+=2¸¦ ½ÇÇàÇÏÁö ¸»¾Æ¾ß ÇÑ´Ù.
¿ÀÇÁ¼ÂÀ¸·ÎºÎÅÍ Çà·ÄÀ» ã´Â ÇÔ¼öµµ ´ÙÀ½°ú °°ÀÌ ¼öÁ¤µÇ¾î¾ß ÇÑ´Ù.
void GetRCFromOff(int nPos, int &r, int &c)
{
int s,e;
TCHAR *p=buf;
r=0;
if (nWrap==0) {
while (p-buf != nPos) {
if (*p==¡®\r¡¯)
r++;
p++;
}
GetLine(r,s,e);
} else {
for (;;r++) {
GetLine(r,s,e);
if (nPos >= s && nPos < e)
break;
if (nPos == e) {
if (buf[e] == 0 || buf[e] == ¡®\r¡¯) {
break;
}
}
}
}
c=nPos-s;
}
ÀÚµ¿°³ÇàÀ» ÇÏÁö ¾ÊÀ» °æ¿ìÀÇ ÄÚµå´Â ÀÌÀü°ú µ¿ÀÏÇÏ¸ç ¿£ÅÍÄÚµåÀÇ °³¼ö¸¦ ¼¼¸é ÁÙ¹øÈ£¸¦ ±¸ÇÒ ¼ö ÀÖ´Ù. ±×·¯³ª ÀÚµ¿°³Çà »óÅ¿¡¼´Â ÇÑ ÁÙÀÌ È¸é»ó¿¡ ¿©·¯ ÁٷΠǥ½ÃµÉ ¼ö Àֱ⠶§¹®¿¡ ¿£ÅÍÄڵ带 ¼¼´Â °Í¸¸À¸·Î´Â ÁÙ¹øÈ£¸¦ ±¸ÇÒ ¼ö ¾ø´Ù.
GetLineÀ¸·Î ÁÙÀÇ ¹üÀ§¸¦ °Ë»çÇÏ°í nPos°¡ ÀÌ ¹üÀ§¾È¿¡ ÀÖÀ» ¶§±îÁö °è¼Ó ÁÙÀ» Áõ°¡½ÃÅ°¸é nPos°¡ ¸î ¹ø° ÁÙ¿¡ ÀÖ´ÂÁö ¾Ë ¼ö ÀÖ´Ù. GetLineÀÌ ÀÚµ¿°³Çà »óŸ¦ °í·ÁÇÏ¿© ÁÙÀÇ ¹üÀ§¸¦ ¾Ë¾Æ¼ Á¶»çÇϱ⠶§¹®ÀÌ´Ù. ´Ü, °³ÇàÄÚµå¿Í ¹®¼ ³¡Àº GetLineÀÌ ÁÙÀÇ ¹üÀ§¿¡¼ Á¦¿ÜÇϹǷΠµû·Î °Ë»çÇØ¾ß ÇÑ´Ù. ÀÌ °Ë»ç¸¦ »ý·«Çϸé nPos°¡ ¿£ÅÍÄÚµåÀÏ °æ¿ì ÀÌ ÁÙÀº ¿µ¿øÈ÷ ¸ø ã°Ô µÉ °ÍÀÌ´Ù.
±×·¯³ª ÀÌ °Ë»ç¸¦ ¸Å¹ø ¼öÇàÇÒ ÇÊ¿ä´Â ¾ø´Ù. ¿Ö³ÄÇÏ¸é °³ÇàÄÚµå¿Í ¹®¼ÀÇ ³¡Àº ÁÙÀÇ ³¡ À§Ä¡ÀÎ e¿¡¼¸¸ ³ªÅ¸³¯ ¼ö Àֱ⠶§¹®ÀÌ´Ù. ÁÙÀÇ Áß°£¿¡ °³ÇàÄڵ尡 ÀÖ´Ù¸é ±×°ÍÀº Á¤·Ä·çƾÀÌ À߸øµÇ¾ú´Ù´Â ¶æÀÌ´Ù. nPos°¡ eÀÎ °æ¿ì¸¸ °Ë»çÇÏ¸é µÇ¸ç ÀÌ °Ë»ç·Î ÀÎÇÑ ¼Óµµ»óÀÇ ºÒÀÌÀÍÀº °ÅÀÇ ¾ø´Ù.
ÀÌ ÇÔ¼ö´Â ÀÚµ¿°³Çà »óÅÂÀÎ °æ¿ì¿Í ±×·¸Áö ¾ÊÀº °æ¿ìÀÇ Äڵ带 µû·Î ½ÇÇàÇÏ°í ÀÖ´Ù. »ç½Ç ÀÚµ¿°³Çà »óÅ°¡ ¾Æ´Ñ °æ¿ì¶óµµ ÀÚµ¿°³ÇàµÈ °æ¿ìÀÇ ÄÚµå·Î ÁÙ¹øÈ£¸¦ Á¶»çÇÒ ¼ö ÀÖ´Ù. GetLineÀÌ ÀÌ¹Ì ÀÚµ¿°³Çà »óŸ¦ °í·ÁÇÏ¿© ÁÙ ¹üÀ§¸¦ Á¶»çÇϱ⠶§¹®ÀÌ´Ù. ±×·¯³ª ±»ÀÌ ÀÌ µÎ Äڵ带 µû·Î µÎ´Â ÀÌÀ¯´Â ½ÇÇà¼Óµµ¸¦ Á¶±ÝÀÌ¶óµµ Çâ»ó½ÃÅ°±â À§ÇؼÀÌ´Ù. ÀÚµ¿°³Çà »óÅ°¡ ¾Æ´Ñ °æ¿ì´Â ±»ÀÌ ´À·ÁÅÍÁø GetLine ÇÔ¼ö¸¦ ºÎ¸¦ ÇÊ¿ä¾øÀÌ ¿£ÅÍÄÚµåÀÇ °³¼ö¸¸ ¼¼¾î º¸¸é µÈ´Ù.
<Del>Å°·Î ÇöÀç À§Ä¡ÀÇ ¹®ÀÚ¸¦ »èÁ¦ÇÒ ¶§ ¿ÀÇÁ¼ÂÀº º¯°æµÇÁö ¾Ê´Â´Ù. ¹®ÀÚ¸¦ »èÁ¦Çصµ ¿ÀÇÁ¼ÂÀº ¿©ÀüÈ÷ ±× ÀÚ¸®¿¡ ¸Ó¹«¸£°Ô µÇ¸ç µû¶ó¼ ij·µÀ» ¿Å±æ ÇÊ¿äµµ ¾ø´Ù. ±×·¡¼ VK_DELETE ó¸®Äڵ忡¼´Â SetCaretÀ» È£ÃâÇÏÁö ¾Ê¾Ò´Ù. ¹Ý¸é <BS>Å°´Â ¾ÕÂÊ ¹®ÀÚ¸¦ »èÁ¦Çϱ⠶§¹®¿¡ ¿ÀÇÁ¼ÂÀÌ ÀÌÀü ¹®ÀÚ·Î À̵¿ÇÏ°Ô µÇ°í ij·µµµ ¿Å°ÜÁÖ¾î¾ß ÇÑ´Ù.
±×·¯³ª ÀÚµ¿°³Çà ±â´ÉÀÌ µé¾î°¨À¸·Î½á ÀÌ·± »çÁ¤ÀÌ ´Þ¶óÁö°Ô µÈ´Ù. <Del>Å°¸¦ ´©¸¦ ¶§ ¿ÀÇÁ¼ÂÀÌ º¯ÇÏÁö ¾Ê´Â °ÍÀº ¿©ÀüÇÏÁö¸¸ °°Àº ¿ÀÇÁ¼ÂÀÌ¶óµµ Á¤·Ä »óÅ¿¡ µû¶ó ij·µÀÇ À§Ä¡´Â ´Þ¶óÁú ¼ö Àֱ⠶§¹®ÀÌ´Ù. ´ÙÀ½ ±×¸²À» º¸ÀÚ.
À§¿¡ ÇÑ ÁÙÀÌ ÀÖ°í °³ÇàÇÏÁö ¾ÊÀº »óÅ¿¡¼ abcde¸¦ ÀÔ·ÂÇߴµ¥ ÀÌ ´Ü¾î°¡ ÀÁÙÀÇ ¿À¸¥ÂÊ ¿©¹é¿¡ µé¾î°¥ ¼ö ¾ø±â ¶§¹®¿¡ ¾Æ·¡ÁÙ·Î ÀÚµ¿°³ÇàµÇ¾ú´Ù. ¡®c¡¯¹®ÀÚ À§Ä¡¿¡ ij·µÀ» µÎ°í <Del>Å°¸¦ ´©¸£¸é ÀÌ ¹®ÀÚ°¡ »èÁ¦µÇ¸é¼ ¡®abde¡¯°¡ µÇ°í ÀÌ ´Ü¾î´Â À§ÂÊ ¿©¹é¿¡ µé¾î°¥ ¼ö ÀÖ°Ô µÈ´Ù. À̶§ ij·µÀ» ¿Å°ÜÁÖÁö ¾ÊÀ¸¸é ij·µÀÌ Æ²¸° À§Ä¡¸¦ °¡¸®Å°°Ô µÈ´Ù. ¹®ÀÚ¿Àº Á¤·Ä ±â´É¿¡ ÀÇÇØ À§·Î ¿Ã¶ó°¬´Âµ¥ ij·µÀº ¹®ÀÚ¸¦ µû¶ó °¡Áö ¸øÇÏ´Â °ÍÀÌ´Ù.
ÀÚµ¿°³Çà ±â´É¿¡ ÀÇÇØ ¹®ÀÚ »èÁ¦½Ã Á¤·ÄÀÌ ¹Ù²ð ¼ö ÀÖ°í µû¶ó¼ VK_DELETE¿¡¼µµ ij·µÀ» ¿Å°Ü¾ß ÇÑ´Ù. <BS>Å°µµ ¹°·Ð ij·µÀ» ¿Å°Ü¾ß ÇÏÁö¸¸ VK_DELETE¿¡¼ ij·µÀ» ¿Å°ÜÁֱ⠶§¹®¿¡ VK_BACK¿¡¼´Â SetCaretÀ» È£ÃâÇÒ ÇÊ¿ä°¡ ¾ø´Ù. VK_BACK¿¡ ÀÖ´Â SetCaret¹®À» VK_DELETE·Î ¿Å°å´Ù.
void OnKey(HWND hWnd, UINT vk, BOOL fDown, int cRepeat, UINT flags)
{
....
case VK_DELETE:
if (IsDBCS(buf,off)) {
Delete(off, 2);
} else {
Delete(off, 1);
}
InvalidateRect(hWnd,NULL,TRUE);
SetCaret();
return;
case VK_BACK:
if (off == 0)
return;
off=GetPrevOff(off);
SendMessage(hWnd,WM_KEYDOWN,VK_DELETE,0);
return;
ÀÚµ¿°³Çà°ú °ü·ÃµÈ ¸¶Áö¸· ÀÛ¾÷Àº À©µµ¿ìÀÇ Å©±â¸¦ ¹Ù²Ü ¶§ ij·µÀÇ À§Ä¡¸¦ ´Ù½Ã °è»êÇÏ´Â °ÍÀÌ´Ù. ÀÚµ¿°³Çà »óÅ¿¡¼ À©µµ¿ìÀÇ ÆøÀÌ ¹Ù²î¸é ÀüüÀûÀ¸·Î ¹®¼°¡ ÀçÁ¤·ÄµÉ °ÍÀÌ°í µû¶ó¼ ij·µÀÇ À§Ä¡µµ »õ·Î Á¤·ÄµÈ °÷À¸·Î ¿Å°Ü¾ß ÇÑ´Ù. OnSize¿¡¼ SetCaret ÇÔ¼ö¸¸ È£ÃâÇÏ¸é ³ª¸ÓÁö 󸮴 SetCaretÀÌ ¾Ë¾Æ¼ ÇÑ´Ù.
void OnSize(HWND hWnd, UINT state, int cx, int cy)
{
if (state != SIZE_MINIMIZED) {
if (GetFocus()==hWnd) {
SetCaret();
}
}
}
´Ü, À©µµ¿ì°¡ ÃÖ¼ÒÈ µÉ ¶§´Â SetCaretÀ» ºÎ¸£Áö ¸»¾Æ¾ß ÇÑ´Ù. ¿Ö³ÄÇϸé ÃÖ¼ÒȽà À©µµ¿ìÀÇ ÆøÀº 0ÀÌ µÇ°í ÀÌ »óÅ¿¡¼´Â ¾î¶² Á¤·Äµµ ½ÇÆÐÇÑ´Ù. ÆøÀÌ 0À̹ǷΠ´Ü Çѹ®ÀÚµµ Áý¾î ³ÖÀ» ¼ö ¾ø±â ¶§¹®ÀÌ´Ù. À̶§´Â ±×³É ¾Æ¹« °Íµµ ¾Ê°í °¡¸¸È÷ ÀÖÀ¸¸é µÈ´Ù. ¶ÇÇÑ ÀÌ À©µµ¿ì°¡ Æ÷Ä¿½º¸¦ °¡Áö°í ÀÖÀ» ¶§¸¸ ij·µÀÇ À§Ä¡¸¦ Á¶Á¤ÇÒ ÇÊ¿ä°¡ ÀÖ´Ù. Æ÷Ä¿½º°¡ ¾øÀ¸¸é ij·µÀÌ º¸ÀÌÁö ¾Ê¾Æ¾ß ÇϹǷΠSetCaretÀ» È£ÃâÇÏÁö ¸»¾Æ¾ß ÇÑ´Ù.
GetLineSub ÇÔ¼ö´Â óÀ½ ºÁ¼ ¹Ù·Î ÀÌÇØ°¡ µÉ ¸¸Å °£´ÜÇÏÁö´Â ¾Ê´Ù. ±×·¯³ª °á°ú¸¦ ºÐ¼®Çغ¸¸é ÀÌÇØÇϱ⠾î·Á¿î Á¤µµ´Â ¾Æ´Ï´Ù. °á°ú´Â ÀÌÇØÇß´Ù Ä¡°í ÀÌ ÇÔ¼ö Á¦ÀÛ °úÁ¤¿¡¼ ¾î¶² ÇÔÁ¤µéÀÌ ÀÖ¾ú´ÂÁö ±¸°æÇغ¸µµ·Ï ÇÏÀÚ.
·çÇÁÀÇ Å»Ãâ Á¶°ÇÀº ¾Õ¿¡¼ »ìÆì ºÃµíÀÌ ¼¼ °¡Áö°¡ Àִµ¥ ´ëµîÇÑ Á¶°Ç¹® °°Áö¸¸ ÀÌ ¼¼ Á¶°ÇÀ» Á¡°ËÇÏ´Â ¼ø¼¿¡ Àǹ̰¡ ÀÖ´Ù. \r, \0, Æø³Ñħ ¼ø¼´ë·Î Á¡°ËÀ» Çϴµ¥ ÀÌ ¼ø¼¸¦ Æø³Ñħ, \r, \0·Î ¹Ù²Ù¾î º¸µµ·Ï ÇÏÀÚ. ±×¸®°í ´ÙÀ½ ¹®ÀåÀ» ÀÔ·ÂÇغ¸¾Æ¶ó. Áõ¼¼¸¦ Á¤È®ÇÏ°Ô È®ÀÎÇϱâ À§Çؼ´Â À©µµ¿ì ÆøÀ» ÃʱⰪÀÎ 300À¸·Î ¸ÂÃç ³õ¾Æ¾ß ÇÏ¸ç µðÆúÆ® ½Ã½ºÅÛ ÆùÆ®¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù.
Á¤·Ä Å×½ºÆ® °¡³ª´Ù¶ó¸¶¹Ù»ç¾ÆÀÚÂ÷īŸ. ÀÌ»óÇÏ´Ù.
¡®Å¸¡¯ÀÚ±îÁö ÀÔ·ÂÇÑ ÈÄ ¸¶Ä§Ç¥¸¦ ÂïÀ¸¸é ÀÌ ¸¶Ä§Ç¥°¡ ¾Æ·¡ÁÙ·Î ³»·Á°£´Ù. ÀÌ »óÅ¿¡¼ °ø¹éÀ» ÀÔ·ÂÇÏ¸é ¸¶Ä§Ç¥¿Í °ø¹éÀÌ ´Ù½Ã À§·Î ¿Ã¶ó°£´Ù.
ÇÑ ¹ø ³»·Á°£ ±ÛÀÚ°¡ À§·Î ´Ù½Ã ¿Ã¶ó°¡´Â °ÍÀº ¹º°¡ Á¤·Ä Äڵ尡 Á¦´ë·Î µÇ¾î ÀÖÁö ¾Ê±â ¶§¹®ÀÌ´Ù. Á¶°Ç Á¡°ËÀÇ ¼ø¼¸¦ ¹Ù²Ù¸é ¿Ö ÀÌ·± Çö»óÀÌ ÀϾ´ÂÁö´Â ÄûÁî·Î ³²°Ü µÎ±â·Î ÇÑ´Ù. µð¹ö°Å·Î µð¹ö±ëÇغ¸¸é ±× ÀÌÀ¯¸¦ ¾Ë ¼ö ÀÖÀ» °ÍÀÌ´Ù.
¿©±â±îÁö Äڵ带 ÀÛ¼ºÇÑ ÈÄ ½ÇÇàÇغ¸¸é ÀÚµ¿°³Çà ±â´ÉÀÌ Àß µ¿ÀÛÇÒ °ÍÀÌ´Ù. ÆíÁýâÀÇ ¿À¸¥ÂÊ ³¡¿¡ ´êÀ¸¸é ´ÙÀ½ ÁÙ·Î ¾Ë¾Æ¼ ³»·Á°¡°í À©µµ¿ì Å©±â°¡ ¹Ù²î¸é ¹®¼ Àüü°¡ ÀçÁ¤·ÄµÇ¾î ¸ð¾çÀÌ ¿ÏÀüÈ÷ ¹Ù²î°Ô µÉ °ÍÀÌ´Ù.