2013-07-20 3 views
0

Я не новичок в C++, однако концепция программирования Win32 для меня довольно нова. Во всяком случае, у меня возникли проблемы с получением координат X и Y, когда сообщение WM_NCHITTEST передается через WndProc. Для того, чтобы попытаться получить их прямо сейчас, я использую следующий код:C++ WndProc получить сообщение координаты X и Y

int x = LOWORD(lParam); 
int y = HIWORD(lParam); 

Я не совсем уверен, если он работает или нет, но я считаю, что это. Я где-то читал, что это фактически возвращает координаты x и y указателя на самом мониторе, а не относительно приложения.

Когда я сделал обширный поиск Google, пытаясь выяснить, как превратить его в координаты относительно приложения, я наткнулся на этот метод (или функция Я не в Java больше.: P):

Point relativePos = theControl.PointToClient(pos); 

где pos - координаты x и y. Я бы очень хотел попробовать этот код, но я столкнулся с несколькими проблемами.

Прежде всего, точки не работают на C++. Я пробовал их, и они не работают. Во-вторых, в Win32 я не считаю, что Point определен. Я могу найти POINT, однако я не уверен, что это то же самое. Наконец, я, честно говоря, не совсем уверен, как определить суть.

Чтобы объяснить, зачем мне это нужно, я пытаюсь сделать окно перетаскиваемым только на 50 пикселей окна.

case WM_NCHITTEST: 
    hit = DefWindowProc(hWnd, message, wParam, lParam); 
    if(y < 50) 
     return HTCAPTION; 
    break; 

Во всяком случае, ваша помощь значительно оценили.

ответ

2

согласно documentation for WM_NCHITTEST on MSDN, используйте GET_X_LPARAM и GET_Y_LPARAM из windowsx.h вместо LOWORD и HIWORD получить значения координат из LPARAM. Вы можете преобразовать координаты в координаты клиента, если вы действительно хотите, сохраняя их в POINT и затем вызвать ScreenToClient так:

POINT pt; 
pt.x = GET_X_LPARAM(lParam); 
pt.y = GET_Y_LPARAM(lParam); 
ScreenToClient(hWnd, &pt); 

Однако, я не уверен, что есть реальная польза делать это здесь. Примечательно, что клиентская область начинает внутри оконный фрейм, поэтому (0, 0) в координатах клиента не находится в верхнем левом углу окна.

Возможно, что вы действительно хотите, это GetWindowRect, который дает вам ограничивающий прямоугольник всего окна в координатах экрана. Вы можете выяснить, что такое 50 лучших пикселей.

+0

Спасибо за помощь! Я немного поучался в этом посте. И да, я хочу область клиента, поскольку я создаю свой собственный ограничивающий прямоугольник внутри него. Еще раз спасибо! –