¸¶. PgUp, PgDn

´ÙÀ½Àº <PgUp>, <PgDn>Å°¿¡ ´ëÇÑ Ã³¸®¸¦ ÀÛ¼ºÇغ¸ÀÚ. ÀÌ Å°¸¦ ´©¸£¸é ÆäÀÌÁö´ÜÀ§·Î »óÇÏÀ̵¿À» ÇÏ°Ô µÇ¸ç ½ºÅ©·Ñ¹ÙÀÇ ¸öÅëÀ» ´©¸¥ °Í°ú °°Àº È¿°ú°¡ ³ªÅ¸³­´Ù. ±×·¡¼­ º¸Åë ÀÌ Å°·Î ÆäÀÌÁö ½ºÅ©·ÑÀ» ÇÒ ¶§´Â SB_PAGEUP(DOWN) ¸Þ½ÃÁö¸¦ º¸³»ÁÖ´Â ¹æ¹ýÀ» ¸¹ÀÌ »ç¿ëÇÏ¸ç ³í¸®ÀûÀ¸·Î Å« ¹«¸®°¡ ¾ø´Ù. ÀÌ ¹æ¹ý´ë·Î ÀÛ¼ºÇÑ <PgUp>ÀÇ ÄÚµå´Â ´ÙÀ½°ú °°´Ù.

 

 

     int oldypos;

     int yInc;

     ....

     case VK_PRIOR:

          GetRCFromOff(off,r,c);

          oldypos=yPos;

          SendMessage(hWnd,WM_VSCROLL,MAKELONG(SB_PAGEUP,0),0);

          yInc=(yPos-oldypos)/LineHeight;

          r+=yInc;

          off=GetXPosOnLine(r,PrevX);

          SetCaret(FALSE);

          return;

 

¸ÕÀú r¿¡ ÇöÀç ÁÙ¹øÈ£¸¦ Á¶»çÇسõ°í SB_PAGEUP ¸Þ½ÃÁö¸¦ º¸³»¸é À§·Î ½ºÅ©·ÑÀÌ µÉ °ÍÀÌ´Ù. ½ºÅ©·ÑµÈ °á°ú °ú¿¬ ¸î ÁÙÀ̳ª ½ºÅ©·ÑµÇ¾ú´ÂÁö Á¶»çÇϱâ À§ÇØ ½ºÅ©·Ñ ÀüÈÄÀÇ yPos °ªÀ» Á¶»çÇÏ¿© À̵¿µÈ ÁÙ¼ö¸¸Å­ r¿¡ ´õÇϴµ¥ ÀÌ °æ¿ì À§·Î ¿Ã¶ó°¬À¸¹Ç·Î À̵¿ÁÙ¼ö´Â À½¼öÀÌ°í ÇöÀçÁÙº¸´Ù ´õ À§·Î ¿Ã¶ó°¥ °ÍÀÌ´Ù. À̵¿µÈ ÁÙ¿¡¼­ GetXPosOnLineÀ» È£ÃâÇÏ¿© »õ ¿ÀÇÁ¼ÂÀ» ã¾Ò´Ù. <PgUp> À̵¿µµ ÀÏÁ¾ÀÇ »óÇÏÀ̵¿À̹ǷΠPrevX´Â °Çµå¸®Áö ¸»¾Æ¾ß Çϸç SetCaretÀÇ Àμö´Â ¹Ýµå½Ã FALSE¿©¾ß ÇÑ´Ù.

ÀÌ ÄÚµå·Î Å×½ºÆ®¸¦ Çغ¸¸é °ú¿¬ Àß ½ºÅ©·ÑµÈ´Ù. ÀÌ·± ¹æ¹ýÀº ÀϹÝÀûÀ¸·Î´Â ¹®Á¦°¡ ¾øÀ¸¸ç ±×·¡ÇÈ ÇÁ·Î±×·¥À̶ó¸é ÀÌ´ë·Î ¾µ ¼ö ÀÖ´Ù. ±×·¯³ª ÅؽºÆ®¿¡µðÅʹ ij·µÀÌ Àֱ⠶§¹®¿¡ <PgUp>Å°¿Í SB_PAGEUPÀÇ µ¿ÀÛÀÌ ¿ÏÀüÈ÷ ÀÏÄ¡ÇÏÁö ¾Ê´Â´Ù. ¾î¶² °æ¿ì Â÷ÀÌÁ¡ÀÌ Àִ°¡ÇÏ¸é ´ÙÀ½°ú °°Àº »óÅÂÀÏ ¶§ÀÌ´Ù.

