¸¶.´õºí ¹öÆÛ¸µ

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·Î ÁÖ³ª ÀüÇô Â÷À̰¡ ¾øÀ¸¹Ç·Î ±×³É µÖµµ »ó°ü¾øÀ¸¸ç ¾Æ¹«·± Â÷ÀÌÁ¡µµ ¾ø´Ù.