По сути надо вот что: диалоговое окно, на нем - кнопка и static. Вот в этом static'е должно отображаться текущее состояние кнопки - нажата, али нет. Т.е. я мышу навел, нажал - надпись на static'е поменялясь на "Pressed". Отпустил мышу, кнопка отжалась - надпись сменилась... Т.е. чтобы отслеживалось любое нажатие и "отжатие" этой кнопки на диалоге, в том числе с клавиатуры. Теоретически, можно поймать все эти события по отдельности. Но ведь должно же быть сообщение о нажатии? Иначе как же она себя перерисовывает (текст сдвигает вниз-вправо)?
» Какое сообщение шлется кнопке, когда она нажимается?
WM_LBUTTONDOWN
WM_LBUTTONUP
С уважением,
Дмитрий Овсянников
WM_LBUTTONUP
С уважением,
Дмитрий Овсянников
Это не то... Во-первых, кнопку можно нажимать еще и с клавиатуры, пробелом, а во вторых ее можно нажимать-отжимать не отпуская кнопки мыши, а просто двигая мышь с нажатой левой кнопкой то поверх этой кнопки, то снаружи ее. Во всех этих случаях эти два сообщения не шлются.
CaptainFlint
Цитата:
Можно конечно. А знаешь как это дело реализуется? Так вот смотри, вот так:
case WM_KEYDOWN:
if (key == VK_SPASE)
{
SendMessage(hwndButton,WM_LBUTTONDOWN,.....)
}
Спорим я смогу ещё сделать кнопку, которая будет нажиматься по Ctrl+Alt+Del
Цитата:
по аналогии.
PS: вообще я не понял ктопка твоя, или дяди Петина? предполлгаю что стащил какую-нибудь TSuperPuperButton с Torry.com. Тогда изучай его исходные коды. А я говорю о стандартном Windows-контроле "button".
Цитата:
Во-первых, кнопку можно нажимать еще и с клавиатуры, пробелом
Можно конечно. А знаешь как это дело реализуется? Так вот смотри, вот так:
case WM_KEYDOWN:
if (key == VK_SPASE)
{
SendMessage(hwndButton,WM_LBUTTONDOWN,.....)
}
Спорим я смогу ещё сделать кнопку, которая будет нажиматься по Ctrl+Alt+Del
Цитата:
а во вторых ее можно нажимать-отжимать не отпуская кнопки мыши, а просто двигая мышь с нажатой левой кнопкой то поверх этой кнопки, то снаружи ее
по аналогии.
PS: вообще я не понял ктопка твоя, или дяди Петина? предполлгаю что стащил какую-нибудь TSuperPuperButton с Torry.com. Тогда изучай его исходные коды. А я говорю о стандартном Windows-контроле "button".
Да это-то понятно... Я же в первом сообщении писал:
Цитата:
Согласись, если такое сообщение есть, то зачем усложнять себе жизнь? Правда, похоже, что нету. Но тогда неясно, какой код перерисовывает нажатие самой кнопки... WM_PAINT не шлется, это я проверил.
Цитата:
Теоретически, можно поймать все эти события по отдельности. Но ведь должно же быть сообщение о нажатии? Иначе как же она себя перерисовывает (текст сдвигает вниз-вправо)?
Согласись, если такое сообщение есть, то зачем усложнять себе жизнь? Правда, похоже, что нету. Но тогда неясно, какой код перерисовывает нажатие самой кнопки... WM_PAINT не шлется, это я проверил.
CaptainFlint
Цитата:
Вот именно. Не нужно усложнять. сообщения я тебе написал. Их всего 2.
Цитата:
Как проверял? То окно, которое её перерисовывает, и получает это сообщение.
Цитата:
Согласись, если такое сообщение есть, то зачем усложнять себе жизнь?
Вот именно. Не нужно усложнять. сообщения я тебе написал. Их всего 2.
Цитата:
WM_PAINT не шлется, это я проверил
Как проверял? То окно, которое её перерисовывает, и получает это сообщение.
Цитата:
Вот именно. Не нужно усложнять. сообщения я тебе написал. Их всего 2.
1. WM_LMOUSEDOWN
2. WM_LMOUSEUP
3. WM_KEYDOWN (VK_SPACE)
4. WM_KEYUP
5. WM_MOUSEMOVE (куда надо включить SetCapture/ReleaseCapture, чтобы отслеживать, покинула ли мышка область кнопки)
Цитата:
Как проверял? То окно, которое её перерисовывает, и получает это сообщение.
Перехватываю WM_PAINT сначала в диалоге, потом в классе кнопки. Ставлю там брыкпойнты. Запускаю прогу. Несколько остановов на брыкпойнтах (начальная прорисовка и т.п.), потом спокойно жму ету кнопку мушой, пробелом, выводом мышки за область кнопки... В первых двух случаях кнопка (не диалог!) получает сообщение только после отпускания. В последнем - вообще никакой реакции.
CaptainFlint
Дружище. Не парься. Ну что если кто-то сделает нажатие кнопки (то бышь отрисовку кнопки в нажатом состоянии) на событии полёта мышки над левым углом картинки автора с надписью "я супер-пупер программер"? Тоже будешь это отлавливать?
Есть 2 события, на них и реагируй. Всё остальное - не твои проблемы.
Дружище. Не парься. Ну что если кто-то сделает нажатие кнопки (то бышь отрисовку кнопки в нажатом состоянии) на событии полёта мышки над левым углом картинки автора с надписью "я супер-пупер программер"? Тоже будешь это отлавливать?
Есть 2 события, на них и реагируй. Всё остальное - не твои проблемы.
В общем-то вопрос состоял не в том, как это реализовать, а в том, есть ли такое сообщение или сответствующий готовый метод. Похоже, придется и впрямь вручную это дело реализовывать...
Кстати, насчет того "супер-пупера" ты не прав. Какая мне разница, что он где нарисует? Пусть РИСУЕТ хоть 10 нажатых кнопок. А вот если он ПОШЛЕТ СООБЩЕНИЕ моей кнопке, чтобы та нажалась, а она не отреагирует, то будет не очень хорошо.
И то, что все остальное не мои проблемы - тоже не согласен. Хороший стиль подразумевает, что интерфейс программы уж если выглядит стандартно, то и работать должен стандартно. Если кнопка нажимается, то она нажимается не только мышкой. Как бы ты реагировал на диалоговое окно, которое, например, по клавише TAB не перемещает фокус? Тоже сказал бы, что все правильно, мышка реализована, а остальное - не проблемы программиста?
Сорри, если это уже считается оффтопом...
Кстати, насчет того "супер-пупера" ты не прав. Какая мне разница, что он где нарисует? Пусть РИСУЕТ хоть 10 нажатых кнопок. А вот если он ПОШЛЕТ СООБЩЕНИЕ моей кнопке, чтобы та нажалась, а она не отреагирует, то будет не очень хорошо.
И то, что все остальное не мои проблемы - тоже не согласен. Хороший стиль подразумевает, что интерфейс программы уж если выглядит стандартно, то и работать должен стандартно. Если кнопка нажимается, то она нажимается не только мышкой. Как бы ты реагировал на диалоговое окно, которое, например, по клавише TAB не перемещает фокус? Тоже сказал бы, что все правильно, мышка реализована, а остальное - не проблемы программиста?
Сорри, если это уже считается оффтопом...
CaptainFlint
Цитата:
Так ты это и не пропустишь. Но он должен послать сообщение WM_LBUTTONDOWN обязательно. В твоих же случаях речь как раз идёт о каком-то компоненте, который нажимает кнопку на событии перемещения над ней мыши с нажатой кнопкой. такое поведение не соответствует стандарту и ты его не обязан обрабатывать.
Цитата:
А вот если он ПОШЛЕТ СООБЩЕНИЕ моей кнопке, чтобы та нажалась, а она не отреагирует, то будет не очень хорошо.
Так ты это и не пропустишь. Но он должен послать сообщение WM_LBUTTONDOWN обязательно. В твоих же случаях речь как раз идёт о каком-то компоненте, который нажимает кнопку на событии перемещения над ней мыши с нажатой кнопкой. такое поведение не соответствует стандарту и ты его не обязан обрабатывать.
Как это не соответствует??? О каком компоненте? Возьми любую программу с граф. интерфейсом, в ней любую кнопку и сделай то, что я описал! Нажатие ВСЕХ нормальных кнопок пробелом еще с Windows 3.1 считается стандартом, а моет и раньше, так же как и поведение кнопки при дивжении мыши с нажатой левой кнопкой.
CaptainFlint так в чём вопрос, это, как когда-то мне сказал Wowik, относится к серии давайте дружно посмотрим в исходные тексты класса TButton
Felix
Собственно, я дружно посмотрел. Ничего хорошего (подходящего) не нашел.
Собственно, я дружно посмотрел. Ничего хорошего (подходящего) не нашел.
Есть
WM_LBUTTONDOWN - левая
WM_RBUTTONDOWN - правая
WM_MBUTTONDOWN - и среднии кнопки мыши
и еще при поднятии
WM_LBUTTONUP - левая
WM_RBUTTONUP - правая
WM_MBUTTONUP - и среднии кнопки мыши
Кажеться все.
Если нужно больше, смотри:
\masm32\include\windows.inc
WM_LBUTTONDOWN - левая
WM_RBUTTONDOWN - правая
WM_MBUTTONDOWN - и среднии кнопки мыши
и еще при поднятии
WM_LBUTTONUP - левая
WM_RBUTTONUP - правая
WM_MBUTTONUP - и среднии кнопки мыши
Кажеться все.
Если нужно больше, смотри:
\masm32\include\windows.inc
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
Wowik
Это сообщение шлется только по факту КЛИКА на кнопку, т.е. нажатие+отпускание, приводящие к выполнению команды, повешенной на эту кнопку. А меня интересует, как в каждый момент времени кнопка выглядит на экране - нажатой, или отжатой.
WolfON
Это все хорошо, конечно, но по нажатию правой и средней мышки кнопка на нажимается (по крайней мере, по стандарту). И как я уже говорил, интересует не то, как это вообще сделать, это-то я без проблем, а то, как это сделать быстрее всего. Я думал, что есть готовое сообщение, которое посылается кнопке в тот момент, когда ее требуется нарисовать нажатой или отжатой, и хотел его просто перехватить. Это было бы проще всего. Но похоже, что такого сообщения нету. Поэтому, видимо, придется перехватывать вручную все события, которые приводят к нажатию...
Это сообщение шлется только по факту КЛИКА на кнопку, т.е. нажатие+отпускание, приводящие к выполнению команды, повешенной на эту кнопку. А меня интересует, как в каждый момент времени кнопка выглядит на экране - нажатой, или отжатой.
WolfON
Это все хорошо, конечно, но по нажатию правой и средней мышки кнопка на нажимается (по крайней мере, по стандарту). И как я уже говорил, интересует не то, как это вообще сделать, это-то я без проблем, а то, как это сделать быстрее всего. Я думал, что есть готовое сообщение, которое посылается кнопке в тот момент, когда ее требуется нарисовать нажатой или отжатой, и хотел его просто перехватить. Это было бы проще всего. Но похоже, что такого сообщения нету. Поэтому, видимо, придется перехватывать вручную все события, которые приводят к нажатию...
В комплекте Visual Studio имеется полезная программа - SpyXX(вроди того). Так вот она умеет отлавливать ВСЕ сообщения которые приходят окну/контролу/и т.д
С помощью её можно следить за процессом посылки сообщений визуально. Попробуйте.
С помощью её можно следить за процессом посылки сообщений визуально. Попробуйте.
Spy++
Да, спасибо. Попробую. Это я как-то не подумал.
Да, спасибо. Попробую. Это я как-то не подумал.
CaptainFlint
Цитата:
Только так и можно это сделать. Только к VK_SPACE добавь еще VK_ENTER !
А то если кнопка имеет TAB STOP (это почти всегда) то на нее по
TAB можно зайти и нажать ENTER
Цитата:
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
student
Я уже так и сделал. Только один момент: Enter не надо обрабатывать, т.к. по нему кнопка не нажимается. Т.е. ей сразу шлется сигнал о выполнении команды, повешенной на эту кнопку, а визуально прорисовки состояния "нажата/отжата" не происходит.
Кстати, помимо этого пришлось еще и обрабатывать WM_LMOUSEDBLCLICK, т.к. иначе когда я делаю двойной клик, но после второго клика мышь не отпускаю, то прорисовка не выполняется. Объяснить это не могу, просто констатирую факт. Я думал, что в случае двойного клика шлется набор сообщений: LDown, LUp, LClick, LDown, LUp, LClick, LDblClick. Оказалось не так...
Отсутствие такого сообщения, как я хотел, подтвердилось: Spy++ показал, что такого нет. Единственное, что действительно при этом происходит - это изменение состояния (WM_SETSTATE), но перехватить его нормально я не смог, т.к. не нашел базового обработчика этого сообщения.
Спасибо всем за советы и помощь.
Я уже так и сделал. Только один момент: Enter не надо обрабатывать, т.к. по нему кнопка не нажимается. Т.е. ей сразу шлется сигнал о выполнении команды, повешенной на эту кнопку, а визуально прорисовки состояния "нажата/отжата" не происходит.
Кстати, помимо этого пришлось еще и обрабатывать WM_LMOUSEDBLCLICK, т.к. иначе когда я делаю двойной клик, но после второго клика мышь не отпускаю, то прорисовка не выполняется. Объяснить это не могу, просто констатирую факт. Я думал, что в случае двойного клика шлется набор сообщений: LDown, LUp, LClick, LDown, LUp, LClick, LDblClick. Оказалось не так...
Отсутствие такого сообщения, как я хотел, подтвердилось: Spy++ показал, что такого нет. Единственное, что действительно при этом происходит - это изменение состояния (WM_SETSTATE), но перехватить его нормально я не смог, т.к. не нашел базового обработчика этого сообщения.
Спасибо всем за советы и помощь.
CaptainFlint
Ты по-видимому прав. детали я не упомню. Важно, что единственный способ - это их все отлавливать. BM_SETSTATE тоже (BM_ а не WM_) надо отлавливать! Как это делать - могу прислать пример, если актуально...
Ты по-видимому прав. детали я не упомню. Важно, что единственный способ - это их все отлавливать. BM_SETSTATE тоже (BM_ а не WM_) надо отлавливать! Как это делать - могу прислать пример, если актуально...
Страницы: 1
Предыдущая тема: Синхронизация БД через модем на Делфи
Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.