Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сообщения от мыши. 
:(
    Опции темы
Dimitry
Дата 1.4.2007, 01:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 17.3.2007

Репутация: нет
Всего: нет



Помогите!!! Как сделать, чтоб кнопка, на форме, реагировала на различные нажатия мыши. Какие сообщения возникают после нажатия правой, левой, средней и двойном нажатии мышью по кнопке на форме.
PM MAIL   Вверх
zkv
Дата 1.4.2007, 02:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 12
Всего: 92



Цитата(Dimitry @  1.4.2007,  01:36 Найти цитируемый пост)
Какие сообщения возникают после нажатия правой, левой, средней и двойном нажатии мышью по кнопке на форме.

WM_RBUTTONDOWN WM_RBUTTONUP WM_RBUTTONDBLCLK,
WM_LBUTTONDOWN -//-
WM_MBUTTONDOWN -//-
Цитата(Dimitry @  1.4.2007,  01:36 Найти цитируемый пост)
Как сделать, чтоб кнопка, на форме, реагировала на различные нажатия мыши.

перехватывать эти сообщения
PM MAIL   Вверх
Dimitry
Дата 1.4.2007, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 17.3.2007

Репутация: нет
Всего: нет



Цитата

WM_RBUTTONDOWN WM_RBUTTONUP WM_RBUTTONDBLCLK,
WM_LBUTTONDOWN -//-
WM_MBUTTONDOWN -//-

Эти сообщения возникают при нажатии в области формы, но не на объекте “button” (кнопка). Мне же нужны, именно над этим объектом.  smile  smile 
Заранее спасибо.
PM MAIL   Вверх
Earnest
Дата 2.4.2007, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Эти сообщения возникают всегда, когда жмут на кнопки мыши. Только посылаются они не форме, а тому контролу, на который жмут - если он активен, конечно. Там их и надо ловить.


--------------------
...
PM   Вверх
Dimitry
Дата 8.4.2007, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 17.3.2007

Репутация: нет
Всего: нет



Приведите пример, как перехватить эти сообщения, от мыши. У меня ни как не получается.  smile  smile 
Заранее спасибо.

Добавлено через 49 секунд
Я просматрел все книги ни где не нашел.
PM MAIL   Вверх
Earnest
Дата 9.4.2007, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Цитата(Dimitry @  8.4.2007,  19:19 Найти цитируемый пост)
Я просматрел все книги ни где не нашел. 

Ну это ты, положим,... как бы повежливее... преувеличиваешь. Все книги, ну надо же... И нигде нет про обработку сообщений? Может, ты женские романы просматривал или детективы? smile 

Сообщения, посылаемые контролу, перехватываются в его оконной функции. Эта функция либо регистрируется при создании нового класса окна, либо подставляется в готовое окно при сабклассинге с помощью SetWindowLong.
Вот в этой функции и надо ставить обработчики нужных сообщений.


--------------------
...
PM   Вверх
dizzy1984
Дата 13.4.2007, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 675
Регистрация: 15.2.2007

Репутация: нет
Всего: 25



Все так, но не совсем.
Цитата

Сообщения, посылаемые контролу, перехватываются в его оконной функции.

Следуя такой логике необходимо создавать несколько оконных процедур на каждую кнопку. Это неудобно.
В реальности перехват осуществляется в окнах-родителях, которых уведомляют дети. Есть несколько систем : это старые EN_ сообщения, win32 WM_NOTIFY сообщения, WM_COMMAND.
К примеру процесс посылки сообщения клика мыши на кнопке сводится к следующим этапам.
1. Windows посылает WM_LBUTTONDOWN окну кнопки.
2. Windows посылает WM_LBUTTONUP окну кнопки.
3. Окно кнопки посылает сообщение WM_COMMAND окну-родителю, часто диалогу. 

Таким образом обработка клика мыши на кнопку сводится к следующим этапам.

1. Добавляем функцию обработки в класс диалога
afx_msg void OnButton1();
2. Добавляем макрос в карту сообщений 
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
Он связывает  дескриптор кнопки и метод, который будет обрабатывать событие клика. Если взглянуть что делает макрос, то можно увидеть, что он добавляет пункт в массив, используемый той самой оконной функцией при получении сообщения WM_COMMAND от кнопки IDC_BUTTON1
3. Определяем обработку этого события
void CtestDlg::OnButton1() 
{
};

Обработка клика на самом диалоге будет отличаться, поскольку теперь сообщения будут идти непосредственно ему, а не дочернему окну. 
1. Добавляем функцию обработки в класс диалога
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
Эта функция  переопределяет базовую.
2. Добавляем макрос в карту сообщений 
ON_WM_LBUTTONDOWN()
Он использует предопределенное имя функции (OnLButtonDown), но, конечно, никто не запрещает определить свою.
3. Определяем обработку этого события
void CtestDlg::OnLButtonDown(UINT nFlags, CPoint point) 
{
};


Если я в чем-то ошибся, поправьте меня

Это сообщение отредактировал(а) dizzy1984 - 13.4.2007, 19:02
PM MAIL   Вверх
Earnest
Дата 13.4.2007, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Конечно, если интересует только левый клик на кнопке, то вполне достаточно обработать WM_COMMAND. Но для перехвата клика правой и средней кнопки это не поможет: нужно переопределять оконную функцию. А тогда логично и левый клик ловить там же.
Цитата(dizzy1984 @  13.4.2007,  19:59 Найти цитируемый пост)
Есть несколько систем : это старые EN_ сообщения, win32 WM_NOTIFY сообщения, WM_COMMAND.

Есть всего 2 вида уведомлений: WM_COMMAND для старых контролов и WM_NOTIFY для common-контролов. 
EN_ - это префикс уведомлений эдитов. У других контролов - другие уведомления с другими префиксами.


--------------------
...
PM   Вверх
dizzy1984
Дата 13.4.2007, 23:44 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 675
Регистрация: 15.2.2007

Репутация: нет
Всего: 25



Ситуация с кликами на кнопку выдимо объясняется тем (да, на клик правой кнопкой родителю посылается WM_CONTEXTMENU, на клик средней - вообще ничего не посылается), что эти действия не являются типичными для приложения и нотификации потомков предкам не столь необходимы. Т.е такое поведение кнопки не нужно для приложения, кроме как кнопка с новой функциональностью, что решается оформлением отдельноо класса. Если же контрол должен по логике вещей работать с окном предком, то он всегда должен посылать нотификацию давая возможность обработать ее со свем комфортом. Неужели кто-то бы пострадал, если были бы кнопка посылала нотификации при клике правой и средней кнопками основному окну? Или это политика необходимого минимума.
Цитата

Есть всего 2 вида уведомлений: WM_COMMAND для старых контролов и WM_NOTIFY для common-контролов.

А как цитировать конкретного человека?
Вот что написано в моей книжке
Цитата

Сообщения такого типа можно условно поделить на старые (windows 3.x) и новые (win32). Старых много, так как каждый тип элементов имеет несколько уведомляющих сообщений.

Дальше пример про EN_, который я ошибочно принял за префикс старых сообщений
Цитата

Наряду со старыми существует одно новое универсальное событие WM_NOTIFY.


Кстати даже создавая класс не обязательно делать обработку события в его функции окна, в ней можно послать нотификацию родителю. Это будет кнопка умеющая извещать о средних и правых нажатиях мыши.

Это сообщение отредактировал(а) dizzy1984 - 13.4.2007, 23:54
PM MAIL   Вверх
Earnest
Дата 14.4.2007, 08:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Цитата(dizzy1984 @  14.4.2007,  00:44 Найти цитируемый пост)
Сообщения такого типа можно условно поделить на старые (windows 3.x) и новые (win32). Старых много, так как каждый тип элементов имеет несколько уведомляющих сообщений.

Цитата(dizzy1984 @  14.4.2007,  00:44 Найти цитируемый пост)
Наряду со старыми существует одно новое универсальное событие WM_NOTIFY.


Не знаю, что за книгу ты цитируешь, но либо перевод плохой, либо автор не совсем в теме. 
Одни контролы (действительно существующие с древних времен) поддерживают только WM_COMMAND, а другие - только WM_NOTIFY. Из common-контролов только RichEdit посылает WM_COMMAND: видимо, для обеспечения совместимости со старым Edit.

WM_COMMAND и WM_NOTIFY: обе системы уведомлений сосуществуют одновременно и никак не пересекаются. 
Т.е. имеем всего по одному типу сообщений на каждую систему уведомлений. Варианты и там и там поддерживаются с помощью кодов уведомлений (таких как EN_CHANGE, CBN_SELENDOK, LVN_BEGINLABELEDIT и пр.). Кстати, "новых" уведомлений (WM_NOTIFY) еще больше чем "старых".

Цитата(dizzy1984 @  14.4.2007,  00:44 Найти цитируемый пост)
Кстати даже создавая класс не обязательно делать обработку события в его функции окна, в ней можно послать нотификацию родителю. Это будет кнопка умеющая извещать о средних и правых нажатиях мыши.

Да, можно и так. А еще можно повесить хук или просто встроить фильтр в главный цикл, и вообще никак не трогать оконные функции стандартных контролов. Много чего можно  smile 


--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0533 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.