难题:从TObject继承的对象能否响应自定义的消息? (10分)

  • 主题发起人 主题发起人 ozj
  • 开始时间 开始时间
O

ozj

Unregistered / Unconfirmed
GUEST, unregistred user!
我们知道只有从Tcontrol以下继承的控件和有handle的控件才能
响应消息,不知从TObject继承的对象能否响应自定义的消息?
有没有办法实现?
 
应该可以吧,不是可以把方法声明为消息处理吗?
 
能否响应消息和从哪继承无关
 
请问如何实现呢?
 
看看delphi的源代码啊,呵呵
 
TObject连Handle都没有,也就是它根本没有接收消息的能力,所以我认为如果你没有在
它的子类中实现Handle的话,是不可能进行消息处理的。
 
要实现只能你自己实现,vcl实现这个都费了一大番功夫,不过间接接收消息应该会简单点吧!
 
你想让它响应它就能响应!
 

interface

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

type
TMyControl = class(TObject)
private
{ Private declarations }
FHandle:THandle;
protected
{ Protected declarations }
procedure WndProc(var Msg:TMessage);
public
{ Public declarations }
Constructor Create;
Destructor Destroy;override;
property Handle:THandle read FHandle;
published
{ Published declarations }
end;

implementation

{ TMyControl }

constructor TMyControl.Create;
begin
FHandle:=AllocateHwnd(WndProc);
end;

destructor TMyControl.Destroy;
begin
DeallocateHWnd(FHandle);
inherited;
end;

procedure TMyControl.WndProc(var Msg: TMessage);
begin
try
if Msg.Msg=wm_user+1 then
showmessage('ok')
else msg.Result:= DefWindowProc(FHandle, Msg.msg, msg.wParam, msg.lParam);
except
Application.HandleException(Self);
end;
end;

end.

可以用postmessage(hwnd_broadcast,wm_user+1,0,0)发消息
 
to hubdog
请解释一下好吗?
 
实际上allocatehwnd就是创建一个隐藏的窗口来接收消息了,你的句柄也是allocatehwnd分配的窗口的
句柄了,明白了吗?
 
那会不会消耗很大的内存资源?因为每生成一个对象的实例就要创建一个隐藏的窗口。
 
你的对象必须有自己的消息循环系统才能处理消息。对于窗口对象来说已经从上层对象中继承了
这个能力,所以如果想让自己的对象处理消息,请首先创建自己的消息循环。
 
HUBDOG的是对的。我也经常这样干。不会消耗很大内存的。
 
呵呵,TTimer 就是一个很好的例子,短小,精干,值的一读

方法和 hubdog 的类似
 
不错,问题结束,不好意思,不能给大伙多点的分。
 
多人接受答案了。
 
后退
顶部