如何将基于TWinControl的组件做成透明的?

MakeEverydayProgres 2003-10-16 08:04:18
RT
...全文
43 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
怎样将 TStaticText 透明啊,我没搞定
procedure TStaticTextTs.WMEraseBkgnd(var Message: TWmEraseBkgnd);
begin
inherited;
Message.Result := 1;
end;

procedure TStaticTextTs.CreateParams(var Params: TCreateParams);
begin
inherited;
Params.ExStyle := Params.ExStyle or WS_EX_TRANSPARENT;
end;

解决马上结贴,先谢谢了
vargent77 2003-10-17
  • 打赏
  • 举报
回复
楼上答的挺好了,如果再介绍一下DRAWITEM里面的写法就好了,原码钟那段东西好多哦
pankun 2003-10-16
  • 打赏
  • 举报
回复
转:

控件透明

将一个FORM变成透明的实质性手段就是拦截CMEraseBkgnd消息。

unit Utransform; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TForm1 = class(TForm)

private { Private declarations }

public { Public declarations }

PROCEDURE CMEraseBkgnd(var Message:TWMEraseBkgnd);Message WM_ERASEBKGND;

end;

var Form1: TForm1;

implementation

{$R *.DFM}

PROCEDURE Tform1.CMEraseBkgnd(var Message:TWMEraseBkgnd);

BEGIN

brush.style:=bsClear;

Inherited;

END;

end.

//////////////////////////////////////

procedure TForm1.FormCreate(Sender: TObject);

begin

Form1.Brush.Style := bsClear;

Form1.BorderStyle := bsNone

end;

procedure TForm1.BitBtn1Click(Sender: TObject);

begin

Application.Terminate;

end;

/////////////////////////////////////////////

用透明的控件呗. 一般继承自TGraphicControl的

(就是那些没有handle属性, 不能有focus的控件, 如image)

都有Transparent属性. 对TWinControl类的控件, 要实现透明只要完成以下

三步基本上就成了.

1. override 它的CreateParams方法, exstyle 里加上WS_EX_TRANSPARENT.

2. 修改它的parent的window style, 去掉WS_CLIPCHILDREN.

3. 截获WM_ERASEBKGND, 什么都不做直接返回1.

一般有上面3步能成. 有些控件比如TPanel, 在它的paint中用了fillrect, 所以要实现透明的话还要override 它的paint方法, 自己画.

按钮透明需要进一步处理.

createparams里加上style := style or BS_OWNERDRAW;

然后在WM_DRAWITEM中自己画吧

5,379

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