ÀÌ ÇÁ·Î±×·¥Àº »ðÀÔ, »èÁ¦¿Í °°Àº ¹öÆÛÀÇ º¯È´Â ¹°·ÐÀÌ°í À©µµ¿ìÀÇ Å©±â º¯È, Æ÷Ä¿½º º¯È, ¼±ÅÃÀÇ º¯È µî ¾à°£ÀÇ º¯È¿¡ ´ëÇؼµµ Ç×»ó 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⠶§¹®¿¡ Ŭ¸®Çοµ¿ªÀÌ ÀÛ¾÷¿µ¿ªº¸´Ù ´õ Ä¿Áö´Â ÀÏÀº ¾ø´Ù. ÀÌ ÇÔ¼ö´Â ¿ÀÇÁ¼ÂÀ» Àü´Þ¹Þ¾Æ ¿ÀÇÁ¼ÂÀÌ ¼ÓÇÑ ÁÙÀ» ¹«È¿ÈÇϹǷΠ¹®¼¸¦ º¯°æÇÏ´Â °¢ ·çƾ¿¡¼ È£ÃâÇÏ°Ô µÉ °ÍÀÌ´Ù.