ApiDraw06±îÁö ¸¸µé¾îÁø °á°ú¸¦ Å×½ºÆ®ÇØ º¸¸é ±ô¹ÚÀÓÀÌ ¹«Ã´ ½ÉÇÏ´Ù´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù. µµÇüÀ» ¸¹ÀÌ ±×·Á ³õ°í ¼±ÅÃÀ» º¯°æÇϸé ȸé Àüü°¡ ±ô¹Ú°Å¸®´Âµ¥ ÀÌÀü Æ®·¡Ä¿¸¦ Áö¿ì±â À§ÇØ ¹è°æ»öÀ¸·Î ¿ÏÀüÈ÷ Áö¿î ÈÄ ¸ðµç µµÇüÀ» ´Ù½Ã ±×¸®±â ¶§¹®ÀÌ´Ù. Űº¸µå·Î µµÇüÀ» À̵¿½ÃŰ¸é ±ô¹ÚÀÓÀÌ Æ¯È÷ ½ÉÇØÁö´Âµ¥ Ű Çѹø ÀÔ·ÂÇÒ ¶§¸¶´Ù ÀÛ¾÷ ¿µ¿ª Àüü°¡ ¹«È¿ÈµÇ¹Ç·Î ¾î¿ ¼ö°¡ ¾ø´Ù. ±ô¹ÚÀÓÀÇ ¿øÀÎÀº ȸ鿡 Á¶±ÝÀÌ¶óµµ º¯°æÀÌ °¡ÇØÁú ¶§¸¶´Ù ¹è°æ ºê·¯½Ã·Î ÀÛ¾÷ ¿µ¿ªÀ» Áö¿ì°í ´Ù½Ã ±×¸®±â ¶§¹®Àε¥ ¹®Á¦¸¦ ÇØ°áÇÏ·Á¸é ¿ì¼± ĵ¹ö½ºÀÇ ¹è°æ ºê·¯½Ã¸¦ ¾ø¾Ö¾ß ÇÑ´Ù. ApiDraw07 ÇÁ·ÎÁ§Æ®¸¦ ¸¸µç ÈÄ ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇØ º¸ÀÚ.
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance
,LPSTR lpszCmdParam,int nCmdShow)
{
....
WndClass.hbrBackground=NULL;
WndClass.lpfnWndProc=CanvasProc;
WndClass.lpszClassName="Canvas";
WndClass.lpszMenuName=NULL;
WndClass.style=CS_DBLCLKS;
RegisterClass(&WndClass);
¶Ç´Â WM_ERASEBKGND ¸Þ½ÃÁö¸¦ ¸·¾Æ ¹ö·Áµµ µ¿ÀÏÇÑ È¿°ú°¡ ÀÖ´Ù. ÀÌ »óÅ¿¡¼ ÇÁ·Î±×·¥À» ½ÇÇàÇØ º¸¸é ÀÛ¾÷ ¿µ¿ªÀ» Áö¿ìÁö ¾Ê±â ¶§¹®¿¡ ±ô¹ÚÀÓÀº ¾ø¾îÁöÁö¸¸ ÀÌÀü µµÇü°ú Æ®·¡Ä¿°¡ Áö¿öÁöÁö ¾Ê±â ¶§¹®¿¡ ȸéÀº ±×¾ß¸»·Î ¾û¸ÁÀÌ µÈ´Ù. °á±¹ ȸ鿡 º¯È°¡ »ý±æ ¶§ ÀÌÀü ±×¸²À» Áö¿î ÈÄ ´Ù½Ã ±×·Á¾ß ÇÑ´Ù´Â ¾ê±â°¡ µÇ´Âµ¥ ´Ù½Ã ±×¸®¸é¼µµ ±ô¹ÚÀÓÀ» ¾ø¾Ö´Â À¯ÀÏÇÏ°íµµ ¿ÏÀüÇÑ ¹æ¹ýÀº ´õºí ¹öÆÛ¸µÀ» ÇÏ´Â °ÍÀÌ´Ù. ȸéÀÌ ¾Æ´Ñ ¸Þ¸ð¸®¿¡¼ ¿Ï¼ºµÈ ±×¸²À» ºñÆ®¸Ê¿¡ ±×¸° ÈÄ °á°ú¸¸ ȸéÀ¸·Î º¹»çÇØ¾ß ÇÑ´Ù. ´õºí ¹öÆÛ¸µ¿¡ »ç¿ëÇÒ ºñÆ®¸Ê ÇÚµéÀ» Àü¿ªÀ¸·Î ¼±¾ðÇÑ´Ù.
HBITMAP hBackBit;
ÀÌ ºñÆ®¸ÊÀÇ Ç¥¸é¿¡ ±×¸²À» ±×¸± °ÍÀÌ´Ù. OnCreate¿¡¼ ºñÆ®¸ÊÀ» NULL·Î ÃʱâÈÇÏ°í ´õºí ¹öÆÛ¸µÀ» Çϱâ Á÷Àü¿¡ ÇÊ¿äÇÑ Å©±â¸¸Å »ý¼ºÇÒ °ÍÀÌ´Ù.
LRESULT OnCreate(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
....
hBackBit=NULL;
´õºí ¹öÆÛ¸µÀÇ ÁÖü´Â OnPaintÀ̹ǷΠÀÌ ÇÔ¼ö¸¦ ´ë´ëÀûÀ¸·Î ¼öÁ¤ÇØ¾ß ÇÑ´Ù. Ãâ·ÂÀ» ³» º¸³»±â Àü¿¡ ÀÛ¾÷ ¿µ¿ª Å©±â¸¸Å ºñÆ®¸ÊÀ» »ý¼ºÇϰí ÀÌ ºñÆ®¸Ê¿¡ ¸ðµç ±×¸²À» ±×¸° ÈÄ ÃÖÁ¾ °á°ú¸¸ ȸé DC·Î Àü¼ÛÇÑ´Ù.
LRESULT OnPaint(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
int idx;
HPEN hPen,hOldPen;
HBRUSH hBrush,hOldBrush;
RECT crt;
HDC hMemDC;
HBITMAP hOldBitmap;
hdc=BeginPaint(hWnd, &ps);
hMemDC=CreateCompatibleDC(hdc);
GetClientRect(hWnd,&crt);
if (hBackBit == NULL) {
hBackBit=CreateCompatibleBitmap(hdc,crt.right,crt.bottom);
}
hOldBitmap=(HBITMAP)SelectObject(hMemDC,hBackBit);
FillRect(hMemDC,&crt,GetSysColorBrush(COLOR_WINDOW));
for (idx=0;idx<arNum;idx++) {
....
}
BitBlt(hdc,0,0,crt.right,crt.bottom,hMemDC,0,0,SRCCOPY);
SelectObject(hMemDC,hOldBitmap);
DeleteDC(hMemDC);
EndPaint(hWnd, &ps);
return 0;
}
ȸé DC¿Í ȣȯµÇ´Â ¸Þ¸ð¸® DC¸¦ ¸¸µé°í hBackBit°¡ NULLÀÏ °æ¿ì ÀÛ¾÷ ¿µ¿ª Å©±â¸¸ÇÑ ºñÆ®¸ÊÀ» »ý¼ºÇÑ´Ù. Çѹø »ý¼ºµÈ ºñÆ®¸ÊÀº ´Ù½Ã ¸¸µé ÇÊ¿ä¾øÀÌ °è¼Ó »ç¿ëµÈ´Ù. ¸Þ¸ð¸® DC¿¡ hBackBit¸¦ ¼±ÅÃÇØ ³õ°í ¸Þ¸ð¸® DC·Î Ãâ·ÂÀ» º¸³»¸é ÀÌ Ãâ·ÂÀº ¸ðµÎ ºñÆ®¸Ê Ç¥¸é¿¡ ±×·ÁÁú °ÍÀÌ´Ù. ¸ÕÀú FillRect ÇÔ¼ö·Î ºñÆ®¸Ê Àüü¸¦ Èò»öÀ¸·Î °¡µæ ä¿ö ÀÌÀü¿¡ ±×·ÁÁ® ÀÖ´ø ±×¸²À» ¸ðµÎ Áö¿ö ±ú²ýÇÑ »óÅ·Π¸¸µç´Ù.
±×¸®°í for ·çÇÁ¸¦ µ¹¸ç ¹è¿¿¡ ±â·ÏµÈ ¸ðµç µµÇüÀ» Ãâ·ÂÇ쵂 ´ë»ó DC´Â ȸé hdc°¡ ¾Æ´Ï¶ó ¸Þ¸ð¸®ÀÇ hMemDC¿©¾ß ÇÑ´Ù. for ·çÇÁ ³»ºÎÀÇ ¸ðµç GDI ÇÔ¼öÀÇ Ã¹ ¹øÂ° Àμö¸¦ hMemDC·Î ¹Ù²Û´Ù. ÀÌ·¸°Ô ±×·ÁÁø ±×¸²Àº ÃÖÁ¾ÀûÀ¸·Î BitBlt ÇÔ¼ö¿¡ ÀÇÇØ ȸéÀ¸·Î °í¼Ó Àü¼ÛµÈ´Ù. Àü¼Û ¿Ï·á ÈÄ ¸Þ¸ð¸® DC´Â »èÁ¦Ç쵂 hBackBit´Â ´ÙÀ½ ±×¸®±â¸¦ ÇÒ ¶§ ´Ù½Ã »ç¿ëÇØ¾ß ÇϹǷΠ»èÁ¦ÇÏÁö ¾Ê°í ±×´ë·Î ³²°Ü µÐ´Ù. hBackBit°¡ ¹Ù·Î ´õºí ¹öÆÛ¸µÀÇ °á°ú¹°ÀÌ´Ù.
±×¸®±â ÀÛ¾÷ÀÌ ¸ðµÎ ¸Þ¸ð¸® ³»ºÎ¿¡¼ ÀÌ·ç¾îÁö±â ¶§¹®¿¡ »ç¿ëÀÚ´Â µµÇüÀÌ Áö¿öÁ³´Ù°¡ ´Ù½Ã ±×·ÁÁö´Â °úÁ¤À» ÀüÇô º¼ ¼ö ¾øÀ¸¸ç ¿Ï¼ºµÈ ¸ð½À¸¸ º¼ ¼ö ÀÖ´Ù. OnPaint¿¡¼´Â ÀÛ¾÷ ¿µ¿ª Å©±â¸¸ÇÑ ºñÆ®¸ÊÀ» Çѹø ¸¸µé¾î ³õ°í °è¼Ó Àç»ç¿ëÇϰí Àִµ¥ Å©±â°¡ ¹Ù²î¸é ºñÆ®¸ÊÀÇ Å©±âµµ °°ÀÌ ¹Ù²î¾î¾ß ÇÑ´Ù. ÀÛ¾÷ ¿µ¿ª Å©±â°¡ º¯°æµÇ´Â OnSize¿¡¼ ºñÆ®¸ÊÀÇ Å©±â¸¦ °ü¸®Çϴµ¥ ´Ü¼øÈ÷ ºñÆ®¸ÊÀ» »èÁ¦Çϱ⸸ ÇÏ¸é µÈ´Ù.
LRESULT OnSize(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
if (wParam != SIZE_MINIMIZED) {
if (hBackBit) {
DeleteObject(hBackBit);
hBackBit=NULL;
}
}
return 0;
}
ºñÆ®¸ÊÀ» »èÁ¦Çϰí hBackBit¸¦ NULL·Î ¸¸µé¾î ³õ±â¸¸ ÇÏ¸é ´ÙÀ½¹ø OnPaint¿¡¼ º¯°æµÈ ÀÛ¾÷ ¿µ¿ªÀÇ Å©±â¿¡ ¸Â°Ô ºñÆ®¸ÊÀ» ´Ù½Ã »ý¼ºÇÒ °ÍÀÌ´Ù. ºñÆ®¸ÊÀ» »ý¼ºÇÏ´Â ÄÚµå´Â OnPaint¿¡ ÀÖ°í OnSize´Â ºñÆ®¸ÊÀ» ¹«È¿È½ÃÄÑ ´Ù½Ã ¸¸µé¾î¾ß ÇÑ´Ù´Â °ÍÀ» OnPaint¿¡°Ô ¾Ë¸®±â¸¸ ÇÑ´Ù. ´Ü, ÃÖ¼Ò鵃 ¶§´Â ¾îÂ÷ÇÇ È¸é¿¡ º¸ÀÌÁö ¾ÊÀ¸¹Ç·Î ºñÆ®¸ÊÀ» ÆÄ±«ÇÒ Çʿ䰡 ¾ø´Ù. ¾îÂ÷ÇÇ ´Ù½Ã º¹±¸µÇ¸é ÀÌÀü Å©±â¿Í °°¾ÆÁö¹Ç·Î µÎ ¹ø¾¿À̳ª ºñÆ®¸ÊÀ» »õ·Î ¸¸µå´Â ºÒÇÊ¿äÇÑ µ¿ÀÛÀ» ÇÒ Çʿ䰡 ¾ø´Â °ÍÀÌ´Ù.
°á±¹ hBackBit ºñÆ®¸ÊÀº ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÇ´Âµ¿¾È ĵ¹ö½ºÀÇ ÀÛ¾÷ ¿µ¿ª Å©±â¿Í °°Àº Å©±â·Î Ç×»ó Á¸ÀçÇÑ´Ù. ÀÌ ºñÆ®¸ÊÀº ĵ¹ö½º°¡ ÆÄ±«µÇ´Â OnDestroy¿¡¼ ÇØÁ¦µÈ´Ù.
LRESULT OnDestroy(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
int idx;
for (idx=0;idx<arNum;idx++) {
free(arObj[idx]);
}
free(arObj);
if (hBackBit) {
DeleteObject(hBackBit);
hBackBit=NULL;
}
return 0;
}
´õºí ¹öÆÛ¸µÀÌ ¿Ï·áµÇ¾ú´Ù. ÀÌÁ¦ Å×½ºÆ®ÇØ º¸¸é ±ô¹ÚÀÓÀ» ÀüÇô ´À³¥ ¼ö ¾øÀ» °ÍÀÌ´Ù. ¸ðµç InvalidateRect È£Ãâ¹®ÀÇ ¸¶Áö¸· Àμö bErase´Â TRUE¿¡¼ FALSE·Î ¹Ù²Ù´Â °ÍÀÌ ³í¸®»ó ¸Â´Ù. ±×·¯³ª ¾îÂ÷ÇÇ ¹è°æ ºê·¯½Ã°¡ ¾ø´Â »óȲ¿¡¼ ÀÌ Àμö´Â TRUE·Î ÁÖ³ª FALSE·Î ÁÖ³ª ÀüÇô Â÷À̰¡ ¾øÀ¸¹Ç·Î ±×³É µÖµµ »ó°ü¾øÀ¸¸ç ¾Æ¹«·± Â÷ÀÌÁ¡µµ ¾ø´Ù.