MAKEPOINTS - lParam를 POINTS로 변환
카테고리 없음 / 2016. 8. 20. 22:00
보통 마우스 좌표를 얻기위해서는 아래와 같이 사용한다.
xPos = GET_X_LPARAM(lParam); yPos = GET_Y_LPARAM(lParam);
그러나, 더 쉬운 방법이 있다. 단, POINT형이 아닌, POINTS형이다.
//WINGDI.H
#define MAKEPOINTS(l) (*((POINTS FAR *)&(l)))
MAKEPOINTS는 사실상 연산이 없다. (얼마나 좋은가?)
그래도 POINTS형보다는 POINT형을 사용하는것이 여러모로 좋다.
POINTS형을 POINT로 변환
POINTS는 int형이 아닌 short형이다.
short형은 16비트이며, 32비트 컴퓨터에서 short형을 사용할 경우, 변환과정이 필요하다.
따라서, int형을 사용하는 POINT를 사용하는것이 더 효과적이다.
#define GET_X_LPARAM(lp) ((int)(short)LOWORD(lp))
#define GET_Y_LPARAM(lp) ((int)(short)HIWORD(lp))
#define LOWORD(l) ((WORD)(l))
#define HIWORD(l) ((WORD)(((DWORD)(l) >> 16) & 0xFFFF))
GET_X_LPARAM를 사용할 경우,
WORD형으로 변환->short형으로 변환->int형으로 변환. (3번연산)
GET_Y_LPARAM를 사용할 경우,
쉬프트연산->&연산->WORD형으로 변환 (3번 연산)
POINT에 대입하면, 약 8번 연산이 발생한다.
#ifndef POINT_to_POINTS
#define POINT_to_POINTS(a) ((((WORD)((short)((a).y)))<<16)|((WORD)((short)((a).x))))
#define POINTS_to_POINT(a,pt) (pt).x=(a).x;(pt).y=(a).y;
#define POINT_to_LPARAM(a) (LPARAM)(POINT_to_POINTS(a))
#define LPARAM_to_POINT(a,pt) POINTS_to_POINT(MAKEPOINTS(a),pt)
#endif