2020년 7월 1일 수요일

WinApi - Message

WM_CREATE

윈도우 첨 만들어 질 때, 변수 초기화 용.

변수 초기화 때 마우스 좌표같은 것들은 거의 랜덤이니 상수로 넣자.

WM_DESTROY

윈도우 메모리에서 파괴될 때

CREATE 에서 메모리 할당한 걸 지운다.

WM_QUIT

프로그램을 끝낼 때

WM_KEYDOWN

키보드가 눌릴 때.

WM_CHAR

키보드가 눌린 뒤 글자인 경우 생김. TCHAR과 형변환이랑 케미가 좋음.

TranslateMessage가 하는 일이 이거임.

WM_KEYUP

키보드가 떼질때.

WM_LBUTTONDOWN

마우스 왼쪽 키 눌릴 때. R, M 버전이 잇음

WM_LBUTTONUP

마우스 왼쪽 키 뗄 때. R, M 버전이 있음

WM_LBUTTONDBLCLK

마우스 왼쪽 키 더블클릭. R, M 버전이 있음

CS_DBLCLKS을 윈도우 클래스 스타일에 추가해야함

WM_MOUSEMOVE

x = LOWORD(lParam);

y = HIWORD(lParam);

InvalidateRect(hWnd, NULL, TRUE);

이렇게 마우스 좌표 연동.

WM_SETCURSOR

작업영역 안에서 마우스 이동

WM_MOUSEWHEEL

DWORD x = HIWORD(wParam);

WHEEL_DELTA 를 곱해서 쓴다.

WM_PAINT

WM_NCPAINT

비작업영역 그릴 때 발생

WM_TIMER

SetTimer() -> SYSTEMTIME 에 GetLocalTime() ->KILLTIMER()

wParam 에서 타이머 아이디를 얻을 수 있다.

스위치 문이 잘 어울림

백그라운드 작업을 할 때 잘 사용

SetTimer 의 CALLBACK 함수를 쓰면 그 타이머는 여기에 해당 안됨.

void CALLBACK TimeProc(

HWND hWnd, UINT uMsg, UINT idEvent, DWORD dwTime)

WM_SIZE

윈도우 사이즈 바뀔 때 나옴. SIZE_~~애를 wParam에서 얻음

WM_MOVE

윈도우 좌표 이동. lParam에 좌표가 있음.

xPos = (int)(short) LOWORD(lParam);

yPos = (int)(short) HIWORD(lParam);

WM_COMMAND

메뉴 처리용.

HIWORD(wParam) 은 통지코드

LOWORD(wParam) 은 컨트롤 ID, 메뉴 ID, 엑셀러레이터 ID

lParam 은 메세지를 보낸 윈도우 핸들

WM_CONTEXTMENU

오른쪽 버튼을 누르면 복사, 붙여넣기 등이 뜨는 창과 관련된 메시지.

유사품으로 WM_CUT WM_COPY, WM_PASTE 가 있다.

WM_USER

사용자 정의 메시지. 0x0400 임

+1 해서 0x8000까지 쓸 수 있음

프로그램 내부에서만 쓰도록 약속

버튼, 에디트 등의 컨트롤이 이 영역의 메시지를 사용하기 때문임

WM_APP

사용자 정의 메시지. 0x8000임

+1 해서 0xC000 까지 쓸 수 있음

프로그램 간의 통신을 위하도록 약속

비워져 있음

MK_CONTROL, MK_SHIFT, MK_LBUTTON, MK_MBUTTON, MK_RBUTTON 도 있음.

HIWORD(lParam), LOWORD(lParam) / x랑 y

MOUSE 관련 애들은 NC가 붙어서 타이틀 창, 경계선 같은 작업영역 외의 마우스를 처리할 수 있다.

wParam은 (TCHAR)wParam 으로 변환하거나 VK_~~ 와 비교하거나, 아스키와 비교하면서 쓴다. 이 때 알파벳은 대문자랑만 비교한다. VK 는 가상키보드란 말이다.

KEYDOWN, CHAR, KEYUP은 앞에 SYS가 붙은 애가 따로 있다. 이건 alt와 함께 눌렸을 경우이다. 이때 DefWindowProc 도 처리가 되어야 한다. 안그러면 다른 Alt와 함께되는 애들이 먹통이 된다.

EM_SETSEL 은 에디트 윈도우의 경우 전체 내용을 반전처리할 하도록 디폴트로 되어있다.

메시지 관련 함수

    LRESULT SendMessage(HWND hWnd, int MSG, WPARAM, LPARAM )

로 메시지를 Winproc 에 보낼 수 있다.

    BOOL PostMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) 

로 메시지를 큐에 넣을 수 있다.

이 때 포인터를 넣으면 메모리 할당이 취소 될 경우도 있으므로 주의

    BOOL InSendMessage();
BOOL ReplyMessage(LRESULT lResult);

InSendMessage 는 다른 스레드로부터 메시지를 받을 경우 참을 리턴한다.

ReplyMessage 는 SendMessage 로 메시지를 받았을 경우 그 함수에 lResult 값을 바로 리턴한다.

그래서 메시지 데드락 문제에 걸리지 않도록 한다.

    BOOL SendMessageCallback(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam,               
SENDASYNCPROC lpCallBack, ULONG_PTR dwData);

메시지를 보내고 callback 함수를 처리한 후 리턴한다.

    long BroadcastSystemMessage(DWORD dwFlag, LPDWORD lpdwRecipients, UINT uiMesssage, 
WPARAM wParam, LPARAM lParam);

글꼴 변경이 모든 윈도우에 적용해야할 메시지를 처리할 때 사용.

BSF_ 로 시작하는 옵션들을 플래그에,

BSM_ 으로 시작하는 메세지를 보낼 대상 그룹을 recipients 에 넣으면 된다.

    UINT RegisterWindowMessage(LPCTSTR lpString);

임의의 이름을 넣어서 레지스터에 없는 경우는 중복되지 않은 메시지 번호를,

있는 경우는 등록된 메시지 번호를 리턴한다.

WM_APP + n 을 기억하지 않아도 되게 한다.

댓글 없음:

댓글 쓰기

List