300分求半透明控件,比如button,要求在有背景的图上移动时不闪烁 ( 积分: 300 )

  • 主题发起人 主题发起人 jlugjb
  • 开始时间 开始时间
J

jlugjb

Unregistered / Unconfirmed
GUEST, unregistred user!
要求半透明的控件,可以设控件颜色,透明度,在有背景的图上移动时不闪烁
最好是有源代码,现成的控件也可以,但不能是收费的。
如果有控件可以发我信箱里,xiaogong@sohu.com
 
要求半透明的控件,可以设控件颜色,透明度,在有背景的图上移动时不闪烁
最好是有源代码,现成的控件也可以,但不能是收费的。
如果有控件可以发我信箱里,xiaogong@sohu.com
 
解决不闪烁试一下DoubleBuffered := True;
 
但怎么实现半透明呢
 
好,帮顶


--------签名档---------------------------

比肩国内顶尖源码下载站点 -> 源码我爱你

http://www.source520.com
http://www.source520.net

80G源码电子书免费免注册下载,大量精辟技术文档库随时更新
 
半透明的效果我能实现,主要是闪烁问题
我在自己编写的控件中,已经重载了对wm_paint消息的处理,可是还是闪的厉害
背景是在image中,我放在panel上,panel和form都设成了DoubleBuffered := True;
效果还是不好
 
我估计是有移动控件时调用invaliddata函数,后面的背景重画时引起闪烁的,可没法证实和解决
 
菜鸟问的问题,没有人知道吗
 
下面是一个半透明窗口的算法,你自己参考一下
在 show 本窗口之前 ,GetWindowDC(NULL)...总之取得窗口所在位置的图形 ,

然后显示本窗口 ,画的时候 ,进行 alpha blending,就是 :

R_new = ( R_background * a + R_image * (255-a) ) /255;

G_new = ( G_background * a + G_image * (255-a) ) /255;

B_new...........

反正就是 ,一个点的新的 RGB 值 ,是由取得的背景 ,和要画的前景的 RGB 混合而成 ,


那个 a,决定了透明的程度 ,越大越透明…… ( 废话 ,a=255 时不就完全透明了! )

算法可以优化 ,以提高速度 .
 
这个是透明控件的,当然也可是按钮,用的是SetWindowLong来实现的
Transparent Background for Controls
(from Peter Below)

>
> how would I make a component with a transparent background?
> e.g. it shows the background of the parent or other components through it.
>
>
james,

lets play through it for a groupbox descendant, since i happen to have an
example for that .

To do that kind of stuff right, create a new control derived from TGroupbox,
override its CreateParam method like this:

private // in control declaration
Procedure CreateParams( Var params: TCreateParams ); override;

Procedure TTransparentGroupbox.CreateParams( Var params: TCreateParams );
begin
inherited CreateParams( params );
params.ExStyle := params.ExStyle or WS_EX_TRANSPARENT;
end;

Add a handler for the WM_ERASEBKGND message:

Procedure WMEraseBkGnd( Var msg: TWMEraseBkGnd );
message WM_ERASEBKGND;

Procedure TTransparentGroupbox.WMEraseBkGnd( Var msg: TWMEraseBkGnd );
begin
SetBkMode( msg.DC, TRANSPARENT );
msg.result := 1;
end;

That is the basic frame for a TWinControl descendent. For a TGraphicsControl
you would drop the CreateParams (since only WinControls have that method) and
override the create constructor. After calling the inherited constructor you
modify the ControlStyle of the control:

ControlStyle := ControlStyle - [csOpaque];

Transparency actually works better for TGraphicControls than for
TWinControls. The latter have problems if the control is moved or the
are always created with the WS_CLIPCHILDREN style, which automatically
excludes the area under child controls from updates, so the background will
not be updated if required. Removing the WS_CLIPCHILDREN style from a
controls parent is possible with

SetWindowLong( parent.handle, GWL_STYLE,
GetWIndowLong( parent.handle, GWL_STYLE )
and not WS_CLIPCHILDREN );

But that may lead to accessive flicker on screen updates.

Peter Below (TeamB) 100113.1101@compuserve.com)
 
老兄:你可以使用1st Class即可
 
Beyondbill兄,透明我可以实现,主要是闪烁问题
不知道你有没有注意到你帖的文章最后这句话
But that may lead to accessive flicker on screen updates.
 
motar,1st Class在那可以下载到,有源代码吗
 
没有人能回答吗
半透明
移动不闪烁
 
1st在7.0中装不上啊
 
300分怎么都没人要
 
大家帮着顶一顶吧,三天内没答案,我就结帐分钱了,见者有份。
 
哈哈。不过不算是半透明,支持背景变色,从TBUTTON继承。支持FLAT。
我的QQ:57313547
 
用png的控件试试,里边有个按钮控件,有3种状态,可以使用png图片,png图片本身可以是半透明的,甚至是过渡透明的。pngimage那个。
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部