Форум: "WinAPI";
Текущий архив: 2005.06.29;
Скачать: [xml.tar.bz2];
Вниз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 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.06.29;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.046 c