ê·¼ë©´ì€ í–‰ìš´ì˜ ì–´ë¨¸ë‹ˆì´ë‹¤. 반대로 ê²Œìœ¼ë¦„ì€ ì¸ê°„ì„ ê·¸ ê°€ 가장 ë°”ë¼ëŠ” ì–´ë–¤ 목표ì—는 ê²°ì½” ë°ë ¤ë‹¤ 주지 않는다. - M.D 세르반테스

1 윈ë„ìš° í”„ë¡œì‹œì ¸ #
- ëª¨ë“ ìœˆë„우는 ìš´ì˜ì²´ê³„로부터 ìžì‹ ì—게 ì „ë‹¬ë˜ëŠ” ì´ë²¤íŠ¸ë¥¼ 처리하는 ë¶€ë¶„ì„ ê¸°ìˆ í•œ 콜백함수를 하나 등ë¡í•´ì•¼ë§Œ 합니다. ì´ë¥¼ 윈ë„ìš° í”„ë¡œì‹œì ¸ë¼ê³ 합니다.
- WNDCLASS ë˜ëŠ” WNDCLASSEXì˜ lpfnWndProc 맴버변수를 통하여 ì§€ì •í• ìˆ˜ 있습니다.
- ê³ ê¸‰ê¸°ë²•ìœ¼ë¡œì„œ 서브í´ëž˜ì‹±ì´ë¼ëŠ” ë°©ë²•ì´ ìžˆëŠ”ë°, ì´ë¥¼ 통하여 윈ë„ìš° í”„ë¡œì‹œì ¸ë¥¼ 가로채서 ê·¸ì— ëŒ€í•œ ì—í• ì„ í™•ìž¥í• ìˆ˜ 있습니다.
윈ë„ìš° í”„ë¡œì‹œì ¸ ì„ ì–¸
- ëª¨ë“ ìœˆë„ìš° í”„ë¡œì‹œì ¸ëŠ” 처리ë˜ì§€ 않ì€(switch- case문ì—서 ì¡°ê±´ì„ ê±¸ì§€ì•Šì€) 메세지는 모ë‘
DefWindowProc를 실행하여 처리ë˜ì—ˆë‹¤ëŠ” 표시를 ë‚´ë¶€ì 으로 해주어야합니다. (보통 switchë¬¸ì•ˆì˜ default: 부분ì—서 처리합니다)
윈ë„ìš° í”„ë¡œì‹œì ¸ MSDN ë§í¬
2 윈ë„ìš° 메세지 #
- ëª¨ë“ ìœˆë„ìš° 메세지는 wparam, lparamì´ë¼ëŠ” ë‘가지 매개변수를 ê°€ì§€ê³ ìžˆìŠµë‹ˆë‹¤. ì´ëŠ” ê° ë©”ì„¸ì§€ë§ˆë‹¤ ìš©ë²•ì´ ë‹¤ë¦…ë‹ˆë‹¤.
- TIP : 보통 lparamì€ 4byte DWORD로 ì •ì˜ë˜ì–´ìžˆì–´ ê°€ë” WORD단위로 ìƒìœ„ WORD, 하위 WORD로 쪼개어 ê°’ì„ í‘œí˜„í•˜ê¸°ë„ í•©ë‹ˆë‹¤. ì´ë•Œ HIWORD(), LOWORD() 매í¬ë¡œê°€ 아주 ìœ ìš©í•©ë‹ˆë‹¤. 예를 들어 WM_LBUTTONDOWN ì´ë²¤íŠ¸ëŠ” 아래와 ê°™ì´ ë§ˆìš°ìŠ¤ 위치좌표를 êµ¬í• ìˆ˜ 있습니다.
int x = LOWORD(lparam); int y = HIWORD(lparam);
- TIP2 : 잘 사용ë˜ì§€ëŠ” 않지만 WORD를 ìƒìœ„ BYTE, 하위 BYTE로 쪼개기위한 HIBYTE(), LOBYTE() 매í¬ë¡œë„ 있습니다.
3 윈ë„ìš° í”„ë¡œì‹œì ¸ ë””ìžì¸í•˜ê¸° #
아래는 기본ì ì¸ ë©”ì„¸ì§€ë¥¼ 나열해본 ì˜ˆì œìž…ë‹ˆë‹¤.
LRESULT CALLBACK MainWndProc(
HWND hwnd, // 윈ë„ìš° 핸들
UINT uMsg, // 메세지 ID
WPARAM wParam, // 첫번째 메세지 매개변수
LPARAM lParam) // ë‘번째 메세지 매개변수
{
PAINTSTRUCT ps; // WM_PAINTì—서 사용하기위한 임시변수.
HDC hdc; // Device Context 핸들.
switch (uMsg)
{
case WM_CREATE:
// ì´ ì‹œì ì—서는 ì´ë¯¸ 윈ë„ìš°ê°€ 초기화ë˜ì–´ìžˆëŠ” ìƒíƒœ.
return 0;
case WM_PAINT:
// 윈ë„ìš°ì˜ í´ë¼ì´ì–¸íЏ ì˜ì—ì„ ì–´ë–»ê²Œ 그리는지를 ê¸°ìˆ í•©ë‹ˆë‹¤.
hdc = BeginPaint(hwnd, &ps);
// (그리기 처리)
EndPaint(hwnd, &ps);
return 0;
case WM_SIZE:
// 윈ë„ìš°ì˜ í¬ê¸°ì™€ 위치가 ì„¤ì •ëœ ì§í›„ ë°œìƒ.
return 0;
case WM_DESTROY:
// 윈ë„ìš° ê´€ë ¨ ë°ì´íƒ€ë“¤ì´ ëª¨ë‘ ì†Œê±°ëœ ì´í›„.
return 0;
default:
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
return 0;
}
WM_NCCREATE 메세지는 윈ë„ìš°ê°€ ìƒì„±ëœ ì§í›„ 윈ë„ìš° í”„ë¡œì‹œì ¸ë¡œ ì „ë‹¬ë˜ì§€ë§Œ, 윈ë„ìš° í”„ë¡œì‹œì ¸ì—서 FALSE(0)ì„ ë°˜í™˜í•˜ê²Œ ë˜ë©´
CreateWindowEx() 함수는 실행실패를 반환하게 ë©ë‹ˆë‹¤.
WM_CREATE 메세지는 ì´ë¯¸ 윈ë„ìš°ê°€ ìƒì„±ëœ ì´í›„ì— ì „ë‹¬ë©ë‹ˆë‹¤.
WM_DESTROY 메세지는 윈ë„ìš°ê°€ 소멸ë˜ìžë§ˆìž ì „ë‹¬ë©ë‹ˆë‹¤. 하지만 ì´ì‹œì ì—서 ìžì‹ 윈ë„ìš°ë“¤ì€ ì•„ì§ ì†Œë©¸ë˜ê¸° ì´ì „입니다.
WM_NCDESTROY 메세지 ì—시 윈ë„ìš°ê°€ 소멸ë˜ê¸° ì§ì „ì— ì „ë‹¬ë˜ì§€ë§Œ, ëª¨ë“ ìžì‹ 윈ë„ìš°ë„ ì†Œë©¸ëœ ë‹¤ìŒ ì „ë‹¬ë©ë‹ˆë‹¤.
WM_PAINT 메세지는 현재 윈ë„ìš°ì˜ í´ë¼ì´ì–¸íЏ ì˜ì—ì„ ë‹¤ì‹œ ê·¸ë ¤ì•¼í• ê²½ìš°ì— í˜¸ì¶œë©ë‹ˆë‹¤. 구체ì 으로는 다ìŒê³¼ ê°™ì€ ê²½ìš°ë•Œ ì „ë‹¬ë©ë‹ˆë‹¤.
- 시스템 ë˜ëŠ” 다른 어플리케ì´ì…˜ì´ 현재 윈ë„ìš°ì˜ ì¼ë¶€ë¥¼ 가림으로 ì¸í•´ì„œ 다시 ê·¸ë ¤ì•¼í• ìƒí™©ì´ ë˜ì—ˆì„ 경우
UpdateWindow()ë˜ëŠ”
RedrawWindow() API 함수를 í˜¸ì¶œí–ˆì„ ê²½ìš°.
InvalidateRect() API 함수를 호출하거나 기타 다른 ìƒí™©ìœ¼ë¡œ ì¸í•´ 윈ë„ìš°ì˜ íŠ¹ì •ì˜ì—ì´ ë¬´íš¨í™”ë˜ì—ˆì„ 경우.
WM_SIZE 메세지는 ì´ë¯¸ 윈ë„ìš°ì˜ ìœ„ì¹˜ ë˜ëŠ” í¬ê¸°ê°€ 변경ë˜ì—ˆì„ 경우 ë°œìƒí•©ë‹ˆë‹¤.
WM_SIZING 메세지는 윈ë„ìš°ì˜ ìœ„ì¹˜ ë˜ëŠ” í¬ê¸°ë³€ê²½ì´ 시ë„ë˜ì—ˆê³ ì•„ì§ ë³€ê²½í™•ì •ì€ í•˜ì§€ ì•Šì•˜ì„ ë•Œ ë°œìƒí•©ë‹ˆë‹¤.









