JHB의 프로그래밍 삽질기

lParam과 wParam은 무엇인가? 본문

PROGRAMMING/C C++ MFC

lParam과 wParam은 무엇인가?

roter 2008.10.21 15:25


내가 고등학교 1학년때 WINAPI를 처음 접했을 때, 가장 몰랐던 것이 lParam과 wParam에 관한 것이었다.(지금 생각해 보면 참 웃기다.) 둘을 왜 굳이 따로 쓰는거여!!?

일단, 도대체 여기저기서 발견 되는 wParam과 lParam은 무엇인고??

아주 쉽게 생각해서! 기본(default)으로 지정 되어 있는 기본 인자! 라고 생각하면 된다.

우리가 MOUSE를 컨트롤 하기 위해 메세지에서 WM_LBUTTONDOWN을 받았다고 하면, 곧 사용자가 알게될 값은 무엇일까? 바로 '좌표'이다!

LBUTTONDOWN 메세지를 처리하는 순간의 lParam의 상위 16비트는 x좌표를, 하위 16비트는 y좌표를 갖게 된다. 이를 구분 할려면 HIWORD(lParam)과 LOWORD(lParam)으로 구분하여 사용 하면 될 것이다.

이는 LBUTTONDOWN 메세지 처리를 할 때의 lParam값이고, 다른 곳에선 어떻게 쓰일까?

TIMER를 한번 살펴보자.

SetTimer를 살펴보면 다음과 같다.

UINT SetTimer(HWND hWnd, UINT nIDEvent, UINT uElapse, TIMERPROC ipTimerFunc);

다른건 그렇다 쳐도, 2번째 인자인 nIDEvent를 살펴보자. WM_CREAT에서 생성한 타이머를 WM_TIMER에서 사용하기 위해

case WM_TIMER:
       switch(wParam){
             case 1:
             case 2:
        }

이렇게 써주기만 하면 된다. WM_TIMER에서 wParam은 SetTimer에서 생성한 nIDEvent로써의 기능을 수행 하는 것이다. 각각의 메세지 마다 wParam이 쓰일 때가 있고 lParam이 쓰일 때가 있다. 각각 어떤것이 쓰이는지 궁금하면 각 메세지와 함수별로 MSDN Library를 찾아보기를~~!

여담으로 왜 lParam과 wParam을 구분하나 살펴보면, 눈치 챘겠지만 wParam은 wordparameter, lParam은 longparameter이다. win16에서는 wParam은 16비트였고 lParam만 32비트였다. 하지만 win32로 넘어오면서 둘다 32비트로 바뀌게 되었고, 단순히 wParam과 lParam이라는 이름만 남게 되었다.(출처 api정복)
메세지에 담을 내용이 너무 크면 상위(HIWORD)와 하위(LOWORD) 워드에 정보를 나누어 보내기도 한다는 것!

그러니까~ 굳이 왜 lParam과 wParam을 구분해 놓느냐~~ 라고 묻는다면,
win16에서 16비트의 정보만으로 파라미터 전달이 가능했던 메세지의 경우 wParam을 사용했을 것이요, 32비트 정보가 필요할 경우 lParam으로 전달 했을텐데, 그때 쓰던게 지금까지 계속 전승(?) 되었다고 생각하면 쉬울듯.. 지금이야 뭐 둘다 32비트니.. (64bit 프로그래밍은 해본적이 없어서 모르겠다 에구 ^^)

* * *
공부하면서 적은 내용이라 틀린게 있을 수 있으니 가급적 가려가며 읽어주세요..

2 Comments
댓글쓰기 폼