Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Какое сообщение шлется кнопке, когда она нажимается?

Автор: CaptainFlint
Дата сообщения: 17.02.2003 14:10
По сути надо вот что: диалоговое окно, на нем - кнопка и static. Вот в этом static'е должно отображаться текущее состояние кнопки - нажата, али нет. Т.е. я мышу навел, нажал - надпись на static'е поменялясь на "Pressed". Отпустил мышу, кнопка отжалась - надпись сменилась... Т.е. чтобы отслеживалось любое нажатие и "отжатие" этой кнопки на диалоге, в том числе с клавиатуры. Теоретически, можно поймать все эти события по отдельности. Но ведь должно же быть сообщение о нажатии? Иначе как же она себя перерисовывает (текст сдвигает вниз-вправо)?
Автор: odl455
Дата сообщения: 17.02.2003 14:12
WM_LBUTTONDOWN
WM_LBUTTONUP

С уважением,
Дмитрий Овсянников
Автор: CaptainFlint
Дата сообщения: 17.02.2003 14:17
Это не то... Во-первых, кнопку можно нажимать еще и с клавиатуры, пробелом, а во вторых ее можно нажимать-отжимать не отпуская кнопки мыши, а просто двигая мышь с нажатой левой кнопкой то поверх этой кнопки, то снаружи ее. Во всех этих случаях эти два сообщения не шлются.
Автор: odl455
Дата сообщения: 17.02.2003 14:35
CaptainFlint


Цитата:
Во-первых, кнопку можно нажимать еще и с клавиатуры, пробелом


Можно конечно. А знаешь как это дело реализуется? Так вот смотри, вот так:

case WM_KEYDOWN:

if (key == VK_SPASE)
{
SendMessage(hwndButton,WM_LBUTTONDOWN,.....)
}

Спорим я смогу ещё сделать кнопку, которая будет нажиматься по Ctrl+Alt+Del


Цитата:
а во вторых ее можно нажимать-отжимать не отпуская кнопки мыши, а просто двигая мышь с нажатой левой кнопкой то поверх этой кнопки, то снаружи ее


по аналогии.

PS: вообще я не понял ктопка твоя, или дяди Петина? предполлгаю что стащил какую-нибудь TSuperPuperButton с Torry.com. Тогда изучай его исходные коды. А я говорю о стандартном Windows-контроле "button".

Автор: CaptainFlint
Дата сообщения: 17.02.2003 14:39
Да это-то понятно... Я же в первом сообщении писал:
Цитата:
Теоретически, можно поймать все эти события по отдельности. Но ведь должно же быть сообщение о нажатии? Иначе как же она себя перерисовывает (текст сдвигает вниз-вправо)?

Согласись, если такое сообщение есть, то зачем усложнять себе жизнь? Правда, похоже, что нету. Но тогда неясно, какой код перерисовывает нажатие самой кнопки... WM_PAINT не шлется, это я проверил.
Автор: odl455
Дата сообщения: 17.02.2003 14:45
CaptainFlint


Цитата:
Согласись, если такое сообщение есть, то зачем усложнять себе жизнь?


Вот именно. Не нужно усложнять. сообщения я тебе написал. Их всего 2.


Цитата:
WM_PAINT не шлется, это я проверил


Как проверял? То окно, которое её перерисовывает, и получает это сообщение.
Автор: CaptainFlint
Дата сообщения: 17.02.2003 15:00

Цитата:
Вот именно. Не нужно усложнять. сообщения я тебе написал. Их всего 2.

1. WM_LMOUSEDOWN
2. WM_LMOUSEUP
3. WM_KEYDOWN (VK_SPACE)
4. WM_KEYUP
5. WM_MOUSEMOVE (куда надо включить SetCapture/ReleaseCapture, чтобы отслеживать, покинула ли мышка область кнопки)

Цитата:
Как проверял? То окно, которое её перерисовывает, и получает это сообщение.