ij·µÀÌ ¿©¼¸ ¹ø° ÁÙ ³¡¿¡ ÀÖ°í Çϳªµµ ½ºÅ©·ÑµÇ¾î ÀÖÁö ¾ÊÀº »óÅÂÀε¥ ÀÌ »óÅ¿¡¼­ SB_PAGEUP ¸Þ½ÃÁö´Â ´õ ½ºÅ©·ÑµÉ °÷ÀÌ ¾ø±â ¶§¹®¿¡ ¾Æ¹« Àϵµ ÇÏÁö ¾Ê´Â´Ù. ÇÏÁö¸¸ <PgUp>Àº ½ºÅ©·ÑÀº ÇÏÁö ¾Ê´õ¶óµµ ij·µÀº Á¦ÀÏ À­ÁÙ·Î ¿Ã·Á¾ß ÇÒ ÇÊ¿ä°¡ ÀÖ´Ù.

SB_PAGEUPÀº º¸¿©ÁÙ ÆäÀÌÁö¸¦ À§·Î À̵¿Ç϶ó´Â ¶æÀ̹ǷΠij·µÀº Ç×»ó ±× ÀÚ¸®¿¡ µÎ°í È­¸é¸¸ À̵¿½ÃŲ´Ù. ¹Ý¸é <PgUp>Àº ÆíÁýÇÒ °÷À» À§·Î À̵¿Ç϶ó´Â ¶æÀ̸ç ij·µÀÌ È­¸é°ú ÇÔ²² ¿òÁ÷ÀδÙ. »Ó¸¸ ¾Æ´Ï¶ó °¡±ÞÀûÀÌ¸é ½ºÅ©·ÑÇÑ ÈÄ¿¡µµ ij·µÀÇ È­¸é»ó À§Ä¡°¡ ÀÏÁ¤Çϱ⸦ ¹Ù¶õ´Ù. »ç¿ëÀÚ´Â <PgUp>À» ´©¸¦ ¶§ ij·µ À§Ä¡¸¦ º¸°í ÀÖÀ¸¸ç È­¸é»óÀÇ ¼¼ ¹ø° ÁÙ¿¡¼­ <PgUp>À» ´­·¶À» °æ¿ì ½ºÅ©·ÑÇÑ ÈÄ¿¡µµ ¿©ÀüÈ÷ ¼¼ ¹ø° ÁÙ¿¡ ij·µÀÌ Àֱ⸦ ±â´ëÇÑ´Ù.

ÆíÁý À§Ä¡¿Í º¸¿©ÁÖ´Â À§Ä¡°¡ °¢°¢ ´Ù¸¦ ¼ö ÀÖ´Â ÅؽºÆ® ÆíÁý±â¿¡¼­ µÎ ¸í·ÉÀº Àǹ̰¡ ¾à°£ ´Ù¸¥ °ÍÀÌ´Ù. ±×·¡¼­ SB_PAGEUP ¸Þ½ÃÁö¸¦ ´ë½Å º¸³»´Â Æí¸®ÇÑ ¹æ¹ýÀº »ç¿ëÇÒ ¼ö ¾øÀ¸¸ç »ç¿ëÀÚ°¡ ±â´ëÇÏ´Â ´ë·Î µ¿ÀÛÇϵµ·Ï Çϱâ À§ÇØ Äڵ带 ´Ù½Ã ÀÛ¼ºÇß´Ù.

 

 

     int oldr;

     int yInc;

     RECT crt;

 

     GetClientRect(hWnd,&crt);

     ....

     case VK_PRIOR:

          GetRCFromOff(off,r,c);

          oldr=r;

          r-=crt.bottom/LineHeight;

          r=max(r,0);

          yInc=-(oldr-r)*LineHeight;

          yInc=max(-yPos, yInc);

          yPos=yPos+yInc;

          ScrollWindow(hWnd, 0,-yInc, NULL, NULL);

          SetScrollPos(hWnd, SB_VERT, yPos, TRUE);

 

          off=GetXPosOnLine(r,PrevX);

          SetCaret(FALSE);

          return;

 

È­¸é´ç ÁÙ¼ö¸¸Å­ À§·Î À̵¿½ÃÅ°µÇ ´Ü, À½¼öÁÙ·Î °¡Áö´Â ¾Êµµ·Ï ÇÏ¿´´Ù. À̶§ ½ºÅ©·ÑÇØ¾ß ÇÒ °Å¸® yInc´Â À̵¿ÇÑ ÁÙ ¼ö¿¡ ÁÙ°£À» °öÇØ ±¸Ç쵂 ´Ü, yPos°¡ À½¼ö°¡ µÇÁö ¾Êµµ·Ï ÇÏ¿´´Ù. ScrollWindow·Î ½ºÅ©·Ñ½ÃÅ°°í GetXPosOnLineÀ¸·Î »õ ¿ÀÇÁ¼ÂÀ» ãÀ¸¸é µÈ´Ù. ÀÌ ÄÚµå·Î Å×½ºÆ®Çغ¸¸é ¾Õ¿¡¼­ ¼³¸íÇÑ´ë·Î <PgUp>ÀÌ Àß µ¿ÀÛÇÒ °ÍÀÌ´Ù. Ç×»ó È­¸é»óÀÇ À§Ä¡°¡ ÀÏÁ¤ÇÏ¸ç ´õ ÀÌ»ó ½ºÅ©·ÑÇÒ °÷ÀÌ ¾ø¾îµµ È­¸é ù ÁÙ·Î À̵¿ÇÑ´Ù.

