Вниз
Скачать: CL | DM;

WM_RButtonDown   Найти похожие ветки 

← →
Okey_   (2005-04-30 22:24) [0]

WM_RButtonDown - работает по всей форме, как мне сделать что бы оно работала например над кнопкой.
Заранее спасибо.


← →
Marser ©   (2005-05-01 16:03) [1]

Два варианта. Первый - создание потомка 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.


← →
Okey_   (2005-05-01 16:29) [2]

А если я пишу на API


← →
Marser ©   (2005-05-01 16:35) [3]

А windowproc на что?


← →
Okey_   (2005-05-02 23:35) [4]

Marser ©   (01.05.05 16:35) [3]

А windowproc на что?

Так роботает только по всей форме, а мне нужно например над кнопкой


← →
Marser ©   (2005-05-03 11:19) [5]


> А windowproc на что?

А WindowProc это call-back функция, которую ты задешь в CreateWindow или CreateWindowEx при создании любого окна.

Если кнопка всё-таки VCL-ная, то можно заменить button1.WindowProc, не забывая при этом вызывать преыдущий вариант.

Если же она создана средствами API, то ты должен был заполнить TWndClassEx.lpfnWndProc.

В крайнем случае - смотри GetWindowLong, SetWindowLong и GWL_WNDPROC.


← →
Marser ©   (2005-05-08 18:25) [6]

Да, зеванул я... Класс окна кнопки не регистрируется :-)

В общем, так:
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;



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

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.04 c
6-1111388273
Sapsi
2005-03-21 09:57
2005.06.29
SMTP авторизация


4-1115268468
lexus3d_(1)
2005-05-05 08:47
2005.06.29
высвобождение файла


14-1117599953
emfw
2005-06-01 08:25
2005.06.29
Стоимость АИС


1-1118034883
Dyakon_Frost
2005-06-06 09:14
2005.06.29
Просмотр flash-ек!


1-1118183356
Gopher
2005-06-08 02:29
2005.06.29
Обращение к реестру




   Наверх