Перехватываю WM_PAINT сначала в диалоге, потом в классе кнопки. Ставлю там брыкпойнты. Запускаю прогу. Несколько остановов на брыкпойнтах (начальная прорисовка и т.п.), потом спокойно жму ету кнопку мушой, пробелом, выводом мышки за область кнопки... В первых двух случаях кнопка (не диалог!) получает сообщение только после отпускания. В последнем - вообще никакой реакции.
Автор: odl455
Дата сообщения: 17.02.2003 15:12
CaptainFlint

Дружище. Не парься. Ну что если кто-то сделает нажатие кнопки (то бышь отрисовку кнопки в нажатом состоянии) на событии полёта мышки над левым углом картинки автора с надписью "я супер-пупер программер"? Тоже будешь это отлавливать?

Есть 2 события, на них и реагируй. Всё остальное - не твои проблемы.
Автор: CaptainFlint
Дата сообщения: 17.02.2003 15:25
В общем-то вопрос состоял не в том, как это реализовать, а в том, есть ли такое сообщение или сответствующий готовый метод. Похоже, придется и впрямь вручную это дело реализовывать...
Кстати, насчет того "супер-пупера" ты не прав. Какая мне разница, что он где нарисует? Пусть РИСУЕТ хоть 10 нажатых кнопок. А вот если он ПОШЛЕТ СООБЩЕНИЕ моей кнопке, чтобы та нажалась, а она не отреагирует, то будет не очень хорошо.
И то, что все остальное не мои проблемы - тоже не согласен. Хороший стиль подразумевает, что интерфейс программы уж если выглядит стандартно, то и работать должен стандартно. Если кнопка нажимается, то она нажимается не только мышкой. Как бы ты реагировал на диалоговое окно, которое, например, по клавише TAB не перемещает фокус? Тоже сказал бы, что все правильно, мышка реализована, а остальное - не проблемы программиста?
Сорри, если это уже считается оффтопом...
Автор: odl455
Дата сообщения: 17.02.2003 15:39
CaptainFlint


Цитата:
А вот если он ПОШЛЕТ СООБЩЕНИЕ моей кнопке, чтобы та нажалась, а она не отреагирует, то будет не очень хорошо.


Так ты это и не пропустишь. Но он должен послать сообщение WM_LBUTTONDOWN обязательно. В твоих же случаях речь как раз идёт о каком-то компоненте, который нажимает кнопку на событии перемещения над ней мыши с нажатой кнопкой. такое поведение не соответствует стандарту и ты его не обязан обрабатывать.
Автор: CaptainFlint
Дата сообщения: 17.02.2003 15:48
Как это не соответствует??? О каком компоненте? Возьми любую программу с граф. интерфейсом, в ней любую кнопку и сделай то, что я описал! Нажатие ВСЕХ нормальных кнопок пробелом еще с Windows 3.1 считается стандартом, а моет и раньше, так же как и поведение кнопки при дивжении мыши с нажатой левой кнопкой.
Автор: Felix
Дата сообщения: 17.02.2003 18:27
CaptainFlint так в чём вопрос, это, как когда-то мне сказал Wowik, относится к серии давайте дружно посмотрим в исходные тексты класса TButton
Автор: CaptainFlint
Дата сообщения: 17.02.2003 19:13
Felix
Собственно, я дружно посмотрел. Ничего хорошего (подходящего) не нашел.
Автор: WolfON
Дата сообщения: 17.02.2003 22:37
Есть
WM_LBUTTONDOWN - левая
WM_RBUTTONDOWN - правая
WM_MBUTTONDOWN - и среднии кнопки мыши
и еще при поднятии
WM_LBUTTONUP - левая
WM_RBUTTONUP - правая
WM_MBUTTONUP - и среднии кнопки мыши
Кажеться все.
Если нужно больше, смотри:
\masm32\include\windows.inc
Автор: Wowik
Дата сообщения: 18.02.2003 02:23
MSDN смотреть не пробовали?

Цитата:
BN_CLICKED
The BN_CLICKED notification code is sent when the user clicks a button.

The parent window of the button receives the BN_CLICKED notification code through the WM_COMMAND message.

LRESULT CALLBACK WindowProc(
HWND hwnd, // handle to window
UINT uMsg, // WM_COMMAND
WPARAM wParam, // identifier of button, BN_CLICKED
LPARAM lParam // handle to button (HWND)
);
Parameters
wParam
The low-order word contains the button's control identifier.
The high-order word specifies the notification message.

