Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.04.29;
Скачать: CL | DM;

Вниз

Обработка WM_LBUTTONDOWN   Найти похожие ветки 

 
Dmitry_177   (2006-11-23 22:11) [0]

Как мне обрабатывать сообщение 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 это хендл кнопки


 
Elen ©   (2006-11-24 07:44) [1]

Ну для начала :
function WindowProc(Window: HWnd; Message: Word; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; message WM_LBUTTONDOWN

а вообще хотелось бы увидеть побольше кода и услышать реальную задачу


 
Dmitry_177   (2006-11-24 09:46) [2]

Это и имелось ввиду:


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

   else
     Result := DefWindowProc(Window, Message, wParam, lParam);
   end;
end;
end;


Но суть не в этом, нужно определить нажатие именно на кнопке, по идее при нажатии должен выскакивать MessageBox, но этого не происходит...


 
Чапаев ©   (2006-11-24 09:55) [3]

> [1] Elen ©   (24.11.06 07:44)
Аффтар, ты попутал грешное с праведным. WindowProc() и процедуры диспетчеризации (?) отдельных событий -- разные вещи.


> [0] Dmitry_177   (23.11.06 22:11)
А зачем? В принципе, задача разрешима, но скорей всего -- нет смысла её решать. Зачем тебе это нужно?


 
Elen ©   (2006-11-24 10:01) [4]

Удалено модератором


 
Чапаев ©   (2006-11-24 10:15) [5]

Удалено модератором


 
Elen ©   (2006-11-24 10:25) [6]


> [5] Чапаев

Понимаю. Автор и меня в заблуждение ввел.  Как по мне я б ловила такое в OnMouseUp.


 
Чапаев ©   (2006-11-24 10:27) [7]

> [6] Elen ©   (24.11.06 10:25)
Как по мне, я бы оьрабатывал WM_COMMAND. (Если мы говорим об одном и том же ;-) ). А задача, поставленная автором ветки, решается субклассингом.


 
Elen ©   (2006-11-24 10:35) [8]


> Если мы говорим об одном и том же ;-)

Да. Но разными способами. В принципе автору теперь остается выбирать - а мнения у нас одинаковые, и разнообразные. Это хорошо, колега.


 
Чапаев ©   (2006-11-24 10:40) [9]

> [8] Elen ©   (24.11.06 10:35)
Просто WM_*BUTTONUP обрабатывать неправильно потому, что кнопка может быть нажата "где-то", а отпущена над кнопкой. А это, по совести, за клик не должно считаться.


 
Elen ©   (2006-11-24 10:45) [10]


> [9] Чапаев

Тоже верно. Тогда [7] конечно же. а ситуацию "кнопка может быть нажата "где-то", а отпущена над кнопкой" считаю извратом


 
Чапаев ©   (2006-11-24 10:46) [11]

> ситуацию "кнопка может быть нажата "где-то", а отпущена
> над кнопкой" считаю извратом
Эти юзера такие затейники! ;-)

ЗЫ. Засим удаляюсь на работу.


 
Игорь Шевченко ©   (2006-11-24 15:33) [12]


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


Если все кнопки одного оконного класса, то:

var
 OldButtonProc: Pointer;

function ButtonWindowProc(Window: HWnd; Message: UINT; wParam:
 WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
 if Message = WM_LBUTTONDOWN then begin
   ...
 end;
 Result := CallWindowProc (OldButtonProc, Window, Message, wParam, lParam);
end;

OldButtonProc := Pointer(GetWindowLong(AnyButtonHandle, GWL_WNDPROC);

Для каждой кнопки сделать:
SetWindowLong(ButtonHandle, GWL_WNDPROC, LongInt(@ButtonWndProc));


 
GrayFace ©   (2006-11-25 14:43) [13]

Чапаев ©   (24.11.06 10:40) [9]
Просто WM_*BUTTONUP обрабатывать неправильно потому, что кнопка может быть нажата "где-то", а отпущена над кнопкой. А это, по совести, за клик не должно считаться.

Просто надо в DOWN делать SetCapture.


 
GrayFace ©   (2006-11-25 14:44) [14]

Ну и, конечно, в UP ReleaseCapture


 
Чапаев ©   (2006-11-25 15:01) [15]

> [13] GrayFace ©   (25.11.06 14:43)
;-) Так это ж уже не "просто WM_*BUTTONUP"


 
Dmitry_177   (2006-11-30 02:44) [16]

В главной процедуре обрабатываю сообщение WM_NCHITTEST,

     WM_NCHITTEST: begin
                     if Window = hWindow then
                       if GetAsyncKeyState(VK_LBUTTON) < 0 then
                         Result := HTCAPTION;
                   end;

И не доходит сообщение WM_LBUTTONDOWN до кнопки, сделав его обработку сабклассингом... Что делать?


 
Чапаев ©   (2006-11-30 10:48) [17]

> [16] Dmitry_177   (30.11.06 02:44)
Ну конечно не доходит. Ты же таким образом объявляешь: всё что есть на форме -- это заголовок. Заголовок -- неклиентская область и клиентские сообщения окну не доходят, конечно.

Можешь вместо WM_LBUTTONDOWN на кнопке ловить нечто вроде WM_NCLBUTTONDOWN (не помню точное название) в главном окне. Но вообще лучше подумай, как обойтись без объявления всей области окна заголовком.


 
Dmitry_177   (2006-11-30 19:25) [18]

Мне перетаскивать форму нужно ткнув в любое ее место... Если делать через WM_MOUSEMOVE мне кажется что это будет менее эффективнее...


 
Чапаев ©   (2006-11-30 22:08) [19]

> [18] Dmitry_177   (30.11.06 19:25)
Ну и зря.

Тогда уж делай что-то вроде if PtInRect(Point(X,Y),ButtonRect) then Result:=HTCLIENT else Result:=HTCAPTION;


 
Belorus ©   (2006-12-01 00:53) [20]

procedure MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
 If ssLeft in Shift then
 Begin
   ReleaseCapture;
   Perform(WM_SYSCommand,61457,1);
 End;    
End;



Страницы: 1 вся ветка

Текущий архив: 2007.04.29;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.045 c
2-1176206136
Steep
2007-04-10 15:55
2007.04.29
Ссылка на класс


9-1148897218
аматор
2006-05-29 14:06
2007.04.29
каким образом создать модель?


15-1175461600
ElectriC
2007-04-02 01:06
2007.04.29
Будущее Delphi


3-1171014579
Punik
2007-02-09 12:49
2007.04.29
<b>Возможна ли преобразование .Log-ов в таблицы .dbe, db.</b>


2-1176131687
Ezorcist
2007-04-09 19:14
2007.04.29
Приоритет потока TThread и самой программы.