Другие языки программирования и технологии

WinApi + мышь. как проверить, нажата ли кнопка мыши?..

Все очень просто. Оконной процедуре посылается сообщение WM_LBUTTONDOWN, если нажата левая клавиша мыши и WM_LBUTTONUP, если она отпущена. С правой аналогично.

Во всех этих сообщениях значение lParam содеpжит позицию мыши. Hижнее слово - это x-кооpдината, веpхнее слово - y-кооpдината веpхнего левого угла клиентской области окна. wParam содеpжит инфоpмацию о состоянии кнопок мыши, Shift'а и Ctrl'а.

Например:

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
<...>
static POINT curs_cord; //структура curs_cord типа POINT будет содержать коорд. курсора
static bool MouseClick=FALSE; //переменная состояния клавиши мыши, изначально - "не нажата"
HDC hdc;
PAINTSTRUCT ps;
<...>
switch (uMsg)
{
case WM_LBUTTONDOWN: //если нажата лев. клавиша.. .
MouseClick=TRUE;
break;

case WM_MOUSEMOVE: //если мышь переместили
curs_cord.x = LOWORD(lParam); //сохраняем свежие значения местонахождения
curs_cord.y = HIWORD(lParam);
InvalidateRect(hWnd, NULL, 0); //заставляем послать процедуре WM_PAINT
break;

case WM_LBUTTONUP: //если лев. клавиша отпущена.. .
MouseClick=FALSE;
break;

case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
if(MouseClick){ //если кнопка была нажата
COLORREF color1 = RGB(255,0,0);
SetPixel(hdc, curs_cord.x, curs_cord.y, color1); //то рисуем кубик из 4 пикселов
SetPixel(hdc, curs_cord.x+1, curs_cord.y, color1);
SetPixel(hdc, curs_cord.x, curs_cord.y+1, color1);
SetPixel(hdc, curs_cord.x+1, curs_cord.y+1, color1);
}
EndPaint(hWnd, &ps);
break;

case WM_DESTROY:
PostQuitMessage(0);
break;

default:
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}

Такая программка будет рисовать линии из красных точек мышью, пока нажата левая клавиша.
На полную оконную процедуру не притендую )), очертил так, чтобы было понятно, что где.
МШ
Максим Шубин
12 285
Лучший ответ
Подучи сообщения. Все вопросы типа "как проверить" в WinApi сводятся к вопросу "какое сообщение (и каким образом) обработать".