心中的矛盾(20分)

  • 主题发起人 主题发起人 yyok
  • 开始时间 开始时间
Y

yyok

Unregistered / Unconfirmed
GUEST, unregistred user!
我想开发一个非可视的组件。于是想从TComponent继承。
但是,我的组件中又不得不用Handle属性,而TComponent没有这个属性。
所以我又不得已从TWinControl继承。
但这样一来,组件就变成可视的了,会在窗体上出现了。
我现在想它不可视,就像非可视控件一样显示一个小图标。
请大家给我一个解决方案。
 
鱼肉和熊掌都要也可以啊,你不是有visual属性么,把它设置为false不就得了.有HANDLE,和可见否不就全有了么?实际上就是控件,你把它visual属性设置下.
 
我知道可以设他的可见属性。可是我想有一个图标应该怎么做呢?
从TWincotrol继承他默认是一个矩形框,并且可以改变大小
 
真不知道你要handle干什么用。
 
有些API的调用它需要Handle,我也没办法
 
不知你到底要做什么,不过参考一下Delphi固有的非可视化组件的结构就会有办法的,例如TOpenDialog之类的。问题并不是想像的那样复杂。
 
本来从TComponent是很不错的。但是他没有Handle,我的程序中调用一个API需要一个Handle,并且之后的消息也是发到这个Handle的。
所以我没办法就从TWincontrol继承了。
 
真奇怪,难道自己不能加一个 Handle 属性吗
 
啥都不说了。。。看这个吧。。。

TTimer是TComponent,实现了消息的处理:

constructor TTimer.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FEnabled := True;
FInterval := 1000;
{$IFDEF MSWINDOWS}
FWindowHandle := Classes.AllocateHWnd(WndProc);
{$ENDIF}
{$IFDEF LINUX}
FWindowHandle := WinUtils.AllocateHWnd(WndProc);
{$ENDIF}
end;

destructor TTimer.Destroy;
begin
FEnabled := False;
UpdateTimer;
{$IFDEF MSWINDOWS}
Classes.DeallocateHWnd(FWindowHandle);
{$ENDIF}
{$IFDEF LINUX}
WinUtils.DeallocateHWnd(FWindowHandle);
{$ENDIF}
inherited Destroy;
end;

顺便可以瞅瞅AllocateHWnd的帮助```


PS:我知道这个答案之前,是通过限定了最大尺寸的WinControl来实现的,还在上面自绘了图标```变态吧```
 
接受答案了.
 
后退
顶部