°¡. ¹«È¿¿µ¿ª ÃÖ¼ÒÈ­

ÀÌ ÇÁ·Î±×·¥Àº »ðÀÔ, »èÁ¦¿Í °°Àº ¹öÆÛÀÇ º¯È­´Â ¹°·ÐÀÌ°í À©µµ¿ìÀÇ Å©±â º¯È­, Æ÷Ä¿½º º¯È­, ¼±ÅÃÀÇ º¯È­ µî ¾à°£ÀÇ º¯È­¿¡ ´ëÇؼ­µµ Ç×»ó InvalidateRect(hWnd,NULL,TRUE)¸¦ È£ÃâÇÔÀ¸·Î½á ÀÛ¾÷¿µ¿ª Àüü¸¦ ¹«È¿È­½ÃŲ´Ù. ÀÌ·¸°Ô Çصµ ´õºí ¹öÆÛ¸µÀ» Á¦´ë·Î ÇÏ°í Àֱ⠶§¹®¿¡ ±ô¹Ú°Å¸°´Ù°Å³ª ½ÉÇÏ°Ô ´À·ÁÁöÁö´Â ¾Ê´Â´Ù. ÇÏÁö¸¸ ´Ù½Ã ±×¸± ÇÊ¿ä°¡ ¾ø´Â ¿µ¿ª±îÁö ¸ù¶¥ ÀçÃâ·ÂÇÔÀ¸·Î½á ½ÇÇà½Ã°£À» ³¶ºñÇÏ°í ÀÖ´Â °ÍÀº ºÐ¸íÇÏ´Ù.

Àüü¸¦ ´Ù½Ã ±×¸®´Â ½Ã°£ÀÌ »ç¶÷ÀÇ Á¶ÀÛ ¼Óµµº¸´Ù ºü¸£±â¸¸ ÇÏ´Ù¸é º° ¹®Á¦°¡ ¾øÀ¸¸ç ÇöÀçÀÇ ÄÄÇ»ÅÍ ¼Óµµ»óÀ¸·Î ³Ë³ËÇÏ´Ù. ÇÏÁö¸¸ ÇÁ·Î±×·¥À» »ç¿ëÇÒ ¼ö ÀÖ´Â ÄÄÇ»ÅÍ »ç¾çÀº ³·À»¼ö·Ï ÁÁÀº °ÍÀÌ°í ¶Ç ¾ÕÀ¸·ÎÀÇ ±â´É È®ÀåÀ» °í·ÁÇÏ¿© Á» ´õ ¼Óµµ¸¦ ³ôÀÏ ¼ö ÀÖ´Â ¹æ¹ýÀÌ ÀÖ´Ù¸é Èû´ê´Â µ¥±îÁö ÃÖÀûÈ­¸¦ Çسõ´Â °ÍÀÌ ÁÁ´Ù.

Ç×»ó ÀÛ¾÷¿µ¿ª Àüü¸¦ ¹«È¿È­ÇÏÁö ¸»°í ²À ÇÊ¿äÇÑ ºÎºÐ¸¸ ´Ù½Ã ±×¸®µµ·Ï ÇÏ¸é ¸¹Àº ¼Óµµ Çâ»óÀ» ±â´ëÇÒ ¼ö ÀÖ´Ù. ¹«È¿ÇÑ ¿µ¿ª¸¸ ±×¸®±â À§Çؼ­´Â ¸ÕÀú OnPaint°¡ ÀÛ¾÷¿µ¿ª¿¡ ´ëÇؼ­ ±×¸®±â¸¦ ÇÒ °ÍÀÌ ¾Æ´Ï¶ó ¹«È¿¿µ¿ªÀ» ±âÁØÀ¸·Î ±×¸®±â¸¦ ÇØ¾ß ÇÑ´Ù. Áï, ¹«È¿¿µ¿ªÀ» ÀνÄÇϵµ·Ï ¼öÁ¤ÇØ¾ß ÇÑ´Ù.

 

void OnPaint(HWND hWnd)

