请问如何在一控件内接收到其他事件接收到的消息。(50分)

  • 主题发起人 主题发起人 HORNEY
  • 开始时间 开始时间
H

HORNEY

Unregistered / Unconfirmed
GUEST, unregistred user!
我主要是模仿菜单机制,一旦点窗体上其它的地方就可以让自制的控件消失,由于我对菜单
不是很熟悉,所以我想从普通的PANEL入手。
 
在application .OnMessage 中处理
 
但是我只想在自己的控件内做道场,不想牵涉到其它的地方。
 
没有其他好办法,好象只有接管窗口进程。
 

在自制控件失去焦点时隐藏!
 
jsxjd:
我一开始就试过了,但是如果鼠标点的是窗体或是LABEL就。。。
 
为你的控件加入消息处理函数!
 
so , which message?
 
告诉你了在控件里接管窗口进程,类似如下:
constructor TXXXXComponent.Create(AOwner: TComponent);
var
ptr: Pointer;
begin
inherited;
FForm := TForm(GetParentForm(TControl(AOwner)));
if not (csDesigning in ComponentState) then
begin
FOldWndProc := Pointer(GetWindowLong(FForm.Handle, GWL_WNDPROC));
ptr := MakeObjectInstance(NewWndProc);
SetWindowLong(FForm.Handle, GWL_WNDPROC, Longint(ptr));
end;
end;
接下来设计你的新窗口进程 NewWndProc ,就可以了。
 
我现在决定用SETWINDOWSHOOKEX来捕捉事件,但是我又碰到一个很有趣的问题,此函数后2
个参数怎么写,注意,我不是写DLL,所以请大家不要把DLL中的方法帖上来。
此外,先前用SETWINDOWSHOOK这个老函数测试时,有时它会发出一大串同样的消息,最后导
致当掉,请问这是怎么回事。
 
{
demonstrate a mouse hook in a form.
}
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
FMHook: HHOOK;
function FMHookProc(Code: Integer; WParam: Longint; var Msg: TMsg): Longint; stdcall;

implementation

{$R *.DFM}

function FMHookProc(Code: Integer; WParam: Longint; var Msg: TMsg): Longint; stdcall;
begin
if Msg.Message = WM_MOUSEMOVE then
with form1 do
begin
//可以先判断一下位置
//Edit1.text := inttostr(msg.wParam);//做你要做的事
caption := format('Mouse Pos in the form:%d,%d',[msg.pt.x,msg.pt.y]);
end
else
if (Msg.Message = WM_lBUTTONDOWN)or(Msg.Message = WM_RBUTTONDOWN) then
begin
//如果位置不在Panel范围内,隐藏它。
end;
Result := CallNextHookEx(FMHook, Code, WParam, Longint(@Msg)); //放出消息给下一个.
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
FMHook := SetWindowsHookEx(WH_GETMESSAGE, @FMHookProc, 0, GetCurrentThreadID);
end;

end.
 
我记得form有一个OnDeactivate事件,也许去看form的原代码就可以明白了
我看了,原来每个控件都有一个CM_DEACTIVATE事件(跟cm_mouseleave,cm_mouseon),其实
这些在vcl的原代码里都可以看到,只有通透了vcl才能成为delphi高手啊,多看看人家
borland的天才们写的代码吧
 
多人接受答案了。
 
后退
顶部