Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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.


Наверх

Титульная страница Поиск, карта сайта Написать письмо