{

     HDC hdc, hMemDC;

     PAINTSTRUCT ps;

     int l;

     RECT crt;

    int s,e,t;

     HBRUSH hBrush;

     HBITMAP OldBitmap;

     RECT lrt;

 

     hdc=BeginPaint(hWnd,&ps);

     GetClientRect(hWnd,&crt);

 

    t=yPos/LineHeight;

    s=(yPos+ps.rcPaint.top)/LineHeight;

    e=(yPos+ps.rcPaint.bottom-1)/LineHeight;

     e=min(e,TotalLine-1);

 

     hMemDC=CreateCompatibleDC(hdc);

     if (hBit == NULL) {

          hBit=CreateCompatibleBitmap(hdc,crt.right,LineHeight);

     }

     OldBitmap=(HBITMAP)SelectObject(hMemDC,hBit);

 

     hBrush=GetSysColorBrush(COLOR_WINDOW);

     SetRect(&lrt,0,0,crt.right,LineHeight);

 

     for (l=s;l<=e;l++) {

          FillRect(hMemDC,&lrt,hBrush);

          DrawLine(hMemDC,l);

        BitBlt(hdc,0,(l-t)*LineHeight,crt.right,(l-t)*LineHeight+LineHeight,

            hMemDC,0,0,SRCCOPY);

     }

 

    SetRect(&lrt,0,(l-t)*LineHeight,crt.right,crt.bottom);

     FillRect(hdc,&lrt,hBrush);

 

     DeleteObject(hBrush);

     SelectObject(hMemDC,OldBitmap);

     DeleteDC(hMemDC);

     EndPaint(hWnd,&ps);

}

 

Ãâ·ÂÇÒ ¹üÀ§ÀÎ s,e¸¦ °è»êÇÏ´Â ½ÄÀÌ ÀÛ¾÷¿µ¿ªÀ» ±âÁØÀ¸·Î ÇÏÁö ¾Ê°í Ŭ¸®Çοµ¿ªÀÎ rcPaint¸¦ ±âÁØÀ¸·Î ÇÑ´Ù. Ŭ¸®Çοµ¿ªÀ̶õ ´Ù½Ã ±×·ÁÁ®¾ß ÇÒ ¹«È¿¿µ¿ª Áß¿¡¼­ º¸ÀÌ´Â °¡½Ã ¿µ¿ªÀε¥ ÀÌ ¿µ¿ª¿¡ ¼ÓÇØ ÀÖ´Â ÁÙ¸¸ ´Ù½Ã ±×¸®¸é µÈ´Ù. Ãâ·Â ½ÃÀÛÁÙ s´Â Ŭ¸®Çοµ¿ªÀÇ À§ÂÊ ÁÂÇ¥¸¦ ÁÙ°£À¸·Î ³ª´©¸é ±¸ÇÒ ¼ö ÀÖ´Ù. e´Â Ŭ¸®Çοµ¿ªÀÇ ³¡Á¡¿¡¼­ 1À» »© ÁØ ÈÄ ÁÙ°£À¸·Î ³ª´©¾ú´Âµ¥ ¿©±â¼­ 1À» »© ÁÖ´Â ÀÌÀ¯´Â ¹«È¿¿µ¿ªÀÇ ³¡ ÁÂÇ¥¸¦ Á¦¿ÜÇϱâ À§Çؼ­ÀÌ´Ù.

¿¹¸¦ µé¾î 24~48±îÁö ¹«È¿¿µ¿ªÀ¸·Î ÁöÁ¤Çß´Ù°í ÇÏÀÚ. ÀÌ ¹üÀ§´Â µÎ ¹ø° ÁÙÀÇ ¼öÁ÷ÁÂÇ¥¿Í µ¿ÀÏÇѵ¥ ÁÙ°£ 24·Î °¢°¢ ³ª´©¸é Ãâ·Â ¹üÀ§´Â 1~2°¡ µÈ´Ù. À̶§ 2¹ø° ÁÙÀº Ãâ·ÂÇÒ ÇÊ¿ä°¡ ¾ø´Âµ¥µµ ¹üÀ§¿¡ µé°Ô µÇ¹Ç·Î 48¿¡¼­ 1À» »©ÁØ 47À» 24·Î ³ª´®À¸·Î½á 1¹ø° ÁÙ¸¸ Ãâ·ÂÇϵµ·Ï ÇÑ´Ù.

°¢ ÁÙÀÇ Ãâ·ÂÀ§Ä¡´Â È­¸é»óÀÇ ¸î ¹ø° ÁÙÀΰ¡¸¦ °è»êÇÏ¿© ±¸Çߴµ¥ ÀÌÁ¦ s°¡ ´õ ÀÌ»ó È­¸é»óÀÇ Ã¹ ÁÙÀÌ ¾Æ´Ï¹Ç·Î l-s½ÄÀ¸·Î´Â ¸î ¹ø° ÁÙÀÎÁö ¾Ë ¼ö°¡ ¾ø°Ô µÇ¾ú´Ù. ±×·¡¼­ È­¸é»óÀÇ Ã¹ ÁÙ¹øÈ£¸¦ ±¸Çϱâ À§ÇØ t¶ó´Â º¯¼ö°¡ »õ·Î ¼±¾ðµÇ¾úÀ¸¸é Ãâ·ÂµÇ´Â ÁÂÇ¥´Â l-t·Î °è»êµÈ´Ù.

