Текущий архив: 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.49 MB
Время: 0.043 c