![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
WM_RButtonDown
Okey_ © (2005-04-30 22:24:00)WM_RButtonDown - работает по всей форме, как мне сделать что бы оно работала например над кнопкой.
Заранее спасибо.
Marser (2005-05-08 18:25:00) [1]Да, зеванул я... Класс окна кнопки не регистрируется :-)
В общем, так:
oldbutproc:Pointer;//адрес старого обработчика
....
//После создания кнопки:
oldbutproc:=Pointer(GetWindowLong(ButWND,GWL_WNDPROC)); SetWindowLong(ButWND,GWL_WNDPROC,longint(@ButtonProc));
Теперь можно использовать собственный обравботчик, пр этом обязательно вызывая старый. Примерно вот так:
function ButtonProc(wnd:HWND; Msg : Integer; Wparam:Wparam; Lparam:Lparam):Lresult;stdcall;
begin
if msg=WM_LBUTTONDOWN then
begin
....
end; Result:=CallWindowproc(oldbutproc,WND,msg,wparam,lparam);
end;
Marser (2005-05-03 11:19:00) [2]
> А windowproc на что?
А WindowProc это call-back функция, которую ты задешь в CreateWindow или CreateWindowEx при создании любого окна.
Если кнопка всё-таки VCL-ная, то можно заменить button1.WindowProc, не забывая при этом вызывать преыдущий вариант.
Если же она создана средствами API, то ты должен был заполнить TWndClassEx.lpfnWndProc.
В крайнем случае - смотри GetWindowLong, SetWindowLong и GWL_WNDPROC.
Okey_ (2005-05-02 23:35:00) [3]Marser © (01.05.05 16:35) [3]
А windowproc на что?
Так роботает только по всей форме, а мне нужно например над кнопкой
Marser (2005-05-01 16:35:00) [4]А windowproc на что?
Okey_ (2005-05-01 16:29:00) [5]А если я пишу на API
Marser (2005-05-01 16:03:00) [6]Два варианта. Первый - создание потомка TButton с соответствующей обработкой. Второй - использование Application.OnMessage:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
procedure HandleMsg(var Msg:TMSG;var Handled:boolean);
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.HandleMsg(var Msg:TMSG;var Handled:boolean);
begin
if (msg.hwnd=Button1.Handle)and
(msg.message=WM_RButtonDown) then
begin
ShowMessage('Правая кнопка мыши нажата над Button1');
Handled:=True //В этом случае обработка события OnMouseDown проходить не будет
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
application.OnMessage:=HandleMsg;
end;
procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
showmessage('Событие произошло')
end;
end.