OnPaint´Â ¹«È¿¿µ¿ª ³»ºÎ¸¸ ´Ù½Ã ±×¸®µµ·Ï ¼öÁ¤µÇ¾úÀ¸¹Ç·Î ÀÌÁ¦ ¹®¼­¸¦ º¯°æÇÏ´Â ¸ðµç °÷¿¡¼­ ²À ÇÊ¿äÇÑ ºÎºÐ¸¸ ¹«È¿È­½ÃÄÑ¾ß ÇÑ´Ù. ±×·±µ¥ ¹®¼­ÆíÁýÄÚµåµéÀº È­¸é»óÀÇ Çȼ¿ ÁÂÇ¥¸¦ ´Ù·ç´Â °ÍÀÌ ¾Æ´Ï¶ó ¿ÀÇÁ¼ÂÀ» ÁÖµÈ ÀÛ¾÷ ´ë»óÀ¸·Î Çϴµ¥´Ù°¡ OnPaint´Â ÁÙ´ÜÀ§·Î Ãâ·ÂÇϹǷΠ¿ÀÇÁ¼ÂÀ¸·ÎºÎÅÍ ÁÙ¹øÈ£¸¦ ¸ÕÀú Á¶»çÇØ¾ß ÇÏ´Â ¹ø°Å·Î¿òÀÌ ÀÖ´Ù. ±×·¡¼­ ¹«È¿È­¸¸ Àü¹®ÀûÀ¸·Î ¼öÇàÇÏ´Â º°µµÀÇ À¯Æ¿¸®Æ¼ ÇÔ¼ö¸¦ ÀÛ¼ºÇÏ¿´´Ù.

 

void Invalidate(int Pos1, int Pos2/*=-1*/)

{

     RECT rt,crt;

     int x,y,y1,y2;

 

     if (Pos1 == -1) {

          InvalidateRect(hWndMain,NULL,FALSE);

          return;

     }

 

     GetClientRect(hWndMain,&crt);

     GetXYFromOff(Pos1,x,y);

     y1=y-yPos;

 

     if (Pos2 == -1) {

          y2=crt.bottom;

     } else {

          GetXYFromOff(Pos2,x,y);

          y2=y-yPos+LineHeight;

     }

 

     SetRect(&rt,0,y1,crt.right,y2);

     InvalidateRect(hWndMain,&rt,FALSE);

}

 

ÀÌ ÇÔ¼ö´Â µÎ °³ÀÇ ¿ÀÇÁ¼Â Pos1°ú Pos2¸¦ ÀÔ·Â¹Þ¾Æ µÎ ¿ÀÇÁ¼ÂÀÌ ¼ÓÇØ ÀÖ´Â ÁÙµéÀ» ¸ðµÎ ¹«È¿È­ÇÑ´Ù. À̶§ µÎ ¿ÀÇÁ¼ÂÀº ¹Ýµå½Ã Å©±â¼øÀ¸·Î Á¤·ÄµÇ¾î ÀÖ¾î¾ß ÇÑ´Ù. Áï, Pos1Àº Ç×»ó Pos2º¸´Ù ÀÛÀº °ªÀ̾î¾ß ÇÏ¸ç ±×·¡¾ß ¹«È¿¿µ¿ªÀ» ½±°Ô ±¸ÇÒ ¼ö ÀÖ´Ù. Pos2´Â µðÆúÆ® Àμö -1·Î Á¤ÀǵǾî Àִµ¥ ÀÌ Àμö°¡ -1À̸é ÀÛ¾÷¿µ¿ªÀÇ ³¡±îÁö ¹«È¿È­ÇÑ´Ù. ¸¸¾à Pos1ÀÌ -1À̸é ÀÛ¾÷¿µ¿ª Àüü¸¦ ¹«È¿È­ÇÑ´Ù. ÀÌ ÇÔ¼öÀÇ È£Ãâ ¿¹´Â ´ÙÀ½°ú °°´Ù.

 

Invalidate(1234);           // 1234°¡ ¼ÓÇÑ ÁÙ ÀÌÈÄ È­¸é ³¡±îÁö ¹«È¿È­

Invalidate(1234,5678);        // 1234°¡ ¼ÓÇÑ ÁÙ ~ 5678ÀÌ ¼ÓÇÑ ÁÙ±îÁö ¹«È¿È­

