怎么做透明的Panel,或者类似的东西?

newware 2002-07-21 10:13:44
我在程序里想用透明的Panel把内嵌的Word遮住,这样就不能编辑Word了.

请问怎么办?
...全文
34 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
greencoding 2002-07-21
  • 打赏
  • 举报
回复
把我要抄的贴了出来,无聊死了...
ly_liuyang 2002-07-21
  • 打赏
  • 举报
回复
将一个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.在Create中设定ControlStyle :=
ControlStyle - [csOpaque];)
2. override 它的CreateParams方法, exstyle 里加上WS_EX_TRANSPARENT.
3. 修改它的parent的window style, 去掉WS_CLIPCHILDREN.

inherited CreateParams(Params);
with Params do
begin
{ 完全重画 }
Style := Style and not WS_CLIPCHILDREN;
Style := Style and not WS_CLIPSIBLINGS;
{ 增加透明 }
ExStyle := ExStyle or WS_EX_TRANSPARENT;
end;


4. 截获WM_ERASEBKGND, 什么都不做直接返回1.(不搽除背景)
一般有上面3步能成. 有些控件比如TPanel, 在它的paint中用了fillrect, 所以要实现透明的话还要override 它的paint方法, 自己画.
按钮透明需要进一步处理.
createparams里加上style := style or BS_OWNERDRAW;
然后在WM_DRAWITEM中自己画吧

unit TransButton;

interface

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

type
TTransButton = class(TButton)
private
FTransparent : Boolean;

procedure SetTransparent(Value: Boolean);
procedure WMEraseBkgnd(var Msg: TMessage); message WM_ERASEBKGND;
protected
procedure CreateParams(var Params: TCreateParams); override;
procedure SetParent(AParent: TWinControl); override;
published
property Transparent: Boolean read FTransparent write SetTransparent;
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('CX Lib', [TTransButton]);
end;

procedure TTransButton.SetTransparent(Value: Boolean);
begin
if ftransparent <> value then
begin
ftransparent := value;
if value then
controlstyle := controlstyle - [csOpaque]
else
controlstyle := controlstyle + [csOpaque];
invalidate;
end;
end;

procedure TTransButton.WMEraseBkgnd(var Msg: TMessage);
var
br: HBRUSH;
begin
if ftransparent then
msg.result := 1
else
inherited;
end;

procedure TTransButton.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
params.exstyle := params.exstyle or WS_EX_TRANSPARENT;
end;

procedure TTransButton.SetParent(AParent: TWinControl);
begin
inherited SetParent(AParent);
if (aparent <> nil) and aparent.HandleAllocated
and (GetWindowLong(aparent.Handle, GWL_STYLE) or WS_CLIPCHILDREN <> 0) then
SetWindowLong(aparent.handle, GWL_STYLE, GetWindowLong(aparent.Handle, GWL_STYLE)
and not WS_CLIPCHILDREN);
end;

end.
newware 2002-07-21
  • 打赏
  • 举报
回复
我这有FlatStyle,我来试试
newware 2002-07-21
  • 打赏
  • 举报
回复
我这有FlatStyle,我来试试
My_first 2002-07-21
  • 打赏
  • 举报
回复
需要吗? FlatStyle.For.D56.rar里的flatplan,是透明的。 不过还要经过自己的修改。 改一两句就搞定了。 如需要下载去。www.51delphi.com



newware 2002-07-21
  • 打赏
  • 举报
回复
我用的Webbrowse控件然后像打开网页一样打开的Word
glink 2002-07-21
  • 打赏
  • 举报
回复
好像有个叫什么shape的控件可以覆盖啊。
netlib 2002-07-21
  • 打赏
  • 举报
回复
你把OLE控件的Mouse消息全部截获下来不让它处理就能达到你要的效果了,
不用透明的东西盖它。

5,388

社区成员

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

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