±×·³ ÅDZîÁö ó¸®ÇßÀ¸¸é ¸¶Áø°ú °ü·ÃÇÑ ¸ðµç 󸮰¡ ´Ù ³¡³µÀ»±î? ±×·¸Áö ¾Ê´Ù. ¾ÆÁ÷µµ º¹ÀâÇÑ ¹®Á¦ Çϳª°¡ ³²¾Æ Àִµ¥ ÀÌ·± ¹®Á¦´Â ½±°Ô ¹ß°ßÇϱⰡ Âü ¾î·Æ´Ù. ÀÌ ¿¹Á¦´Â °è¼Ó ÀÚµ¿°³Çà »óÅ¿¡¼ ÀÛ¼ºµÇ°í Àֱ⠶§¹®¿¡ ¼öÆò½ºÅ©·ÑÀÌ ¾øÁö¸¸ ¼öÆò ½ºÅ©·Ñ¹Ù°¡ ³ªÅ¸³ª¸é ¸¶Áø±îÁö °°ÀÌ ½ºÅ©·ÑµÈ´Ù´Â ¹®Á¦Á¡ÀÌ ÀÖ´Ù. F9Å°¿¡ ÀÚµ¿°³Çà »óŸ¦ ¹Ù²Ü ¼ö ÀÖ´Â Àӽà ±â´ÉÀÌ ÀÖÀ¸¹Ç·Î ÀÌ Å°¸¦ ´·¯ ÀÚµ¿°³ÇàÀÌ ¾ø´Â »óÅ·Π¸¸µé¾î º¸°í ÀÌ »óÅ¿¡¼ ¼öÆò ½ºÅ©·Ñ¹Ù¸¦ µå·¡±×Çغ¸¾Æ¶ó.
½ºÅ©·ÑÀ̶õ ¹®¼¸¸À» ´ë»óÀ¸·Î ÇÏÁö¸¸ OnHScrollÀº ÀÛ¾÷¿µ¿ª Àüü¸¦ ½ºÅ©·Ñ Çϱ⠶§¹®¿¡ ¸¶Áø¿µ¿ªµµ ½ºÅ©·Ñ ´ë»óÀÌ µÇ¾î ¹ö·È°í ±×·¡¼ ¼öÆòÀ¸·Î ½ºÅ©·ÑÇϸé ȸéÀÌ ÇüÆí¾øÀÌ ±úÁ® ¹ö¸°´Ù. ½ºÅ©·Ñ ´ë»óÀº Àüü·Î Çصµ »ó°ü¾øÁö¸¸ Ŭ¸®Çοµ¿ªÀ» Æ÷¸ËÆÿµ¿ªÀ¸·Î ÁÖ¸é ÀÌ ¹®Á¦¸¦ ÇØ°áÇÒ ¼ö ÀÖ´Ù.
¶ÇÇÑ ¼öÆò½ºÅ©·Ñ½Ã¿¡ ij·µÀÌ ¸¶Áø¿µ¿ªÀ» ¾ÈÀ¸·Î µé¾î°¡ ±ô¹Ú°Å¸®°í ÀÖ´Â °ÍÀ» º¼ ¼ö Àִµ¥ ¸¶Áø¿¡¼´Â ij·µÀ» ¼û°Ü¾ß ÇÑ´Ù. ÀÌ µÎ 󸮴 ¸ðµÎ OnHScroll¿¡¼ ÇÑ´Ù.
void OnHScroll(HWND hWnd, HWND hwndCtl, UINT code, int pos)
{
int xInc;
SCROLLINFO si;
POINT pt;
static BOOL bHideCaret=FALSE;
xInc=0;
switch (code) {
case SB_LINEUP:
xInc=-FontHeight;
break;
case SB_LINEDOWN:
xInc=FontHeight;
break;
case SB_PAGEUP:
xInc=-(frt.right-frt.left);
break;
case SB_PAGEDOWN:
xInc=frt.right-frt.left;
break;
case SB_THUMBTRACK:
si.cbSize=sizeof(SCROLLINFO);
si.fMask=SIF_TRACKPOS;
GetScrollInfo(hWnd,SB_HORZ,&si);
xInc=si.nTrackPos-xPos;
break;
default:
break;
}
xInc=max(-xPos, min(xInc, xMax-xPos));
xPos=xPos+xInc;
ScrollWindow(hWnd, -xInc, 0, NULL, &frt);
SetScrollPos(hWnd, SB_HORZ, xPos, TRUE);
GetCaretPos(&pt);
if (pt.x < MarginWidth) {
if (bHideCaret==FALSE) {
HideCaret(hWnd);
bHideCaret=TRUE;
}
} else {
ShowCaret(hWnd);
bHideCaret=FALSE;
}
}
½ºÅ©·Ñ ¿µ¿ªµµ frt·Î ÁÙ ¼ö ÀÖÁö¸¸ ÀÌ·¸°Ô µÇ¸é ScrollWindow°¡ ij·µÀ» ¿Å°ÜÁÖÁö ¾Ê±â ¶§¹®¿¡ Ŭ¸®Çοµ¿ª¸¸ frt·Î ÁÖ¾î ¸¶ÁøÀ» °Çµå¸®Áö ¾Êµµ·Ï ÇÏ¿´´Ù. ½ºÅ©·ÑÀ» ÇÑ ÈÄ Ä³·µÀÇ À§Ä¡¸¦ Á¶»çÇغ¸°í ij·µÀÌ ¸¶Áø ¾È¿¡ ÀÖÀ¸¸é HideCaret ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ij·µÀ» ¼û±âµµ·Ï ÇßÀ¸¸ç ´Ù½Ã ¸¶Áø ¹ÛÀ¸·Î ³ª¿À¸é ShowCaret ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ij·µÀÌ ´Ù½Ã º¸À̵µ·Ï Çß´Ù. ´Ü, HideCaret ÇÔ¼ö´Â ij·µÀ» ¼û±ä Ƚ¼ö¸¦ ±â¾ïÇϴµ¥ HideCaretÀ» È£ÃâÇÑ ¸¸Å ShowCaretÀ» È£ÃâÇØ¾ß Ä³·µÀÌ ´Ù½Ã º¸ÀδÙ. ±×·¡¼ µü ÇÑ ¹ø¸¸ HideCaretÀ» È£ÃâÇϱâ À§ÇØ bHideCaret Á¤Àû º¯¼ö¸¦ »ç¿ëÇÏ¿´´Ù. ÀÌ º¯¼ö°¡ TRUEÀÏ ¶§´Â ÀÌ¹Ì Ä³·µÀÌ ¼û°ÜÁ® ÀÖ´Â »óÅÂÀ̹ǷΠHideCaretÀ» È£ÃâÇÒ ÇÊ¿ä°¡ ¾ø°í È£ÃâÇؼµµ ¾ÈµÈ´Ù.
SetCaret ÇÔ¼ö´Â ij·µÀÌ ÀÛ¾÷¿µ¿ªÀ» ¹þ¾î³ª¸é ÀÚµ¿À¸·Î ½ºÅ©·ÑÀ» ÇÏ´Â ±â´ÉÀÌ Àִµ¥ ÀÌÁ¦ ÀÛ¾÷¿µ¿ªÀÌ ¾Æ´Ï¶ó Æ÷¸ËÆÿµ¿ªÀ» ¹þ¾î³ª´ÂÁö °¨½ÃÇØ¾ß ÇÑ´Ù. x¿Í ¿ÞÂÊ ÁÂÇ¥¸¦ ºñ±³ÇÏ´Â ½Ä¿¡ MarginWidth¸¦ ³Ö¾î ÁÖµµ·Ï ÇÏÀÚ.
void SetCaret(BOOL bUpdatePrevX/*=TRUE*/, BOOL bScrollToCaret/*=TRUE*/)
{
....
if (bScrollToCaret) {
if (nWrap==0) {
if ((x+caretwidth > xPos+frt.right) || (x < xPos+MarginWidth)) {
xPos=max(0,x-frt.right/2);
bScroll=TRUE;
}
}
....
ÀÌÁ¦ ¼öÆò½ºÅ©·Ñ½Ã Ŭ¸®Çεµ Àß Ã³¸®ÇÏ°í SetCaret ÇÔ¼öµµ ¸¶ÁøÀ¸·Î ij·µÀÌ µé¾î°¡´Â °ÍÀ» ¹æÁöÇÑ´Ù.