| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: WinAPI и системное программирование > Обработка WM_LBUTTONDOWN |
| Автор: Dmitry_177 23.11.2006, 22:57 | ||
Как мне обрабатывать сообщение WM_LBUTTONDOWN по нажатию на кнопке? Т.е. нужно определить на какой кнопке была нажата левая кнопка мыши, попробовал так:
не работает, где hButton это хендл кнопки |
| Автор: Dmitry_177 23.11.2006, 23:59 |
| Я на одном API делаю, без VCL |
| Автор: ArtemRubtsov 24.11.2006, 04:50 |
| можно координаты компонентов брать на форме и исходя из этого сделать вывод где была нажата кнопка но лучше всего создать обработчика onmousedown для кнопки Если есть кнопка (пусть даже созданная при старте приложения) значит у нее есть onmousedown по умолчанию, просто нужно его описать и будет счастье а еще у кнопки есть OnClick :) |
| Автор: bems 24.11.2006, 08:53 |
| обрабатывай не WM_LBUTTONDOWN, а WM_COMMAND. В lParam будет хэндл кнопки |
| Автор: Dmitry_177 24.11.2006, 10:12 |
| Почитал про WM_COMMAND, там про клавиши ускорителя, что это? И про пункты меню... |
| Автор: bems 24.11.2006, 10:32 |
| гарячие комбинации а еще там про контролы, например кнопки Добавлено @ 10:38 если HIWORD(wParam)>1 то это точно контрол. Но можно просто сравнить HWND(lParam) с хэндлом кнопки и если совпадает - вызвать твой обработчик |
| Автор: Dmitry_177 24.11.2006, 10:53 |
| А если нужно еще WM_LBUTTONUP обрабатывать? Добавлено @ 10:58 А еще попробовал я WM_COMMAND обрабатывать, у меня почему-то он срабатывает на двойном щелчке мыши а не на одном.. |
| Автор: bems 24.11.2006, 11:14 | ||
вот так вроде должно устроить
|
| Автор: Dmitry_177 24.11.2006, 11:27 |
| Я так и сделал с WM_COMMAND... Да, мне именно нажатие и отпускание обрабатывать нужно... |
| Автор: bems 24.11.2006, 11:38 |
| отредактировал сообщение, теперь вроде то что надо Добавлено @ 11:43 WM_COMMAND можно и выкинуть |
| Автор: Dmitry_177 24.11.2006, 12:09 |
| Спасибо большое! |
| Автор: BUGOR 24.11.2006, 13:08 |
| Тебе координаты мыши в момент клика известны? Известны. Тогда юзай WindowFromPoint, он вернёт нэндл объекта над которым находится курсор. |
| Автор: bems 24.11.2006, 13:51 |
| В родительском окне координаты не известны - WM_LBUTTONDOWN приходит кнопке, а не родителю. Если пользоваться GetCursorPos то нужно знать хотя бы момент нажатия |
| Автор: Dmitry_177 24.11.2006, 13:58 |
| Кстати насчет WindowFromPoint, она определяет хендл любого окна, даже чужого? А есть какаянибудь типа этой функции, которая определяет хендл только в моем приложении, а если в точке находится чужое окно, то например вернет 0? |
| Автор: bems 24.11.2006, 14:33 | ||
вот
|
| Автор: Dmitry_177 24.11.2006, 14:38 |
| Спасибо еще раз большое!!! |
| Автор: Dmitry_177 30.11.2006, 02:45 | ||
В главной процедуре обрабатываю сообщение WM_NCHITTEST,
И не доходит сообщение WM_LBUTTONDOWN до кнопки, сделав его обработку сабклассингом... Что делать? |
| Автор: bems 30.11.2006, 09:16 |
| вероятно это потому что ты не вызываешь DefWindowProc. В каких случаях вызывать, а в каких - нет, зависит от того, какого ты хочешь добиться эффекта. Например если ты не хочешь, чтобы окно перетаскивалось за кнопку, то Result := HTCAPTION делай только если курсор не на кнопке, а в противном случае result:=DefWindowProc(... не очень понятно, как должно по твоему себя вести окно... |
| Автор: bems 30.11.2006, 16:25 |
| если начинаешь строить из себя заголовок окна, то смотри WM_NCLBUTTONDOWN и WM_ENTERSIZEMOVE |
| Автор: Dmitry_177 30.11.2006, 19:21 |
| Дело в том что сообщение WM_LBUTTONDOWN вообще не доходит до кнопки, т.е. она не нажимается... |
| Автор: bems 1.12.2006, 00:04 | ||
что такое Window и hWindow? если Result := HTCAPTION может произойти и при нажатии на кнопку, то этого и следует ожидать - вместь нажатия окно начнет перетаскиваться. А если по остальному коду выходит, что кнопка исключена в этой ситуации, то нужно предусмотреть для нее вызов DefWindowProc |
| Автор: Dmitry_177 1.12.2006, 04:03 |
| Window: HWND это первый парамент WindowProc, а hWindow это хендл главного окна |
| Автор: bems 1.12.2006, 11:52 |
| не воспроизводится. Может проблема в чем-то другом? дай больше кода |
| Автор: Dmitry_177 3.12.2006, 18:14 |
| Я разобрался что было не так.. Я сабклассинг делал чуть-чуть неправильно... |