ÀÌÁ¦ ½ºÅ©·Ñ ±â´É ±¸ÇöÀ» À§ÇØ ½ºÅ©·Ñ °ü·Ã ¸Þ½ÃÁö¸¦ ó¸®Çϵµ·Ï ÇÏÀÚ. ´ÙÀ½Àº ¼öÆò½ºÅ©·Ñ ¸Þ½ÃÁöÀÎ WM_HSCROLL ¸Þ½ÃÁö ó¸® ÇÔ¼öÀÌ´Ù.
void OnHScroll(HWND hWnd, HWND hwndCtl, UINT code, int pos)
{
int xInc;
RECT crt;
SCROLLINFO si;
GetClientRect(hWnd,&crt);
xInc=0;
switch (code) {
case SB_LINEUP:
xInc=-FontHeight;
break;
case SB_LINEDOWN:
xInc=FontHeight;
break;
case SB_PAGEUP:
xInc=-(crt.right-crt.left);
break;
case SB_PAGEDOWN:
xInc=crt.right-crt.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, NULL);
SetScrollPos(hWnd, SB_HORZ, xPos, TRUE);
}
¾ÆÁÖ ±âº»ÀûÀÎ ÄÚµåÀ̹ǷΠ½ºÅ©·Ñ ±â¹ý ÀÚü¿¡ ´ëÇؼ´Â ¼³¸íÀ» ÇÏÁö ¾Ê±â·Î ÇÏ°í Ư¡ÀûÀÎ ¸î °¡Áö¸¸ º¸°í ³Ñ¾î°¡µµ·Ï ÇÏÀÚ. ¼öÆòÀ¸·Î ÁÙ´ÜÀ§ ½ºÅ©·ÑÇÒ ¶§ÀÇ Å©±â´Â FontHeight·Î µÇ¾î Àִµ¥ ÀÌ Á¡ÀÌ Á» ÀÌ»óÇÏ°Ô »ý°¢µÉ ¼öµµ ÀÖ´Ù. ¼öÆò½ºÅ©·ÑÀ̹ǷΠÆùÆ®ÀÇ Æò±ÕÆøÀÎ FontWidth¸¦ »ç¿ëÇØ¾ß ÇÒ °Í °°Àºµ¥ ÀÌ °ªÀº ³Ê¹« ÀÛ¾Æ ½ºÅ©·Ñ ¼Óµµ°¡ ´À·Á¼ »ç¿ëÇÏÁö ¾Ê´Â´Ù. ¾îÂ÷ÇÇ ½ºÅ©·Ñ ´ÜÀ§¶ó´Â °Íµµ ÀÓÀÇÀÇ ¼±ÅðªÀÏ »ÓÀÌ´Ù.
SB_THUMBTRACK ¿¡¼ ÇöÀç ½ºÅ©·Ñ À§Ä¡¸¦ ±¸ÇÒ ¶§´Â ¹Ýµå½Ã GetScrollInfo ÇÔ¼ö·Î 32ºñÆ®ÀÇ ½ºÅ©·Ñ °ªÀ» ±¸ÇØ »ç¿ëÇØ¾ß ÇÑ´Ù. ÀÌ ÇÁ·Î±×·¥ÀÇ ½ºÅ©·Ñ ´ÜÀ§´Â Çȼ¿ÀÌ¸ç ¹®¼°¡ ´ë´ÜÈ÷ ±æ ¼ö Àֱ⠶§¹®¿¡ wParamÀÇ »óÀ§ ¿öµå·Î Àü´ÞµÇ´Â 16ºñÆ® °ªÀ¸·Î´Â ºÎÁ·ÇÏ´Ù. 32ºñÆ® ½ºÅ©·Ñ À§Ä¡°ªÀº 40¾ï±îÁö °¡´ÉÇϹǷΠ°ÅÀÇ ¹«ÇÑ´ëÀÇ ¹®¼±îÁöµµ ½ºÅ©·ÑÇÒ ¼ö ÀÖ´Ù. ´ÙÀ½Àº Á¶±Ý ´õ º¹ÀâÇÑ ¼öÁ÷½ºÅ©·Ñ Äڵ带 º¸µµ·Ï ÇÏÀÚ.
void OnVScroll(HWND hWnd, HWND hwndCtl, UINT code, int pos)
{
int yInc;
RECT crt;
SCROLLINFO si;
int LinePerPage;
GetClientRect(hWnd,&crt);
LinePerPage=(crt.bottom/LineHeight)*LineHeight;
yInc=0;
switch (code) {
case SB_LINEUP:
yInc=-LineHeight;
break;
case SB_LINEDOWN:
yInc=LineHeight;
break;
case SB_PAGEUP:
yInc=-LinePerPage;
break;
case SB_PAGEDOWN:
yInc=LinePerPage;
break;
case SB_THUMBTRACK:
si.cbSize=sizeof(SCROLLINFO);
si.fMask=SIF_TRACKPOS;
GetScrollInfo(hWnd,SB_VERT,&si);
yInc=si.nTrackPos-yPos;
break;
default:
break;
}
yInc=max(-yPos, min(yInc, yMax-yPos-LinePerPage));
yInc=yInc-(yInc % LineHeight);
yPos=yPos+yInc;
ScrollWindow(hWnd, 0, -yInc, NULL, NULL);
SetScrollPos(hWnd, SB_VERT, yPos, TRUE);
}
ÁÙ´ÜÀ§ ½ºÅ©·ÑÅ©±â´Â µÎ¸»ÇÒ ÇÊ¿äµµ ¾øÀÌ ÁÙ°£ÀÎ LineHeightÀÌ´Ù. ÆäÀÌÁö´ÜÀ§ ½ºÅ©·ÑÅ©±â´Â LinePerPageÀÌµÇ ÆäÀÌÁö´ç ÁÙ ¼öÀÇ ¹è¼ö·Î °è»êÇß´Ù. SB_THUMBTRACK¿¡¼´Â ¸¶Âù°¡Áö·Î 32ºñÆ®ÀÇ ½ºÅ©·Ñ À§Ä¡°ªÀ» ±¸ÇØ »ç¿ëÇÑ´Ù. ÀÌ Äڵ忡¼ Á» ¾î·Á¿î ÄÚµå¶ó¸é yIncÀÇ »óÇÏÇÑ °ªÀ» °áÁ¤ÇÏ´Â ÄÚµåÀε¥ ¼öÁ÷½ºÅ©·Ñ½Ã yPosÀÇ °¡´ÉÇÑ ÇÏÇÑ°ªÀº 0ÀÌ¸ç »óÇÑ°ªÀº yMax-LinePerPageÀÌ´Ù. ¾Æ¹«¸® À§·Î ½ºÅ©·ÑÇصµ À½¼ö À§Ä¡·Î °¡¼´Â ¾ÈµÇ¸ç ¶ÇÇÑ ¾Æ¹«¸® ¾Æ·¡·Î ½ºÅ©·ÑÇصµ ¹®¼ ³¡À» ³Ñ¾î¼´Â ¾ÈµÈ´Ù.
ÀÌ ÇÔ¼ö¿¡¼ ´«¿©°Ü º¼ ÄÚµå´Â ³¡¿¡¼ 4¹ø°¿¡ ÀÖ´Â yInc=yInc-(yInc % LineHeight);¹®ÀåÀÌ´Ù. OnHScroll¿¡´Â ´ëÀÀµÇ´Â Äڵ尡 ¾ø´Âµ¥ ¼öÁ÷½ºÅ©·Ñ¿¡´Â ¹Ýµå½Ã ÀÌ Äڵ尡 ÀÖ¾î¾ß ÇÑ´Ù. ¿Ö ±×·±°¡´Â ¾ÆÁ÷ ½ºÅ©·Ñ °á°ú¸¦ È®ÀÎÇÒ ¼ö ¾øÀ¸¹Ç·Î OnPaint ÄÚµå±îÁö ÀÛ¼ºÇÑ ÈÄ ³íÇغ¸ÀÚ. ½ºÅ©·ÑµÈ °á°ú´Â OnPaint ÇÔ¼ö¿¡¼ Àû¿ëÇÑ´Ù. ´ÙÀ½°ú °°ÀÌ TextOut ÇÔ¼öÀÇ ¹®ÀÚ¿ Ãâ·Â ÁÂÇ¥¿¡ xPos, yPos¸¦ »©¸é µÈ´Ù.
void OnPaint(HWND hWnd)
{
HDC hdc;
PAINTSTRUCT ps;
int l,s,e;
hdc=BeginPaint(hWnd,&ps);
for (l=0;;l++) {
GetLine(l,s,e);
if (s == -1)
break;
TextOut(hdc,0-xPos,l*LineHeight-yPos,buf+s,e-s);
}
EndPaint(hWnd,&ps);
}
½ºÅ©·ÑµÈ ¸¸Å ´õÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó »©ÁÖ´Â °ÍÀÓÀ» À¯ÀÇÇÏÀÚ. ÀÌ ÇÔ¼ö ¿Ü¿¡µµ ½ºÅ©·Ñ¿¡ ¿µÇâÀ» ¹ÞÀ»¸¸ÇÑ ÇÔ¼ö·Î GetXYFromOff°¡ ÀÖÀ» °Í °°Àºµ¥ ÀÌ ÇÔ¼ö´Â ¼öÁ¤ÇÒ ÇÊ¿ä°¡ ¾ø´Ù. ÀÌ ÇÔ¼ö°¡ Á¶»çÇÏ´Â XY ÁÂÇ¥°ªÀº ȸé»óÀÇ ÁÂÇ¥°¡ ¾Æ´Ï¶ó ¹®¼»óÀÇ ÁÂÇ¥À̱⠶§¹®¿¡ ½ºÅ©·Ñ »óÅ¿ʹ ¹«°üÇÏ´Ù. GetRCFromOff ÇÔ¼ö°¡ ±¸ÇÏ´Â Çà·Ä°ªµµ ¸¶Âù°¡Áö ÀÌÀ¯·Î ½ºÅ©·Ñ »óÅ¿ʹ ÀüÇô ¹«°üÇÏ´Ù.
ÀÌÁ¦ ½ÇÇàÇغ¸¸é ¼öÁ÷ ½ºÅ©·Ñ¹Ù¸¦ ÀÌ¿ëÇؼ ¾Æ·¡À§·Î À̵¿ÇÒ ¼ö ÀÖ´Ù. ½ºÅ©·Ñ¹ÙÀÇ ¹öÆ°À» Ŭ¸¯Çϸé ÇÑ ÁÙ¾¿ ½ºÅ©·ÑµÇ°í ¸öÅëÀ» ´©¸£¸é ÆäÀÌÁö´ÜÀ§·Î ½ºÅ©·ÑµÉ °ÍÀÌ´Ù. ±×·³ ÀÌÁ¦ Àá½Ã Àü¿¡ º¸·ùÇصξú´ø yInc=yInc-(yInc % LineHeight); ÄÚµåÀÇ Á¸Àç °¡Ä¡¿¡ ´ëÇØ ¾Ë¾Æ º¸±â À§ÇØ ÀÌ ÁÙÀ» ÁÖ¼® ó¸®ÇÏ°í ½ÇÇàÇغ¸¾Æ¶ó. ¹öÆ°À» Ŭ¸¯Çϸé ÇÑ Ä¾¿ ½ºÅ©·Ñ µÇ´Â °ÍÀº µ¿ÀÏÇѵ¥ ½æÀ» µå·¡±×ÇÒ ¶§´Â ¿ÏÀüÈ÷ Çȼ¿ ´ÜÀ§·Î ½ºÅ©·ÑµÉ °ÍÀÌ´Ù.
SB_THUMBTRACKÀº ½æÀÇ ÇöÀç À§Ä¡¸¦ ÀÓÀÇÀÇ À§Ä¡·Î ¿Å°åÀ» ¶§ ¹ß»ýÇÏ¸ç µû¶ó¼ ÁÙÀÇ °æ°è µûÀ§´Â ¿ÏÀüÈ÷ ¹«½ÃÇÑ´Ù. ±×·¡¼ À§ ±×¸²Ã³·³ ȸé»óÀÇ Ã¹ ÁÙÀÌ ¹ÝÂ븸 º¸ÀÌ´Â Çö»óÀÌ »ý±â°Ô µÇ´Â °ÍÀÌ´Ù. ÀÌ·¸°Ô Çȼ¿ ´ÜÀ§·Î ½ºÅ©·ÑÇÏ¸é ¾ÆÁÖ ¹Ì·ÁÇÏ°Ô ½ºÅ©·ÑµÇ¾î º¸±â´Â ÁÁÀ»Áö ¸ô¶óµµ »ç¿ëÇϱâ´Â ¿ÀÈ÷·Á ºÒÆíÇÏ´Ù. Á¦ÀÏ ³¡ ÁÙÀÌ ¹ÝÂë º¸ÀÌ´Â °ÍÀº »ó°ü¾øÁö¸¸ ù ÁÙÀÌ Àú·¸°Ô ¹Ý¸¸ º¸À̸é Á» ÀÌ»óÇÏÁö ¾ÊÀº°¡?
ȸéÀÇ Ã³À½¿¡ ÁÙÀÌ ¹ÝÂë °ÉÃÄ ÀÖÀ¸¸é ¿©·¯ °¡Áö·Î º¹ÀâÇÑ ³í¸®Àû ¿¹¿Ü°¡ ¹ß»ýÇϸç ÀÌ ¿¹¿Ü¸¦ ó¸®ÇÏ·Á¸é ´Ù·®ÀÇ Äڵ尡 Ãß°¡·Î ¿ä±¸µÈ´Ù. ±×·¡¼ ÆíÁý±âµéÀº ÀÌ·± »óŸ¦ Çã¿ëÇÏÁö ¾ÊÀ¸¸ç ¾î¶»°Ô Çϵç ȸé Á¦ÀÏ À§ÀÇ ÁÙÀº Á¦´ë·Î º¸¿©¾ß ÇÏ´Â °ÍÀÌ´Ù. ¸®½ºÆ®¹Ú½º³ª Æ®¸® ºä °°Àº Ç¥ÁØ ÄÁÆ®·ÑµéÀÇ µ¿ÀÛÀ» °üÂûÇغ¸¸é ¾î¶² °æ¿ì¶óµµ ù ¹ø° Ç׸ñÀÌ ÀϺθ¸ º¸À̵µ·Ï ³»¹ö·Á µÎÁö ¾Ê´Â´Ù. ±×¸¸Å ÀÌ ¹®Á¦°¡ °ñÄ¡ ¾ÆÇÁ´Ù´Â ¶æÀÌ´Ù.
¿öµåÇÁ·Î¼¼¼ÀÇ °æ¿ì´Â ÁÙ¸¶´Ù °£°ÝÀ̳ª ³ôÀÌ°¡ ´Ù¸¦ ¼ö Àֱ⠶§¹®¿¡ ºÒ°¡ÇÇÇÏ°Ô Ã¹ ÁÙÀÌ ¹ÝÂë °ÉÄ¡´Â °æ¿ì°¡ ÀÖ´Ù. ±×·¯³ª ¿öµåÇÁ·Î¼¼¼µµ ºÒ°¡ÇÇÇÑ °æ¿ì¿¡¸¸ ÀÌ·± Çö»óÀ» Çã¿ëÇÒ »Ó ½ºÅ©·ÑÀ̳ª Å°º¸µå À̵¿½Ã¿¡´Â °¡±ÞÀûÀ̸é ù ÁÙÀÌ ´Ù º¸À̵µ·Ï Çϱâ À§ÇØ ¾È°£ÈûÀ» ¾´´Ù.
yInc=yInc-(yInc % LineHeight); ÄÚµå´Â ½ºÅ©·Ñ Áõ°¨°ªÀ» ÁÙ°£ÀÇ ¹è¼ö·Î °Á¦·Î ³»¸²ÇÔÀ¸·Î½á ÀÌ·± Çö»óÀ» ¹æÁöÇÏ´Â ¾ÆÁÖ Áß¿äÇÑ ¿ªÇÒÀ» Çϸç Àý´ë·Î »ý·«ÇÒ ¼ö ¾ø´Ù. ApiEditÀÇ ÁÖ¿ä ÇÔ¼öµéÀº yPos´Â Ç×»ó ÁÙ°£ÀÇ ¹è¼öÀÓÀ» °¡Á¤ÇÏ°í Àִµ¥ ÀÌ °¡Á¤ÀÌ Æ²·ÁÁö¸é ¾û¶×ÇÑ µ¿ÀÛÀ» ÇÏ°Ô µÈ´Ù. ¿¹¸¦ µé¾î GetXYFromOff ÇÔ¼ö´Â ¹®¼»óÀÇ ÁÙ¹øÈ£ r¿¡ ÁÙ°£ LineHeight¸¦ °öÇØ y ÁÂÇ¥¸¦ ±¸Çϴµ¥ ÀÌ °è»ê½ÄÀº yPos°¡ ÁÙ°£ÀÇ ¹è¼öÀÓÀ» °¡Á¤ÇÏ°í ÀÖ´Â °ÍÀÌ´Ù.