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



Contents

1 윈ë„ìš° 프로시져
2 윈ë„ìš° 메세지
3 윈ë„ìš° 프로시져 ë””ìžì¸í•˜ê¸°
4 메세지 루프
4.1 GetMessage()를 기반으로 만드는 방법
4.2 PeekMessage()를 기반으로 만드는 방법

1 윈ë„ìš° 프로시져 #

  • 모든 윈ë„우는 ìš´ì˜ì²´ê³„로부터 ìžì‹ ì—게 전달ë˜ëŠ” ì´ë²¤íŠ¸ë¥¼ 처리하는 ë¶€ë¶„ì„ ê¸°ìˆ í•œ 콜백함수를 하나 등ë¡í•´ì•¼ë§Œ 합니다. ì´ë¥¼ 윈ë„ìš° 프로시져ë¼ê³  합니다.
  • WNDCLASS ë˜ëŠ” WNDCLASSEXì˜ lpfnWndProc 맴버변수를 통하여 지정할 수 있습니다.
  • 고급기법으로서 서브í´ëž˜ì‹±ì´ë¼ëŠ” ë°©ë²•ì´ ìžˆëŠ”ë°, ì´ë¥¼ 통하여 윈ë„ìš° 프로시져를 가로채서 ê·¸ì— ëŒ€í•œ ì—­í• ì„ í™•ìž¥í•  수 있습니다.
  • [http]윈ë„ìš° 프로시져 ì„ ì–¸
  • 모든 윈ë„ìš° 프로시져는 처리ë˜ì§€ 않ì€(switch- case문ì—서 ì¡°ê±´ì„ ê±¸ì§€ì•Šì€) 메세지는 ëª¨ë‘ [http]DefWindowProc를 실행하여 처리ë˜ì—ˆë‹¤ëŠ” 표시를 ë‚´ë¶€ì ìœ¼ë¡œ 해주어야합니다. (보통 switchë¬¸ì•ˆì˜ default: 부분ì—서 처리합니다)
  • [http]윈ë„ìš° 프로시져 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; 
} 
  • [http]WM_NCCREATE 메세지는 윈ë„ìš°ê°€ ìƒì„±ëœ ì§í›„ 윈ë„ìš° 프로시져로 전달ë˜ì§€ë§Œ, 윈ë„ìš° 프로시져ì—서 FALSE(0)ì„ ë°˜í™˜í•˜ê²Œ ë˜ë©´ [http]CreateWindowEx() 함수는 실행실패를 반환하게 ë©ë‹ˆë‹¤.
  • [http]WM_CREATE 메세지는 ì´ë¯¸ 윈ë„ìš°ê°€ ìƒì„±ëœ ì´í›„ì— ì „ë‹¬ë©ë‹ˆë‹¤.
  • [http]WM_DESTROY 메세지는 윈ë„ìš°ê°€ 소멸ë˜ìžë§ˆìž 전달ë©ë‹ˆë‹¤. 하지만 ì´ì‹œì ì—서 ìžì‹ 윈ë„ìš°ë“¤ì€ ì•„ì§ ì†Œë©¸ë˜ê¸° ì´ì „입니다.
  • [http]WM_NCDESTROY 메세지 역시 윈ë„ìš°ê°€ 소멸ë˜ê¸° ì§ì „ì— ì „ë‹¬ë˜ì§€ë§Œ, 모든 ìžì‹ 윈ë„ìš°ë„ ì†Œë©¸ëœ ë‹¤ìŒ ì „ë‹¬ë©ë‹ˆë‹¤.
  • [http]WM_PAINT 메세지는 현재 윈ë„ìš°ì˜ í´ë¼ì´ì–¸íЏ ì˜ì—­ì„ 다시 그려야할 ê²½ìš°ì— í˜¸ì¶œë©ë‹ˆë‹¤. 구체ì ìœ¼ë¡œëŠ” 다ìŒê³¼ ê°™ì€ ê²½ìš°ë•Œ 전달ë©ë‹ˆë‹¤.
    1. 시스템 ë˜ëŠ” 다른 어플리케ì´ì…˜ì´ 현재 윈ë„ìš°ì˜ ì¼ë¶€ë¥¼ 가림으로 ì¸í•´ì„œ 다시 그려야할 ìƒí™©ì´ ë˜ì—ˆì„ 경우
    2. [http]UpdateWindow()ë˜ëŠ” [http]RedrawWindow() API 함수를 í˜¸ì¶œí–ˆì„ ê²½ìš°.
    3. [http]InvalidateRect() API 함수를 호출하거나 기타 다른 ìƒí™©ìœ¼ë¡œ ì¸í•´ 윈ë„ìš°ì˜ íŠ¹ì •ì˜ì—­ì´ 무효화ë˜ì—ˆì„ 경우.
  • [http]WM_SIZE 메세지는 ì´ë¯¸ 윈ë„ìš°ì˜ ìœ„ì¹˜ ë˜ëŠ” í¬ê¸°ê°€ 변경ë˜ì—ˆì„ 경우 ë°œìƒí•©ë‹ˆë‹¤.
  • [http]WM_SIZING 메세지는 윈ë„ìš°ì˜ ìœ„ì¹˜ ë˜ëŠ” í¬ê¸°ë³€ê²½ì´ 시ë„ë˜ì—ˆê³  ì•„ì§ ë³€ê²½í™•ì •ì€ í•˜ì§€ ì•Šì•˜ì„ ë•Œ ë°œìƒí•©ë‹ˆë‹¤.

4 메세지 루프 #

4.1 GetMessage()를 기반으로 만드는 방법 #

4.2 PeekMessage()를 기반으로 만드는 방법 #

HWND hwnd; 
BOOL fDone; 
MSG msg; 
 
fDone = FALSE; 
while (!fDone) { 
    while (PeekMessage(&msg, hwnd,  0, 0, PM_REMOVE)) {
        TranslateMessage(&messages);
        DispatchMessage(&messages);
    }
}
...

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2010-10-28 12:42:54
Processing time 0.6199 sec