´Ù. ½ºÅ©·Ñ ¸Þ½ÃÁö ó¸®

ÀÌÁ¦ ½ºÅ©·Ñ ±â´É ±¸ÇöÀ» À§ÇØ ½ºÅ©·Ñ °ü·Ã ¸Þ½ÃÁö¸¦ ó¸®Çϵµ·Ï ÇÏÀÚ. ´ÙÀ½Àº ¼öÆò½ºÅ©·Ñ ¸Þ½ÃÁöÀÎ 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°¡ ÁÙ°£ÀÇ ¹è¼öÀÓÀ» °¡Á¤ÇÏ°í ÀÖ´Â °ÍÀÌ´Ù.