lParam
Handle to the button.
Remarks
A disabled button does not send a BN_CLICKED notification message to its parent window.

Requirements
Windows NT/2000/XP: Included in Windows NT 3.1 and later.
Windows 95/98/Me: Included in Windows 95 and later.
Header: Declared in Winuser.h; include Windows.h.

See Also
Buttons Overview, Button Messages, HIWORD, LOWORD, WM_COMMAND
Автор: CaptainFlint
Дата сообщения: 18.02.2003 10:28
Wowik
Это сообщение шлется только по факту КЛИКА на кнопку, т.е. нажатие+отпускание, приводящие к выполнению команды, повешенной на эту кнопку. А меня интересует, как в каждый момент времени кнопка выглядит на экране - нажатой, или отжатой.
WolfON
Это все хорошо, конечно, но по нажатию правой и средней мышки кнопка на нажимается (по крайней мере, по стандарту). И как я уже говорил, интересует не то, как это вообще сделать, это-то я без проблем, а то, как это сделать быстрее всего. Я думал, что есть готовое сообщение, которое посылается кнопке в тот момент, когда ее требуется нарисовать нажатой или отжатой, и хотел его просто перехватить. Это было бы проще всего. Но похоже, что такого сообщения нету. Поэтому, видимо, придется перехватывать вручную все события, которые приводят к нажатию...
Автор: c0r0ner
Дата сообщения: 18.02.2003 10:31
В комплекте Visual Studio имеется полезная программа - SpyXX(вроди того). Так вот она умеет отлавливать ВСЕ сообщения которые приходят окну/контролу/и т.д
С помощью её можно следить за процессом посылки сообщений визуально. Попробуйте.
Автор: CaptainFlint
Дата сообщения: 18.02.2003 10:35
Spy++
Да, спасибо. Попробую. Это я как-то не подумал.
Автор: student
Дата сообщения: 21.02.2003 22:47
CaptainFlint

Цитата:
1. WM_LMOUSEDOWN
2. WM_LMOUSEUP
3. WM_KEYDOWN (VK_SPACE)
4. WM_KEYUP
5. WM_MOUSEMOVE

Только так и можно это сделать. Только к VK_SPACE добавь еще VK_ENTER !
А то если кнопка имеет TAB STOP (это почти всегда) то на нее по
TAB можно зайти и нажать ENTER
Автор: CaptainFlint
Дата сообщения: 22.02.2003 15:45
student
Я уже так и сделал. Только один момент: Enter не надо обрабатывать, т.к. по нему кнопка не нажимается. Т.е. ей сразу шлется сигнал о выполнении команды, повешенной на эту кнопку, а визуально прорисовки состояния "нажата/отжата" не происходит.

Кстати, помимо этого пришлось еще и обрабатывать WM_LMOUSEDBLCLICK, т.к. иначе когда я делаю двойной клик, но после второго клика мышь не отпускаю, то прорисовка не выполняется. Объяснить это не могу, просто констатирую факт. Я думал, что в случае двойного клика шлется набор сообщений: LDown, LUp, LClick, LDown, LUp, LClick, LDblClick. Оказалось не так...

Отсутствие такого сообщения, как я хотел, подтвердилось: Spy++ показал, что такого нет. Единственное, что действительно при этом происходит - это изменение состояния (WM_SETSTATE), но перехватить его нормально я не смог, т.к. не нашел базового обработчика этого сообщения.
Спасибо всем за советы и помощь.
Автор: student
Дата сообщения: 26.02.2003 23:05
CaptainFlint
Ты по-видимому прав. детали я не упомню. Важно, что единственный способ - это их все отлавливать. BM_SETSTATE тоже (BM_ а не WM_) надо отлавливать! Как это делать - могу прислать пример, если актуально...
Автор: CaptainFlint
Дата сообщения: 11.03.2003 20:08
student
Пришли, плз. (сорри, я поздно твой ответ заметил).
k_spam@pochtamt.ru

Страницы: 1

Предыдущая тема: Синхронизация БД через модем на Делфи


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.