![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| Dimitry |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 17.3.2007 Репутация: нет Всего: нет |
Помогите!!! Как сделать, чтоб кнопка, на форме, реагировала на различные нажатия мыши. Какие сообщения возникают после нажатия правой, левой, средней и двойном нажатии мышью по кнопке на форме.
|
|||
|
||||
| zkv |
|
||||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 12 Всего: 92 |
WM_RBUTTONDOWN WM_RBUTTONUP WM_RBUTTONDBLCLK, WM_LBUTTONDOWN -//- WM_MBUTTONDOWN -//-
перехватывать эти сообщения |
||||
|
|||||
| Dimitry |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 17.3.2007 Репутация: нет Всего: нет |
Эти сообщения возникают при нажатии в области формы, но не на объекте “button” (кнопка). Мне же нужны, именно над этим объектом. Заранее спасибо. |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
Эти сообщения возникают всегда, когда жмут на кнопки мыши. Только посылаются они не форме, а тому контролу, на который жмут - если он активен, конечно. Там их и надо ловить.
-------------------- ... |
|||
|
||||
| Dimitry |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 17.3.2007 Репутация: нет Всего: нет |
Приведите пример, как перехватить эти сообщения, от мыши. У меня ни как не получается.
Заранее спасибо. Добавлено через 49 секунд Я просматрел все книги ни где не нашел. |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
Ну это ты, положим,... как бы повежливее... преувеличиваешь. Все книги, ну надо же... И нигде нет про обработку сообщений? Может, ты женские романы просматривал или детективы? Сообщения, посылаемые контролу, перехватываются в его оконной функции. Эта функция либо регистрируется при создании нового класса окна, либо подставляется в готовое окно при сабклассинге с помощью SetWindowLong. Вот в этой функции и надо ставить обработчики нужных сообщений. -------------------- ... |
|||
|
||||
| dizzy1984 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 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 |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
Конечно, если интересует только левый клик на кнопке, то вполне достаточно обработать WM_COMMAND. Но для перехвата клика правой и средней кнопки это не поможет: нужно переопределять оконную функцию. А тогда логично и левый клик ловить там же.
Есть всего 2 вида уведомлений: WM_COMMAND для старых контролов и WM_NOTIFY для common-контролов. EN_ - это префикс уведомлений эдитов. У других контролов - другие уведомления с другими префиксами. -------------------- ... |
|||
|
||||
| dizzy1984 |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 675 Регистрация: 15.2.2007 Репутация: нет Всего: 25 |
Ситуация с кликами на кнопку выдимо объясняется тем (да, на клик правой кнопкой родителю посылается WM_CONTEXTMENU, на клик средней - вообще ничего не посылается), что эти действия не являются типичными для приложения и нотификации потомков предкам не столь необходимы. Т.е такое поведение кнопки не нужно для приложения, кроме как кнопка с новой функциональностью, что решается оформлением отдельноо класса. Если же контрол должен по логике вещей работать с окном предком, то он всегда должен посылать нотификацию давая возможность обработать ее со свем комфортом. Неужели кто-то бы пострадал, если были бы кнопка посылала нотификации при клике правой и средней кнопками основному окну? Или это политика необходимого минимума.
А как цитировать конкретного человека? Вот что написано в моей книжке
Дальше пример про EN_, который я ошибочно принял за префикс старых сообщений
Кстати даже создавая класс не обязательно делать обработку события в его функции окна, в ней можно послать нотификацию родителю. Это будет кнопка умеющая извещать о средних и правых нажатиях мыши. Это сообщение отредактировал(а) dizzy1984 - 13.4.2007, 23:54 |
||||||
|
|||||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
Не знаю, что за книгу ты цитируешь, но либо перевод плохой, либо автор не совсем в теме. Одни контролы (действительно существующие с древних времен) поддерживают только WM_COMMAND, а другие - только WM_NOTIFY. Из common-контролов только RichEdit посылает WM_COMMAND: видимо, для обеспечения совместимости со старым Edit. WM_COMMAND и WM_NOTIFY: обе системы уведомлений сосуществуют одновременно и никак не пересекаются. Т.е. имеем всего по одному типу сообщений на каждую систему уведомлений. Варианты и там и там поддерживаются с помощью кодов уведомлений (таких как EN_CHANGE, CBN_SELENDOK, LVN_BEGINLABELEDIT и пр.). Кстати, "новых" уведомлений (WM_NOTIFY) еще больше чем "старых". Да, можно и так. А еще можно повесить хук или просто встроить фильтр в главный цикл, и вообще никак не трогать оконные функции стандартных контролов. Много чего можно -------------------- ... |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |