Страницы

Поиск по вопросам

понедельник, 9 марта 2020 г.

Обработчик нажатия правой кнопки мыши

#cpp #c #winapi


На winApi пишу сапер. 

Имеется массив кнопок, и нужно для каждой кнопки установить обработчик нажатия правой
клавиши мыши над ней. Можно ли это реализовать? Каким образом?
    


Ответы

Ответ 1



Смотря, что за кнопка. Если кнопка - отдельное окно, то обрабатывайте сообщения мыши в WndProc. Создайте массив типа HWND и заполните его окнами(которые будете использовать, как кнопки), у которых один общий WndProc.Идентифицируйте, какая кнопка нажата с помощью цикла.Ниже код HWND hwnds[100]={NULL}; hwnds[0]=CreateWindow(...); hwnds[1]=CreateWindow(...); LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wp,LPARAM lp) { switch(message) { case WM_RBUTTONDOWN: for(int i(0);i<100;i++) if(hwnds[i]==NULL) { break; } else if(hwnd==hwnds[i]) { ...//Окно найдено } break; } } Если кнопка стандартная, Шиндоусовская(но это тоже окно, насколько я помню), то через WM_COMMAND.Не пользуюсь, этим убожеством, поэтому код подсказать не могу. Но дам ссылку http://www.firststeps.ru/mfc/winapi/r.php?62 Бонус Рисуете прямоугольник, который будет Вашей кнопкой. При нажатии на окно(на котором Вы нарисовали прямоугольник) обрабатываете WM_RBUTTONDOWN\UP. Если коодрдинаты клика подходят, значит - кнопка нажата. Как это сделать: LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wp,LPARAM lp) { POINT cp; GetCursorPos(&cp);//ну Вы поняли switch(message) { case WM_PAINT: ... Rectangle(hdc,10,10,50,30); ... break; case WM_RBUTTONUP: {//не забудьте про скобки, если хотите объявить переменные внутри case`a RECT r; GetWindowRect(hwnd,&r); int x=cp.x-r.left;//делаем координаты клика, относительно окна int y=cp.y-r.top;//делаем координаты клика, относительно окна if(x>10 && x<50 && y>10 && y<30) { ...//тык } } break; } }

Комментариев нет:

Отправить комментарий