½ºÅ©·Ñ ¹Ù·ÎÀÇ ½ºÅ©·Ñ ÄÚµå´Â ´Ù ÀÛ¼ºÇß´Ù. ÇÏÁö¸¸ ¾ÆÁ÷ Å°º¸µå·Î´Â ½ºÅ©·ÑÀ» ÇÒ ¼ö ¾ø´Ù. Á¦ÀÏ ¾Æ·¡ÁÙ¿¡ ij·µÀ» µÎ°í ÇÑ Ä ¾Æ·¡·Î ³»·Á°¡¸é ij·µ¸¸ ³»·Á°¥ »Ó ½ºÅ©·ÑÀº µÇÁö ¾Ê´Â´Ù. ij·µÀÌ È¸é ¾Æ·¡·Î ¼û¾î¹ö¸®´Â °ÍÀÌ´Ù.
±×·¡¼ ij·µ À§Ä¡°¡ º¯°æµÇ¸é ÀÌ Ä³·µÀÌ º¸ÀÏ ¼ö ÀÖµµ·Ï ȸ鵵 °°ÀÌ ½ºÅ©·ÑÇØ¾ß ÇÑ´Ù. Å°º¸µå¿¡ ÀÇÇØ ½ºÅ©·ÑÀÌ ¹ß»ýÇϹǷΠOnKey ÇÔ¼ö¿¡¼ ó¸®ÇØ¾ß ÇÒ °Í °°Áö¸¸ ±×·¸Áö ¾Ê´Ù. Å°º¸µå¿¡ ÀÇÇØ Ä³·µÀÌ À̵¿µÉ ¶§¸¶´Ù ½ºÅ©·ÑµÇ´Â °ÍÀÌ ¾Æ´Ï¶ó ij·µÀÌ È¸éÀ» ¹þ¾î³¯ ¶§¸¸ ½ºÅ©·ÑµÇ¾î¾ß ÇϹǷΠÀÌ ÀÛ¾÷Àº ij·µ À§Ä¡¸¦ º¯°æÇÏ´Â SetCaret¿¡¼ ÇÏ´Â °ÍÀÌ ÈξÀ ´õ È¿À²ÀûÀÌ´Ù. Äڵ带 º¸±â Àü¿¡ ÀÌ ÇÔ¼öÀÇ µ¿ÀÛÀ» ±×¸²À¸·Î ¸ÕÀú ¼³¸íÇغ¸¾Ò´Ù.
¸¸¾à ij·µÀÌ ¿À¸¥ÂÊ ¹Ù±ùÀ¸·Î ¹þ¾î³µ´Ù¸é ¿À¸¥ÂÊÀ¸·Î ¹®¼¸¦ ½ºÅ©·Ñ½ÃÄÑ »õ À§Ä¡°¡ ȸéÀÇ Áß¾ÓÀÌ µÇµµ·Ï ÇÑ´Ù. ¶ÇÇÑ Ä³·µÀÌ À§ÂÊÀ¸·Î ¹þ¾î³µÀ¸¸é À§·Î ½ºÅ©·ÑÇÏ¿© ij·µÀÌ Ã¹ ¹ø° ÁÙ¿¡ º¸À̵µ·Ï ÇØ¾ß ÇÏ¸ç ¹Ý´ë·Î ¾Æ·¡ÂÊÀ¸·Î ¹þ¾î³ª¸é ¸¶Áö¸· ÁÙ¿¡ ij·µÀÌ ÀÖµµ·Ï ÇØ¾ß ÇÑ´Ù. ÀÌ µ¿ÀÛÀ» ÄÚµå·Î ¿Å±ä °á°ú´Â ´ÙÀ½°ú °°´Ù. Å°º¸µå ½ºÅ©·ÑÀ» Áö¿øÇϱâ À§ÇØ SetCaret ÇÔ¼ö¿¡ Àμö°¡ Çϳª ´õ Ãß°¡µÇ¾ú´Ù.
void SetCaret(BOOL bUpdatePrevX/*=TRUE*/, BOOL bScrollToCaret/*=TRUE*/)
{
HDC hdc;
int toff;
int caretwidth;
int x,y;
RECT crt;
int ty;
BOOL bScroll=FALSE;
hdc=GetDC(hWndMain);
if (bComp) {
toff=off-2;
caretwidth=GetCharWidth(hdc,buf+toff,2);
} else {
toff=off;
caretwidth=2;
}
CreateCaret(hWndMain,NULL,caretwidth,FontHeight);
ShowCaret(hWndMain);
GetXYFromOff(toff,x,y);
if (bScrollToCaret) {
GetClientRect(hWndMain,&crt);
if (nWrap==0) {
if ((x+caretwidth > xPos+crt.right) || (x < xPos)) {
xPos=max(0,x-crt.right/2);
bScroll=TRUE;
}
}
if (y < yPos) {
yPos=y;
bScroll=TRUE;
}
if (y+FontHeight > yPos+crt.bottom) {
ty=(crt.bottom-FontHeight)/LineHeight*LineHeight;
yPos=y-ty;
bScroll=TRUE;
}
if (bScroll == TRUE) {
SetScrollPos(hWndMain, SB_HORZ, xPos, TRUE);
SetScrollPos(hWndMain, SB_VERT, yPos, TRUE);
InvalidateRect(hWndMain,NULL,TRUE);
}
}
SetCaretPos(x-xPos,y-yPos);
ReleaseDC(hWndMain,hdc);
if (bUpdatePrevX) {
PrevX=x;
}
}
if (bScrollToCaret) ºí·Ï ¾Æ·¡ÀÇ Á¶°Ç¹®µéÀÌ ÀÌ·± 󸮸¦ ÇÏ°í Àִµ¥ ´Ù ºñ½ÁÇÑ ÄÚµåÀ̹ǷΠ´ëÇ¥ÀûÀ¸·Î ¾Æ·¡ÂÊÀ¸·Î ¹þ¾î³ °æ¿ìÀÎ ¼¼ ¹ø° Á¶°Ç¹®¸¸ ºÐ¼®Çغ¸µµ·Ï ÇÏÀÚ. ÀÌ Á¶°Ç¹®¿¡¼ y´Â SetCaretÀÌ Á¶»çÇÑ Ä³·µÀÇ »õ À§Ä¡À̸ç ÀÌ °ª¿¡ FontHeight¸¦ ´õÇϸé ij·µÀÇ ¹ß°¡¶ô ÁÂÇ¥°¡ °è»êµÈ´Ù. ÀÌ ÁÂÇ¥°¡ ÇöÀç ½ºÅ©·ÑµÈ »óÅ¿¡¼ ÀÛ¾÷¿µ¿ªÀÇ ¹Ù´Ú(yPos+crt.bottom)º¸´Ù ´õ ¾Æ·¡ÂÊ¿¡ ÀÖ´Ù¸é °Á¦·Î ÀÌ ÁÙÀ» À§·Î ¿Ã·ÁÁØ´Ù.
À̶§ ½ºÅ©·ÑµÈ ÈÄÀÇ À§Ä¡´Â ÀÛ¾÷¿µ¿ªÀÇ ¹Ù´Ú¿¡¼ ÆùÆ®ÀÇ ³ôÀ̸¸Å À§ÂÊÀÌµÇ ´Ü ù ÁÙÀÌ À߸®Áö ¾Êµµ·Ï Çϱâ À§ÇØ ÁÙ°£ÀÇ ¹è¼ö°¡ µÇµµ·Ï Á¶Á¤ÇØ¾ß ÇÑ´Ù.
³ª¸ÓÁö Á¶°Ç¹®µéµµ ´Ù ºñ½ÁÇϹǷΠÁ÷Á¢ ºÐ¼®Çغ¸±â ¹Ù¶õ´Ù. ¼öÆòÁÂÇ¥¸¦ ºñ±³ÇÒ ¶§´Â nWrapÀÌ 0ÀÎ °æ¿ì¸¸ ºñ±³Çغ¸¸é µÇ´Âµ¥ ÀÚµ¿°³Çà »óÅ¿¡¼´Â ¾î¶² °æ¿ì¶óµµ ¼öÆòÀ¸·Î ½ºÅ©·ÑµÇÁö ¸»¾Æ¾ß ÇÑ´Ù.
ij·µÀÌ ¹®¼ ¹ÛÀ» ¹þ¾î³µ´ÂÁö´Â ij·µÀ» ¿Å±æ ¶§¸¶´Ù Á¡°ËÇØ¾ß ÇÑ´Ù. ´Ü, ¿¹¿Ü°¡ Àִµ¥ OnSetFocus¿¡¼´Â ÀÌ Ã³¸®¸¦ ÇÒ ÇÊ¿ä°¡ ¾ø´Ù. ½ºÅ©·Ñ¹Ù·Î ¹®¼ÀÇ ¾Æ·¡ÂÊ ºÎºÐÀ» ½ºÅ©·ÑÇؼ Àдٰ¡ ´Ù¸¥ ÇÁ·Î±×·¥À» Àá½Ã »ç¿ëÇÑ ÈÄ ´Ù½Ã ÆíÁý±â·Î µ¹¾Æ¿Ô´Âµ¥ ij·µ À§Ä¡·Î ½ºÅ©·ÑÀ» ÇÏ¸é ¾ÈµÈ´Ù. »ç¿ëÀÚ°¡ Àаí ÀÖ´ø À§Ä¡´Â ÀϺη¯ ij·µÀ» ¿Å±âÁö ¾Ê´Â ÇÑÀº À¯ÁöÇÏ´Â °ÍÀÌ ¿Ç´Ù. ±×·¡¼ SetCaretÀÇ ¿øÇü¿¡ »õ·Î¿î µðÆúÆ® Àμö bScrollToCaretÀÌ Çϳª ´õ Ãß°¡µÇ¾úÀ¸¸ç OnSetFocus¿¡¼´Â ´ÙÀ½°ú °°ÀÌ SetCaretÀÇ Àμö¸¦ ¹Ù²ã¾ß ÇÑ´Ù.
void OnSetFocus(HWND hWnd, HWND hwndOldFocus)
{
SetCaret(FALSE,FALSE);
}
Ãß°¡µÈ ÀμöÀÇ µðÆúÆ®°ªÀ» ÁÖ¾úÀ¸¹Ç·Î ±× ¿Ü ³ª¸ÓÁö SetCaretÀ» È£ÃâÇÏ´Â ºÎºÐÀº ÀüÇô °Çµå¸®Áö ¾Ê¾Æµµ µÈ´Ù. ÀÌÁ¦ ½ÇÇàÇغ¸¸é ij·µÀÌ È¸éÀ» ¹þ¾î³¯ ¶§ ÀÚ¿¬½º·´°Ô ½ºÅ©·ÑµÉ °ÍÀÌ´Ù. Å°º¸µå ½ºÅ©·ÑÀº »ç½Ç ¡®Ä³·µ ½ºÅ©·Ñ¡¯À̶ó°í À̸§À» ºÙÀÌ´Â °ÍÀÌ ´õ ÀûÀýÇÑ °Í °°´Ù.