Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обработка WM_LBUTTONDOWN 
:(
    Опции темы
Dmitry_177
Дата 23.11.2006, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Как мне обрабатывать сообщение WM_LBUTTONDOWN по нажатию на кнопке? Т.е. нужно определить на какой кнопке была нажата левая кнопка мыши, попробовал так:
Код

function WindowProc(Window: HWnd; Message: Word; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
...
WM_LBUTTONDOWN: begin
                       if Window = hButton then MessageBox(0, '1', '1', 0);
                     end;

не работает, где hButton это хендл кнопки
PM MAIL   Вверх
Sunvas
Дата 23.11.2006, 23:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


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

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



Цитата(Dmitry_177 @  23.11.2006,  22:57 Найти цитируемый пост)
Как мне обрабатывать сообщение WM_LBUTTONDOWN по нажатию на кнопке?

Создать наследника и в нем ловить это сообщение.

Цитата(Dmitry_177 @  23.11.2006,  22:57 Найти цитируемый пост)
Т.е. нужно определить на какой кнопке была нажата левая кнопка мыши

А не проще ли воспользовать событием onmouseup/onmousedow? Там в переменной Button храниться такая инфа.


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
Dmitry_177
Дата 23.11.2006, 23:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Я на одном API делаю, без VCL
PM MAIL   Вверх
ArtemRubtsov
Дата 24.11.2006, 04:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



можно координаты компонентов брать на форме и исходя из этого сделать вывод где была нажата кнопка

но лучше всего создать обработчика onmousedown для кнопки

Если есть кнопка (пусть даже созданная при старте приложения) значит у нее есть onmousedown по умолчанию, просто нужно его описать и будет счастье
а еще у кнопки есть OnClick    :)

Это сообщение отредактировал(а) ArtemRubtsov - 24.11.2006, 04:51
PM MAIL   Вверх
bems
Дата 24.11.2006, 08:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

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



обрабатывай не WM_LBUTTONDOWN, а WM_COMMAND. В lParam будет хэндл кнопки


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Dmitry_177
Дата 24.11.2006, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Почитал про WM_COMMAND, там про клавиши ускорителя, что это? И про пункты меню...
PM MAIL   Вверх
bems
Дата 24.11.2006, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

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



Цитата(Dmitry_177 @  24.11.2006,  10:12 Найти цитируемый пост)
клавиши ускорителя, что это? 
гарячие комбинации

а еще там про контролы, например кнопки

Добавлено @ 10:38 
если HIWORD(wParam)>1 то это точно контрол. 
Но можно просто сравнить HWND(lParam) с хэндлом кнопки и если совпадает - вызвать твой обработчик


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Dmitry_177
Дата 24.11.2006, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А если нужно еще WM_LBUTTONUP обрабатывать?

Добавлено @ 10:58 
А еще попробовал я WM_COMMAND обрабатывать, у меня почему-то он срабатывает на двойном щелчке мыши а не на одном..
PM MAIL   Вверх
bems
Дата 24.11.2006, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

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



вот так вроде должно устроить  smile 
Код

program Hellow;
uses
  windows,
  messages;

const sClassName='HellowWndClassName';
      sWndName='Hellow';

var wnd,hwndButton:HWND;OriginalBtnProc:pointer;

 function BtnProc(wnd:HWND;uMsg:DWORD;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall;
 begin
 case uMsg of
  WM_LBUTTONDOWN:SetWindowText(wnd,':)');
    WM_LBUTTONUP:SetWindowText(wnd,'Click me');
 end;
 result:=CallWindowProc(OriginalBtnProc,wnd,uMsg,wParam,lParam);
 end;

 function SubclassButton:pointer;
 begin
 result:=pointer(SetWindowLong(hwndButton,GWL_WNDPROC,integer(@BtnProc)));
 end;

 procedure UnsubclassButton;
 begin
 SetWindowLong(hwndButton,GWL_WNDPROC,integer(OriginalBtnProc));
 end;

 procedure WMCommand(hwndControl:HWND);
 begin
 if hwndControl=hwndButton
    then MessageBox(wnd,'Hellow, world!','Clicked',MB_OK);
 end;

 function WndProc(wnd:HWND;uMsg:DWORD;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall;
 begin
 result:=DefWindowProc(wnd,uMsg,wParam,lParam);
 case uMsg of
    WM_CLOSE:begin
             UnsubclassButton;
             PostQuitMessage(0);
             end;
  WM_COMMAND:WMCommand(HWND(lParam));
 end;
 end;

 function CreateWnd:HWND;
 var clss:WNDCLASS;
 begin
 clss.style:=CS_CLASSDC;
 clss.lpfnWndProc:=@WndProc;
 clss.cbClsExtra:=0;
 clss.cbWndExtra:=0;
 clss.hInstance:=hInstance;
 clss.hIcon:=0;
 clss.hCursor:=LoadCursor(0,IDC_ARROW);
 clss.hbrBackground:=GetStockObject(GRAY_BRUSH);
 clss.lpszMenuName:=nil;
 clss.lpszClassName:=sClassName;
 RegisterClass(clss);
 result:=CreateWindow(sClassName,sWndName,WS_OVERLAPPEDWINDOW or WS_VISIBLE,
                      integer(CW_USEDEFAULT),integer(CW_USEDEFAULT),200,200,0,0,hInstance,nil);
 hwndButton:=CreateWindow('BUTTON','Click me',
                          WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON or BS_CENTER or BS_TEXT or BS_VCENTER,
                      50,50,100,50,result,0,hInstance,nil);
 end;

var msg:TMSG;
begin
wnd:=CreateWnd;
OriginalBtnProc:=SubclassButton;
while GetMessage(msg,0,0,0) do
 begin
 TranslateMessage(msg);
 DispatchMessage(msg);
 end;
end.


Это сообщение отредактировал(а) bems - 24.11.2006, 11:37


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Dmitry_177
Дата 24.11.2006, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Я так и сделал с WM_COMMAND...

Да, мне именно нажатие и отпускание обрабатывать нужно...
PM MAIL   Вверх
bems
Дата 24.11.2006, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

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



отредактировал сообщение, теперь вроде то что надо

Добавлено @ 11:43 
WM_COMMAND можно и выкинуть  smile 


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Dmitry_177
Дата 24.11.2006, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Спасибо большое!
PM MAIL   Вверх
BUGOR
Дата 24.11.2006, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Тебе координаты мыши в момент клика известны? Известны. Тогда юзай WindowFromPoint, он вернёт нэндл объекта над которым находится курсор.


--------------------
Живу недоумевая, всё время хочу понять...
http://hunger.ru 
PM MAIL WWW ICQ   Вверх
bems
Дата 24.11.2006, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

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



В родительском окне координаты не известны - WM_LBUTTONDOWN приходит кнопке, а не родителю.
Если пользоваться GetCursorPos то нужно знать хотя бы момент нажатия


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Dmitry_177
Дата 24.11.2006, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Кстати насчет WindowFromPoint, она определяет хендл любого окна, даже чужого? А есть какаянибудь типа этой функции, которая определяет хендл только в моем приложении, а если в точке находится чужое окно, то например вернет 0?
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

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


 




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


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

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