Invalidate(-1);                  // ÀÛ¾÷¿µ¿ª Àüü ¹«È¿È­

 

ÀÌ ÇÔ¼ö´Â Àü´Þ¹ÞÀº ¿ÀÇÁ¼ÂÀ¸·ÎºÎÅÍ ¹®¼­»óÀÇ Çȼ¿ ÁÂÇ¥¸¦ °è»êÇÏ°í ½ºÅ©·Ñ °ªÀ» »© È­¸é»óÀÇ Çȼ¿ ÁÂÇ¥¸¦ ¸¸µç´Ù. ±×¸®°í µÎ ¹üÀ§ »çÀÌ¿¡ ¼ÓÇÑ ÁÙµéÀ» ¸ðµÎ ¹«È¿È­ÇÑ´Ù. À̶§ InvalidateRect ÇÔ¼öÀÇ ¼¼ ¹ø° Àμö´Â FALSE·Î ÁÖ¾ú´Âµ¥ ¾îÂ÷ÇÇ ¹è°æ ºê·¯½Ã°¡ ¾ø´Â ÇöÀç ÀÌ Àμö´Â TRUE, FALSE°£ÀÇ Â÷ÀÌ°¡ ÀüÇô ¾ø´Ù. ¹è°æ ºê·¯½Ã°¡ ¾øÀ¸¹Ç·Î ¹è°æÀº Áö¿öÁöÁö ¾ÊÀ¸¸ç ±×·¡¼­ ÀÌ Àμö´Â FALSE·Î µÎ´Â °ÍÀÌ ³í¸®ÀûÀ¸·Î ´õ ¸Â´Â °Í °°´Ù.

¸¸¾à Pos1°ú Pos2°¡ ¼ÓÇÑ ÁÙÀÌ È­¸é ¿µ¿ªÀÇ ¹ÛÀÌ¸é ¹«È¿¿µ¿ªÀÌ ÀÛ¾÷¿µ¿ªº¸´Ù ´õ Ä¿Áú ¼öµµ ÀÖ´Ù. ¼±Åÿµ¿ªÀº È­¸é ¿µ¿ªº¸´Ù ´õ Ä¿Áú ¼ö Àֱ⠶§¹®¿¡ ÀÌ°ÍÀº ÃæºÐÈ÷ °¡´ÉÇϸç ÀÌ·¸°Ô µÇ¸é Ãâ·Â ¹üÀ§°¡ Á¼¾ÆÁö´Â °ÍÀÌ ¾Æ´Ï¶ó ¿ÀÈ÷·Á ³Ð¾îÁú °ÍÀÌ´Ù. ±×·¡¼­ Pos1°ú Pos2·Î ±¸ÇÑ y1°ú y2´Â ´ÙÀ½Ã³·³ ÇÑ°è Á¡°ËÀ» ÇØ¾ß ÇÑ´Ù.

 

y1=max(y1,0);

y2=min(y2,crt.bottom);

 

ÇÏÁö¸¸ ÀÌ Ã³¸®¸¦ ÇÏÁö ¾ÊÀº ÀÌÀ¯´Â InvalidateRect ÇÔ¼ö°¡ ÀÛ¾÷¿µ¿ªº¸´Ù ´õ Å« ¹«È¿¿µ¿ªÀ» ¼³Á¤Çصµ ¹®Á¦°¡ ÀüÇô ¾ø±â ¶§¹®ÀÌ´Ù. OnPaint¿¡¼­ ÃÖÁ¾ÀûÀ¸·Î °è»êµÇ´Â Ŭ¸®Çοµ¿ªÀº ¹«È¿¿µ¿ª Áß¿¡¼­ °¡½Ã ¿µ¿ªÀ¸·Î Á¦ÇѵDZ⠶§¹®¿¡ Ŭ¸®Çοµ¿ªÀÌ ÀÛ¾÷¿µ¿ªº¸´Ù ´õ Ä¿Áö´Â ÀÏÀº ¾ø´Ù. ÀÌ ÇÔ¼ö´Â ¿ÀÇÁ¼ÂÀ» Àü´Þ¹Þ¾Æ ¿ÀÇÁ¼ÂÀÌ ¼ÓÇÑ ÁÙÀ» ¹«È¿È­ÇϹǷΠ¹®¼­¸¦ º¯°æÇÏ´Â °¢ ·çƾ¿¡¼­ È£ÃâÇÏ°Ô µÉ °ÍÀÌ´Ù.