9/4 API Message (유휴시간, 사용자정의메시지)

정수현·2024년 9월 4일

API Programming

목록 보기
5/10
post-thumbnail

PeekMessage

  • 메시지를 가져오는 함수

    GetMessage() : 무한대기
    -> 메시지 큐에 메시지가 없다면 새로운 메시지가 전달될 때까지 리턴하지 않는다.
    즉, 메시지가 없을 경우, 무한 대기

    PeekMessage() : 바로리턴
    -> 큐에 메시지가 없더라도 리턴할 수 있다.

유휴 시간

  • 메시지가 없는 시간 (Idle Time)
  • PeekMessage() 함수를 활용해 유휴 시간에 다른 작업을 할 수 있다.
MSG msg;
while (true)
{
	if(PeekMessage(&msg, 0, 0, 0, PM_REMOVE)
    {
    	if(msg.message == WM_QUIT) 
        	break;
       	TranslateMessage(&msg);
		Dispatch(&msg);
    }
  • 메시지 큐에 메시지가 없다면 즉, if문이 false면 else문으로 넘어간다.
	else
    {
    	HDC hdc = GetDC(hwnd);
        SetPixel(hdc, rand()%500 
        ...
    }
}

사용자 정의 메시지

메시지 범위

  • 메시지의 명칭 -> 매크로 상수로 나타낸다.
    WM_CREATE - 1
    WM_DESTROY - 2
    WM_MOVE * 3
    ⑷ ...

  • 사용자 정의 메시지를 만드려면
    나만의 메시지를 만들어야 하고,
    그때 기존 메시지의 ID값과 중복되면 안된다.

사용자 정의 메시지

  • 사용자 메시지를 사용하는 절차

    ⑴ 나만의 메시지를 정의한다
    #define WM_CREATE 0x001

    ⑵ 메시지를 발생시킨다 (특정 시점에서 메시지를 호출)
    ① 비큐 : SendMessage(핸들, WM_CREATE, 부가정보, 부가정보)
    ② 큐 : PostMessage(핸들, WM_CREATE, 부가정보, 부가정보)

    ⑶ 메시지를 수신 및 처리한다.
    WndProc(프로시저) switch~case문으로 필터링 ..

경우1) 비큐 메시지

⑴ 나만의 메시지 정의

#define WM_MYMESSAGE1 WM_USER+100

⑵ 메시지 발생

  • SendMessage() : 비큐, 함수 호출과 동일하다 (리턴값을 받을 수 있다.)
    case WM_LBUTTONDOWN:
    {
    int r = SendMessage(hwnd, MY_MESSAGE1, 10, 20);
    TCHAR buf [20];
    wsprintf(buf, TEXT("결과 : %d"), r);
    MessageBox(hwnd, , TEXT("결과"), MB_OK);
    
    return 0;
    }

⑶ 수신 및 처리

case MY_MESSAGE1:
{
  TCHAR buf [100];
  wsprintf(buf, TEXT("%d + %d = %d"), wParam, lParam, wParam + lParam);
  SetWindowText(hwnd, buf);
  MessageBox(hwnd, TEXT("수신확인"), TEXT("MY_MESSAGE1"), MB_OK);
  
  return wParam + lParam;  
}
![](https://velog.velcdn.com/images/jsuhyeon_/post/5249e199-4def-4df5-a881-fbc5387abbeb/image.png) ![](https://velog.velcdn.com/images/jsuhyeon_/post/21bd032f-da7f-4fdb-bcd5-5b48763cd29b/image.png) ![](https://velog.velcdn.com/images/jsuhyeon_/post/c3b5a159-4612-49b7-b00a-419573e6da60/image.png)

경우2) 큐 메시지

⑴ 나만의 메시지 정의

#define MY_MESSAGE2 WM_USER+101

⑵ 메시지 발생 (메시지 호출하기)

  • PostMessage() : 큐 함수
case WM_RBUTTONDOWN:
	int b = PostMessage(hwnd, MY_MESSAGE2, 10, 20);
  	TCHAR buf [20];
 	wsprintf(buf, TEXT("성공 : %s"), b==true ? TEXT("YES"):TEXT("NO"));
  	SetWindowText(hwnd, buf);
  	MessageBox(hwnd, buf, TEXT("결과"), MB_OK);
  	
  	return 0;

⑶ 수신 및 처리

case MY_MESSAGE2:
{
  	TCHAR buf [100];
  	wsprintf(buf, TEXT("%d + %d = %d"), wParam, lParam, wParam + lParam);
  	SetWindowText(hwnd,buf);
  	MessageBox(hwnd, TEXT("수신확인"), TEXT("MY_MESSAGE2"), MB_OK);
  		
  	return 0;
}
![](https://velog.velcdn.com/images/jsuhyeon_/post/f537d6a7-7f8a-4d63-930e-46d141af38d8/image.png) ![](https://velog.velcdn.com/images/jsuhyeon_/post/ee836cd6-d318-41c3-8ec0-85ba0d73c93b/image.png) ![](https://velog.velcdn.com/images/jsuhyeon_/post/c10b7ee8-6818-4582-adcb-707b2670ff9b/image.png)

0개의 댓글