ÇÏÁö¸¸ ¾ÆÁ÷µµ ºÒ¸¸ÀÌ ÀÖ´Ù. ¾îÂ÷ÇÇ ÆäÀÌÁö´ÜÀ§·Î ½ºÅ©·ÑÇϸé È­¸é Àüü°¡ ¹Ù²î¹Ç·Î ½ºÅ©·ÑÀ» ÇÏ´Â °Íº¸´Ù´Â yPos¸¸ ¹Ù²Û ÈÄ ´Ù½Ã ±×¸®´Â °ÍÀÌ ´õ ³´´Ù. ScrollWindow ÇÔ¼ö¸¦ ¾²Áö ¾ÊÀ¸¸é yInc¸¦ °è»êÇÒ ÇÊ¿äµµ ¾ø¾îÁö°í yPos¸¦ Á÷Á¢ º¯°æÇÏ´Â °ÍÀÌ ÈξÀ ´õ Á÷°üÀûÀÌ´Ù. ÇÑ ¹ø ´õ Äڵ带 ¼öÁ¤Çغ¸ÀÚ.

 

void OnKey(HWND hWnd, UINT vk, BOOL fDown, int cRepeat, UINT flags)

{

     ....

     int oldr;

     RECT crt;

 

     if (fDown==FALSE)

          return;

 

     GetClientRect(hWnd,&crt);

     ....

     case VK_PRIOR:

          GetRCFromOff(off,r,c);

          oldr=r;

          r-=crt.bottom/LineHeight;

          r=max(r,0);

          yPos=yPos-(oldr-r)*LineHeight;

          yPos=max(yPos,0);

          InvalidateRect(hWnd,NULL,TRUE);

          SetScrollPos(hWnd, SB_VERT, yPos, TRUE);

 

          off=GetXPosOnLine(r,PrevX);

          SetCaret(FALSE);

          return;

 

yPos °ªÀ» ½ºÅ©·ÑµÈ °Å¸®¸¸Å­ Á÷Á¢ ¹Ù²Ù¾ú°í 0º¸´Ù ´õ Å« °ªÀ» °¡Áöµµ·Ï Çß´Ù. ½ºÅ©·ÑÀº ÇÒ ÇÊ¿ä¾øÀ¸¸ç InvalidateRect·Î Àüü ÀÛ¾÷¿µ¿ªÀ» ¹«È¿È­ÇسõÀ¸¸é OnPaint°¡ »õ·Î º¯°æµÈ yPos À§Ä¡¿¡ ±×·ÁÁÙ °ÍÀÌ´Ù. ÀÌ Äڵ尡 ³í¸®ÀûÀ¸·Î °¡Àå ¿Ïº®ÇÏ°í ¸¶À½¿¡ µç´Ù. <PgDn>ÀÇ Äڵ嵵 °°Àº ³í¸®´ë·Î ÀÛ¼ºÇÏ¸é µÈ´Ù.

 

     case VK_NEXT:

          GetRCFromOff(off,r,c);

          oldr=r;

          r+=crt.bottom/LineHeight;

          r=min(r,GetRowCount()-1);

          yPos=yPos+(r-oldr)*LineHeight;

          yPos=max(0,min(yPos,yMax-(crt.bottom/LineHeight)*LineHeight));

          InvalidateRect(hWnd,NULL,TRUE);

          SetScrollPos(hWnd, SB_VERT, yPos, TRUE);

 

          off=GetXPosOnLine(r,PrevX);

          SetCaret(FALSE);

          return;

 

<PgUp>Å°¸¦ ó¸®ÇÏ´Â Äڵ带 ¼¼¹úÀ̳ª ÀÛ¼ºÇØ ºÃ´Âµ¥ º¸´Ù½ÃÇÇ Àß µÉ °Í °°Àº Äڵ嵵 Á» ´õ »ìÆ캸¸é ¹®Á¦°¡ ÀÖ´Â °æ¿ì°¡ ¸¹´Ù. óÀ½ »ý°¢Çß´ø Äڵ尡 ´çÀåÀº ¹®Á¦°¡ ¾øÁö¸¸ ´Ù¸¥ °üÁ¡¿¡¼­ º¸¸é ¸»½éÀÌ ÀÖ¾î ¼öÁ¤ÇÏ°Ô µÇ°í ÀÌ·± °úÁ¤À» ¿©·¯ ¹ø °ÅÃÄ¾ß Á¦´ë·Î µÈ Äڵ带 ¾òÀ» ¼ö ÀÖ´Ù. ±×·¡¼­ ÇÁ·Î±×·¡¸Ó´Â Ç×»ó ÀÚ½ÅÀÇ Äڵ带 ÀǽÉÇϴµ¥ °ÔÀ»·¯¼­´Â ¾ÈµÈ´Ù. ¿©·¯ ¹ø ¼öÁ¤ÇßÁö¸¸ ³¡±îÁö ¹®Á¦Á¡À» ãÁö ¸øÇÑ Ã¤·Î ³Ñ¾î°¡°Ô µÇ¸é ±×°ÍÀ» ¹ö±×¶ó°í ÇÑ´Ù.

¸ðµç ½ºÅ©·Ñ °ü·Ã Äڵ带 ´Ù ÀÛ¼ºÇß´Ù. ÀÌÁ¦ º¸·ùÇصξú´ø UpdateScrollInfo ÇÔ¼öÀÇ ´ÙÀ½ Á¶°Ç¹®ÀÌ ¿Ö ÇÊ¿äÇÑÁö ¿¹Á¦¸¦ ½ÇÇàÇسõ°í ¹®Á¦¸¦ È®ÀÎÇغ¸µµ·Ï ÇÏÀÚ.

 

     if (si.nMax < (int)si.nPage) {

          yPos=0;

     }

 

¿¹Á¦¸¦ ½ÇÇàÇϸé OnCreate¿¡¼­ ´ëÀÔÇÑ Ãʱ⠹®ÀÚ¿­ÀÌ È­¸é¿¡ ³ª¿Ã °ÍÀÌ´Ù. ¹®¼­ÀÇ Á¦ÀÏ ³¡À¸·Î À̵¿ÇÑ ÈÄ BS·Î Line3¾Õ±îÁö ¸ðµÎ ´Ù Áö¿ì°í Á¦ÀÏ ¾Æ·¡·Î ½ºÅ©·ÑÇÏ¿© ¿ÞÂÊ ±×¸²Ã³·³ ¸¸µé¾îº¸ÀÚ.

 

À§ÂÊ¿¡ µÎ ÁÙÀÌ ´õ Àִµ¥ ½ºÅ©·ÑµÇ¾î º¸ÀÌÁö ¾Ê´Â´Ù. ÀÌ »óÅ¿¡¼­ <BS>Å°·Î °è¼Ó ¹®ÀÚ¸¦ »èÁ¦ÇÏ¸é ¿À¸¥ÂÊ ±×¸²Ã³·³ µÈ´Ù. À§¿¡ ¼û¾î ÀÖ´Â µÎ ÁÙ±îÁö ´Ù ÇÕÃĵµ ¼¼ ÁÙ¹Û¿¡ ¾È ³²¾Ò°í È­¸é¿¡´Â 7ÁÙ±îÁö Ç¥½ÃÇÒ ¼ö ÀÖÀ¸¹Ç·Î ¼öÁ÷ ½ºÅ©·Ñ¹Ù´Â µð½º¿¡À̺íµÈ´Ù. ÀÌ »óÅ¿¡¼­´Â Å°º¸µå·Î´Â À§·Î ¿Ã¶ó°¥ ¼ö ÀÖÁö¸¸ ½ºÅ©·Ñ¹Ù¸¦ Ŭ¸¯ÇÏ¿© À§·Î ¿Ã¶ó°¡Áö ¸øÇÏ´Â ¹®Á¦°¡ ÀÖ´Ù.

±×·¡¼­ ½ºÅ©·Ñ ¹üÀ§¸¦ Á¤ÇÒ ¶§ ÀÌ »óÅÂÀÎÁö ¾Æ´ÑÁö Á¡°ËÇÑ´Ù. Á¶°Ç¹® si.nMax < (int)si.nPage´Â °ð ¡®½ºÅ©·Ñ ¹üÀ§°¡ ÆäÀÌÁö ³ôÀ̺¸´Ù ÀÛÀ¸¸é¡¯À̶ó´Â ¶æÀÌ°í ÀÌ´Â °÷ ½ºÅ©·Ñ¹Ù°¡ µð½º¿¡À̺íµÉ Á¶°ÇÀÌ´Ù. ÀÌ »óÅ°¡ µÇ¸é yPos¸¦ °­Á¦·Î 0À¸·Î ¸ÂÃß¾î ù ÁÙÀÌ º¸À̵µ·Ï ¹Ì¸® °­Á¦ ½ºÅ©·ÑÀ» Çß´Ù.