µé¿©¾²±â(Indent) ±â´ÉÀº ÁÙ ¾Õ¿¡ ÅÇÀ̳ª °ø¹éÀ» »ðÀÔÇÏ¿© Àû´çÈ÷ ¿©¹éÀ» ¶ç¿ö ÁÖ´Â ±â´ÉÀÌ¸ç ¼Ò½º Äڵ带 ÀÛ¼ºÇÒ ¶§ ÁÖ·Î ¸¹ÀÌ »ç¿ëµÈ´Ù. ¹®¼ ÀÛ¼ºÁß¿¡ ÀÚµ¿À¸·Î µé¿©¾²±â¸¦ ÇÒ ¼öµµ ÀÖ°í ÀÌ¹Ì ÀÛ¼ºµÈ ¹®¼ÀÇ µé¿©¾²±â¸¦ Á¶Á¤ÇÒ ¼öµµ ÀÖ´Ù. C ÇÁ·Î±×·¡¹ÖÀ» ÇÏ°í ÀÖ´Â »ç¶÷À̶ó¸é µé¿©¾²±âÀÇ °³³ä¿¡´Â ¾ÆÁÖ Àͼ÷ÇÒ °ÍÀÌ¸ç ´ÙÀ½ Àý¿¡¼ ½Ç½ÀÇØ º¼ °ÍÀÌ´Ù.
µé¿©¾²±â´Â Ç×»ó ¹®´Ü ´ÜÀ§·Î µ¿ÀÛÇÏ¸ç ¿£ÅÍÄÚµå·Î ²÷¾îÁø ¹®´ÜÀÇ ¼±µÎ¿¡ ´ëÇؼ¸¸ Àû¿ëµÈ´Ù. ÁÙ´ÜÀ§·Î µé¿©¾²±â¸¦ ÇÏ´Â °ÍÀÌ ¾Æ´Ï¹Ç·Î ÀÚµ¿°³ÇàµÈ ÁÙÀÇ ¼±µÎ¿¡´Â µé¿©¾²±â°¡ Àû¿ëµÇÁö ¾Ê´Â´Ù. µé¿©¾²±â ÇÔ¼ö°¡ ¹®¼¸¦ Á¶ÀÛÇÏ´Â ´ÜÀ§°¡ ¹®´ÜÀ̹ǷΠµé¿©¾²±â ±â´ÉÀ» ±¸ÇöÇϱâ Àü¿¡ ¸ÕÀú ¹®´ÜÀ» °ü¸®ÇÒ ¼ö ÀÖ´Â ÇÔ¼öÀÇ ÁýÇÕÀ» Á¤ÀÇÇÒ ÇÊ¿ä°¡ ÀÖ´Ù. ApiEdit.h¿¡ ´ÙÀ½ ¸â¹öÇÔ¼öÀÇ ¿øÇüÀ» ¼±¾ðÇÑ´Ù.
class CApiEdit
{
....
void GetParaFromOff(int nPos, int &pr, int &pc);
int GetOffFromPara(int pr, int pc);
int GetParaFirstLine(int nPara);
int GetParaLastLine(int nPara);
ÇÔ¼öÀÇ À̸§À» º¸¸é ¾î¶² °ªÀ¸·ÎºÎÅÍ ¹«¾ùÀ» ã¾Æ³»´ÂÁö ½±°Ô ¾Ë ¼ö ÀÖÀ» °ÍÀÌ´Ù. ¿¹¸¦ µé¾î GetParaFirstLineÀº ParaÀÇ First LineÀ» GetÇÑ´Ù. ÇÔ¼öÀÇ À̸§¿¡¼ º¼ ¼ö ÀÖ´Ù½ÃÇÇ ÀÌ ÇÔ¼öµéÀº GetOffFromRC, GetXYFromOff ·ùÀÇ ÇÔ¼ö¿Í ºñ½ÁÇÑ ±â´ÉÀ» ¼öÇàÇÏ¸ç ±× ´ÜÀ§°¡ ÁÙÀÌ ¾Æ´Ñ ¹®´ÜÀ̶ó´Â Á¡¸¸ ´Ù¸£´Ù. ApiEdit ÄÁÆ®·ÑÀÇ ÇÙ½ÉÀÌ µÇ´Â ¾ÆÁÖ Áß¿äÇÑ ÇÔ¼öµéÀÓ¿¡µµ ºÒ±¸ÇÏ°í ÀÌ ÇÔ¼öÀÇ ÀÛ¼º ½Ã±â°¡ ¸¹ÀÌ ´Ê¾îÁø °Í °°´Ù. ÄÚµå´Â ´ÙÀ½°ú °°´Ù.
int CApiEdit::GetParaFirstLine(int nPara)
{
int Upper,Lower;
int r;
Lower=0;
Upper=TotalLine-1;
if (nPara < 0 || nPara > pLine[Upper].nPara) {
return -1;
}
for (;;) {
r=(Upper+Lower)/2;
if (pLine[r].nPara == nPara) {
return r-pLine[r].nLine;
}
if (pLine[r].nPara > nPara) {
Upper=r-1;
} else {
Lower=r+1;
}
}
}
int CApiEdit::GetParaLastLine(int nPara)
{
int r;
r=GetParaFirstLine(nPara+1);
if (r==-1) {
return TotalLine-1;
} else {
return r-1;
}
}
void CApiEdit::GetParaFromOff(int nPos, int &pr, int &pc)
{
int r,c;
GetRCFromOff(nPos,r,c);
r=r-pLine[r].nLine;
pr=pLine[r].nPara;
pc=nPos-pLine[r].Start;
}
int CApiEdit::GetOffFromPara(int pr, int pc)
{
int r,re;
r=GetParaFirstLine(pr);
if (r==-1) {
return -1;
}
re=GetParaLastLine(pr);
if (pLine[r].Start+pc <= pLine[re].End) {
return pLine[r].Start+pc;
} else {
return -1;
}
}
°¡Àå ±âº»ÀÌ µÇ´Â ÇÔ¼ö´Â GetParaFirstLine ÇÔ¼öÀε¥ ÀÌ ÇÔ¼ö´Â Àμö·Î ¹®´Ü¹øÈ£¸¦ ÁÖ¸é ÀÌ ¹®´Ü¿¡ ¼ÓÇÑ Ã¹ ¹ø° ÁÙÀ» ã¾ÆÁØ´Ù. ÀÌ °Ë»ö¿¡ ÂüÁ¶µÇ´Â Á¤º¸´Â ¹°·Ð Á¤·ÄÁ¤º¸ÀÎ pLineÀε¥ pLineÀº °¢ ÁÙº°·Î ¹®´Ü(nPara)°ú ¹®´Ü ³»ÀÇ ÁÙ¹øÈ£(nLine)¸¦ ÀúÀåÇÏ°í ÀÖ´Ù. ÁÙ¹øÈ£·ÎºÎÅÍ ¹®´Ü¹øÈ£¸¦ ã´Â °ÍÀº pLine[r].nPara¸¸ ÀÐÀ¸¸é µÇ¹Ç·Î ¾ÆÁÖ ½±Áö¸¸ ¹Ý´ë·Î ¹®´Ü¹øÈ£·Î ÁÙ¹øÈ£¸¦ ãÀ¸·Á¸é ½±Áö ¾Ê´Ù.
´ÙÇàÈ÷ pLine ¹è¿Àº ¹®´Ü¹øÈ£°¡ ¿À¸§Â÷¼øÀ¸·Î Á¤·ÄµÇ¾î ÀÖÀ¸¹Ç·Î À̺Р°Ë»öÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù. ÀÏ´Ü ¹®´Ü¿¡ ¼ÓÇÑ ÁÙ¹øÈ£¸¦ ãÀ¸¸é ±× ¹®´Ü ³»¿¡¼ nLineÀÌ 0ÀÎ ÁÙ, Áï ù ¹ø° ÁÙÀÇ ¹øÈ£¸¦ ½±°Ô ±¸ÇÒ ¼ö ÀÖ´Ù. ¸ðµÎ 15ÁÙ·Î ±¸¼ºµÈ ´ÙÀ½ ¹®¼¸¦ ¿¹·Î µé¾î ÀÌ ÇÔ¼ö°¡ 1¹ø ¹®´ÜÀÇ Ã¹ ¹ø° ÁÙÀ» ã´Â µ¿ÀÛÀ» °üÂûÇغ¸ÀÚ.
TotalLineÀÌ 15À̹ǷΠ¸¶Áö¸· ÁÙÀÇ ¹øÈ£´Â 14°¡ µÈ´Ù. ù ´Ü°è¿¡¼ °Ë»ö ´ë»óÀº Áß°£ ÁöÁ¡ÀÎ 7¹ø ÁÙÀÌ µÇ´Âµ¥ ÀÌ ÁÙÀÇ ¹®´Ü°ªÀ» º¸´Ï 2·Î µÇ¾î ÀÖÀ¸¸ç ã°íÀÚ ÇÏ´Â 1¹ø ¹®´Ü º¸´Ù´Â ´õ µÚÀÇ ¹®´ÜÀÎ °ÍÀÌ´Ù. ±×·¡¼ UpperÀÇ ´ÙÀ½ ´Ü°è´Â R1º¸´Ù Çϳª ÀÛÀº 6ÀÌ µÈ´Ù.
µÎ ¹ø° R2°ªÀº 6ÀÇ Àý¹ÝÀÎ 3ÀÌ µÇ¸ç ÀÌ ÁÙÀÇ ¹®´Ü¹øÈ£¸¦ Á¶»çÇغ¸´Ï ã°íÀÚ ÇÏ´Â 1¹ø ¹®´Ü°ú °°´Ù. Áï 3¹ø ÁÙÀÌ Ã£´Â ¹®´Ü¿¡ ¼ÓÇÑ ÁÙÀ̶ó´Â °ÍÀ» ¾Ë ¼ö ÀÖÀ¸¸ç ¹®´ÜÀº ÀÌ¹Ì Ã£Àº °ÍÀÌ´Ù. ¹®´ÜÀ» ãÀº ÈÄ¿¡´Â ±× ¹®´ÜÀÇ Ã¹ ÁÙÀ» ã´Âµ¥ R2¿¡¼ ½ÃÀÛÇÏ¿© nLineÀÌ 0ÀÌ µÉ ¶§±îÁö °Å²Ù·Î °Å½½·¯ ¿Ã¶ó°¡¸é µÈ´Ù. R2ÀÇ nLineÀº ÇöÀç 2·Î Á¤ÀǵǾî ÀÖÀ¸¹Ç·Î R2´Â 1¹ø ¹®´ÜÀÇ ¼¼ ¹ø° ÁÙÀÌ´Ù. Áï ÀÌ ÁÙÀÇ µÎ Ä À§¿¡ ¹®´Ü ù ÁÙÀÌ ÀÖ´Ù´Â ¾ê±â´Ù.
¸¶Áö¸·À¸·Î R2ÀÇ ÁÙ¹øÈ£¿¡¼ ÀÌ ÁÙÀÇ nLineÀ» »« °ªÀ» °è»êÇؼ ¸®ÅÏÇϸé 1¹ø ¹®´ÜÀÇ Ã¹ ¹ø° ÁÙÀ» ã°Ô µÇ´Â °ÍÀÌ´Ù. ÁÙ¹øÈ£´Â Ç×»ó ±× ÁÙÀÇ nLineº¸´Ù Å©±â ¶§¹®¿¡ r-pLine[r].nLineÀº Ç×»ó 0 ÀÌ»óÀ̶ó´Â °ÍÀÌ º¸ÀåµÇ¹Ç·Î ¹è¿¹üÀ§¸¦ ¹þ¾î³¯ À§ÇèÀº Àý´ë·Î ¾ø´Ù.
ÀÌ ÇÔ¼ö´Â °Ë»öÀ» ½ÃÀÛÇϱâ Àü¿¡ nPara°¡ °ú¿¬ Á¦´ë·Î Àü´ÞµÈ °ªÀÎÁö °Ë»ç¸¦ Çϴµ¥ nPara´Â 0 ÀÌ»óÀ̾î¾ß ÇÏ°í ¶ÇÇÑ ¸¶Áö¸· ÁÙÀÇ ¹®´Ü¹øÈ£º¸´Ù Ŭ ¼ö´Â ¾øÀ¸¹Ç·Î ÀÌ ¹üÀ§¸¦ ¹þ¾î³ª¸é ÁÙ¹øÈ£·Î -1À» ¸®ÅÏÇÏ¿© ¿¡·¯°¡ ¹ß»ýÇßÀ½À» ¾Ë·ÁÁØ´Ù. È£ÃâÃø¿¡¼ nPara Àμö¸¸ Á¤È®ÇÏ°Ô Àü´ÞÇÑ´Ù¸é ÀÌ·± ¿¡·¯ 󸮴 ±»ÀÌ ÇÊ¿äÄ¡ ¾Ê´Ù. ÇÏÁö¸¸ ÀÌ ¿¡·¯ 󸮸¦ ±³¹¦ÇÏ°Ô ÀÌ¿ëÇÏ¸é ´Ù¸¥ ·çƾµéÀÌ Á» ´õ °£´ÜÇØÁö´Â È¿°ú°¡ Àִµ¥ GetParaLastLine ÇÔ¼ö¿¡¼ ÀÌ ¿¡·¯ »óȲÀ» È°¿ëÇÏ´Â ¿¹¸¦ º¼ ¼ö ÀÖ´Ù.
¹®´ÜÀÇ ¸¶Áö¸· ÁÙÀº ±× ´ÙÀ½ ¹®´ÜÀÇ Ã¹ ÁÙ ¹Ù·Î À§¿¡ ÀÖ´Â ÁÙÀÌ´Ù. ±×·¡¼ nParaÀÇ ¸¶Áö¸· ÁÙÀº nPara+1¹®´ÜÀÇ Ã¹ ÁÙ-1·Î ±¸ÇÑ´Ù. ´Ü, ¸¸¾à nPara°¡ ¹®¼ÀÇ ¸¶Áö¸· ¹®´ÜÀÏ °æ¿ì´Â ÀÌ ´Ü¼øÇÑ °è»êÀÌ ÅëÇÏÁö ¾Ê´Âµ¥ ¿Ö³ÄÇϸé nPara+1ÀÌ Á¸ÀçÇÏÁö ¾Ê±â ¶§¹®ÀÌ´Ù. ÀÌ °æ¿ì GetParaFirstLineÀº -1À̶ó´Â °ªÀ» ¸®ÅÏÇϴµ¥ ±×·¸´Ù¸é nParaÀÇ ¸¶Áö¸· ÁÙÀº TotalLine-1·Î °£´ÜÇÏ°Ô ±¸ÇÒ ¼ö ÀÖ´Ù. ±×·¸Áö ¾Ê´Ù¸é nPara+1 ¹®´ÜÀÇ Ã¹ ÁÙ¿¡¼ 1À» »©ÁØ ÁÙ¹øÈ£¸¦ ¸®ÅÏÇÑ´Ù.
¿ÀÇÁ¼ÂÀ¸·ÎºÎÅÍ ¹®´Ü¹øÈ£¸¦ ±¸ÇÏ´Â ¹æ¹ýµµ ¾ÆÁÖ °£´ÜÇÏ´Ù. µÑ ´Ù pLine ¹è¿¿¡ ÀÖ´Â Á¤º¸ÀÌÁö¸¸ ¼·Î ¿¬°üµÇ¾î ÀÖÁö ¾Ê±â ¶§¹®¿¡ Á÷Á¢ÀûÀ¸·Î ±¸ÇÒ ¼ö ¾øÀ¸¸ç ÁÙ¹øÈ£¸¦ ÅëÇØ °£Á¢ÀûÀ¸·Î ¼·Î¸¦ ±¸ÇØ¾ß ÇÑ´Ù. Àü´ÞµÈ ¿ÀÇÁ¼Â nPos·ÎºÎÅÍ ÀÌ ¿ÀÇÁ¼ÂÀÌ ÀÖ´Â ÁÙ¹øÈ£ rÀ» ¸ÕÀú ã´Â´Ù. ±×¸®°í pLine[r].nPara¸¦ ÀÐÀ¸¸é ÀÌ °ªÀÌ ¹Ù·Î nPos°¡ ¼ÓÇÑ ¹®´ÜÀÌ´Ù.
¹®´Ü ³»ÀÇ Ä ¹øÈ£ÀÎ pc´Â nPos¿¡¼ ¹®´ÜÀÇ Ã¹ ÁÙ ½ÃÀÛ ¹øÁö¸¦ »©¸é µÈ´Ù. ±×·¡¼ rÀ» ¹®´ÜÀÇ Ã¹ ÁÙ·Î ¿Ã¸° ÈÄ nPos-pLine[r].Start¸¦ °è»êÇß´Ù. ¹®´Ü¹øÈ£¿Í ¹®´Ü Ä ¹øÈ£·ÎºÎÅÍ ¿ÀÇÁ¼ÂÀ» ±¸ÇÏ´Â ¹æ¹ýÀº Áö±ØÈ÷ °£´ÜÇؼ ´ÙÀ½ ÇÑ ÁÙÀÌ¸é ±¸ÇÒ ¼ö ÀÖ´Ù.
return pLine[GetParaFirstLine(pr)].Start+pc
¹®´Ü ù ÁÙÀÇ ½ÃÀÛ ¿ÀÇÁ¼Â°ú ¹®´Ü ³»ÀÇ Ä ¹øÈ£¸¦ ´õÇØ ¸®ÅÏÇϱ⸸ ÇÏ¸é µÈ´Ù. ´Ü, pc°¡ ÀÌ ¹®´Ü ¹üÀ§¸¦ ¹þ¾î³ Ä ¹øÈ£ÀÎ °æ¿ì¸¦ À§ÇØ ¿¡·¯ 󸮸¦ ÇÒ ÇÊ¿ä°¡ ÀÖ´Ù. ¹®´ÜÀÇ ±æÀÌ´Â 100ÀÚ¹Û¿¡ ¾ÈµÇ´Âµ¥ ¹®´Ü ³»ÀÇ 200Ä ¿ÀÇÁ¼ÂÀ» ±¸ÇÒ ¼ö´Â ¾ø±â ¶§¹®ÀÌ´Ù. ±×·¡¼ pc°¡ ÀÌ ¹®´Ü ¹üÀ§¿¡ ÀÖ´ÂÁö Á¶»çÇϱâ À§ÇØ ¹®´ÜÀÇ ³¡ÁÙÀÌ ÇÊ¿äÇÏ°í pc°¡ ¹®´Ü ù ÁÙÀÇ ½ÃÀÛ°ú ³¡ÁÙÀÇ ¸¶Áö¸· À§Ä¡¿¡ ÀÖ´ÂÁö Á¶»çÇÏ¿´´Ù. GetOffFromPara ÇÔ¼ö´Â ÀÌ·± ¿¡·¯ ó¸® ¶§¹®¿¡ ¾à°£ÀÇ Á¶°Ç °Ë»ç¹®ÀÌ µé¾î°¬´Ù.
ÀÌ ÇÔ¼öµéÀÌ ¿Ï¼ºµÊÀ¸·Î½á ApiEdit´Â ¼ºÁúÀÌ ´Ù¸¥ ¿©·¯ ´ÜÀ§°£À» ½±°Ô ÀüȯÇÒ ¼ö ÀÖ°Ô µÇ¾ú´Ù. ¿ÀÇÁ¼Â°ú ÁÙ, ¹®´Ü, ÁÂÇ¥¸¦ ÀÚÀ¯·Ó°Ô ÀüȯÇÒ ¼ö ÀÖÀ¸¸ç ÇϳªÀÇ °ªÀ» ¾Ë¸é Áß°£°ªÀ» ÅëÇØ ´Ù¸¥ °ªÀ» ½±°Ô ±¸ÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î ¸¶¿ì½º·Î ÂïÀº ÁÂÇ¥°¡ ¾î´À ¹®´Ü¿¡ ¼ÓÇÏ´ÂÁö ¾Ë°í ½ÍÀ¸¸é ÁÂÇ¥·ÎºÎÅÍ ¿ÀÇÁ¼ÂÀ» ±¸ÇÏ°í ¿ÀÇÁ¼ÂÀ¸·ÎºÎÅÍ ¹®´ÜÀ» ±¸ÇÏ¸é µÈ´Ù.
ÀÌ ÇÔ¼öµéÀ» ÅëĪÇÑ´Ù¸é GetAFromB¶ó°í ÇÒ ¼ö Àִµ¥ ÀÌ ÇÔ¼öµéÀÌ ´ÜÀ§°£ÀÇ º¯È¯À» Çϱ⠶§¹®¿¡ ApiEditÀÇ ´Ù¸¥ ÄÚµåµéÀÌ °£´ÜÇØÁú ¼ö ÀÖ´Ù. ÀÌ ÇÔ¼ö°¡ Á¦´ë·Î µ¿ÀÛÇÏ´ÂÁö Å×½ºÆ® Çغ¸±â À§ÇØ ´ÙÀ½ Àӽà Äڵ带 ÀÛ¼ºÇغ¸ÀÚ.
void CApiEdit::OnLButtonDown(HWND hWnd, BOOL fDoubleClick, int x, int y, UINT keyFlags)
{
....
TCHAR szTemp[256];
int pr,pc;
GetParaFromOff(off,pr,pc);
wsprintf(szTemp,"pr=%d, pc=%d, s=%d, e=%d",pr,pc,
GetParaFirstLine(pr),GetParaLastLine(pr));
SetWindowText(GetParent(hWnd),szTemp);
SetCapture(hWnd);
bCapture=TRUE;
SetCaret();
}
¸¶¿ì½º·Î Ŭ¸¯ÇÑ ºÎºÐÀÇ ¹®´Ü¹øÈ£, ¹®´Ü ³»ÀÇ Ä¹øÈ£¿Í ¹®´ÜÀÇ Ã¹ ÁÙ, ³¡ÁÙÀ» ŸÀÌƲ¹Ù¿¡ Ãâ·ÂÇϵµ·Ï Çß´Ù. ÀÌ·± Áß¿äÇÑ ÇÔ¼öµéÀº ¿©·¯ °÷¿¡¼ »ç¿ëµÇ¹Ç·Î Á¤È®ÇÏ°Ô µ¿ÀÛÇÏ´ÂÁö Á¤¹ÐÇÏ°Ô Å×½ºÆ®ÇØ º¼ ÇÊ¿ä°¡ ÀÖÀ¸¸ç ÀÌ·± Å×½ºÆ®¸¦ ÇÒ ¶§´Â µð¹ö°Å¸¦ È°¿ëÇÏ´Â °Íº¸´Ù ¾Æ¿¹ Å×½ºÆ® Äڵ带 ÀÛ¼ºÇؼ ½Ç½Ã°£À¸·Î È®ÀÎÇغ¸´Â °ÍÀÌ ÁÁ´Ù. ¹°·Ð Å×½ºÆ®°¡ ³¡³ ÈÄ ÀÌ ÄÚµå´Â »èÁ¦ÇØ¾ß ÇÑ´Ù.