Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2007.04.29;
Скачать: [xml.tar.bz2];

Вниз

Обработка 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 вся ветка

Форум: "WinAPI";
Текущий архив: 2007.04.29;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.051 c
2-1176132863
PAN
2007-04-09 19:34
2007.04.29
Чтение инфы из файла своей программы


2-1175844950
Мимопроходящий
2007-04-06 11:35
2007.04.29
Кодировки


3-1171269054
Ламерок
2007-02-12 11:30
2007.04.29
Как узнать сушествует ли запись в ячейке поля?


2-1175955394
=Guest=
2007-04-07 18:16
2007.04.29
Количество файлов в папке


2-1175946952
kilonet
2007-04-07 15:55
2007.04.29
Отладка





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский