[求助]如何制作半透明Panel? ( 积分: 100 )

  • 主题发起人 主题发起人 psycholo
  • 开始时间 开始时间
P

psycholo

Unregistered / Unconfirmed
GUEST, unregistred user!
在下向各位前辈请教,如何制作能调整透明度的Panel?当然,上面的控件能一起透明最好……就像Form上的AlphaBlend属性的效果一样……
由于在下资历尚浅,能有源码最好,伪码也行,能让在下开窍就好……拜谢
(貌似SetLayeredWindowAttributes这个Api不能在Panel上用?在下水平有限,尝试多次失败……)
 
呵呵。下面这段代码希望对你有所帮助。
var
R: TRect;
rop: LongInt;
begin
R := Rect(0, 0, Width, Height);
Buffer.Width := Width;
Buffer.Height := Height;
Buffer.Canvas.Brush.Style := bsSolid;
Buffer.Canvas.Brush.Color := FColor;
Buffer.Canvas.FillRect(Rect(0, 0, Width, Height));
rop := chbpanelStyleToInt(FStyle);
StretchBlt(Buffer.Canvas.Handle, 0, 0, Width, Height,
Canvas.Handle, 0, 0, Width, Height, rop);
if Ctl3D then DrawEdge(Buffer.Canvas.Handle, R, BDR_RAISEDINNER, BF_RECT);
Buffer.Canvas.Pen.Mode := pmCopy;
Buffer.Canvas.Pen.Style := psSolid;
Canvas.Draw(0, 0, Buffer);
if Assigned(FOnPaint) then FOnPaint(Self);
canvas.Refresh;
 
恩,多谢大侠~这段代码我看过,貌似是SemiPanel这个控件里的。他好像只是把Panel画上去,不是真正的透明,而且Panel上面的控件应该不会透明。多谢关注~
 
呃……没有什么更好的办法了么……好冷……
 
我有个透明panel的控件,不过在家里,实在不好意思
 
没事的……控件我也看过好多,不过都是画上去的……难道半透明一定只能用画的?
 
兄弟,你知道怎么画不? 我都不知道该怎么正确的取得控件后面的背景,
 
貌似,是用bitblt函数把Panel后面的东西和Panel本身的Canvas做一个计算后加以合并
虽然本身Panel并没有Canvas,但它貌似给它加上去了。而且现在Panel+canvas控件也是满天飞……
不过这样的缺陷就是,首先,Panel上面的控件,例如Button不会半透明,其次,Panel移动起来超卡……
 
自己能实现已经不错了,还管怎么来的
 
恩……本人愚钝所以好学,望见谅
 
panel.Opacity = 0.5;
 
这……Panel有这个属性么(貌似opacity是vb的……有可能我孤陋寡闻……)?本人用的是delphi7,以及一个普通的Panel……如果有什么控件能这样做的话,望告知,多谢~
 
截取panel背景自画
我现在在别人家,等一会写一个代码
用canvas肯定慢很多的
 
自画的话,不用canvas?55……不知道……望高人指点,叩谢
 
需要让系统去画,因为Panel组件是自己画的(虽然它是一个窗口),但边界,填充啊等都是组件自己画的。你可以再次Override Paint函数,不用Inherited,直接调用DefWindowProc过程,让系统去画。这样你可以使用http://www.blogcn.com/user35/sundytu/blog/23358952.html 中的方法设置这个窗口的属性,系统应该会画出透明效果的Panel了。我没有试过,只是就原理说说,你可以试试,如果有问题可以联系我。
 
关注~~~~~~~~~~~~~~~~~~
 
恩,非常感谢~
SetLayeredWindowAttributes这个我也试过了,的确,他对窗口是有用的,因为窗口的Parent是desktop,然而Panel的明显不是……msdn上也指出,SetLayeredWindowAttributes只对Parent是desktop的才有效……所以很遗憾……
不过,感谢帮助~
还有一点,透明PopupMenu是可以做的,但我始终搞不懂它的原理,难道PopupMenu的Parent也是Desktop?……有点匪夷所思……
 
我也试过,但没有成功,不过我用label实现了同样的功能,楼主可以试一下。
 
好的~多谢提醒~
不过,Label和Panel毕竟不一样呃……还是想用Panel实现……不过不知道到底Panel能不能做到……真希望哪位高人能路过指点一下……
 
貌似以前回答过你一个问题,原来是绿色sql有关的;
帅哥问的问题都是[0,100]分,以为很容易,打算进来混分。
其实一进来看,我靠: 这分还真不好混,啊哈哈

一般继承自TGraphicControl的
(就是那些没有handle属性, 不能有focus的控件, 如image)
都有Transparent属性. 对TWinControl类的控件, 要实现透明只要完成以下
四步基本上就成了.
1.在Create中设定ControlStyle :=
ControlStyle - [csOpaque];)
2. override 它的CreateParams方法, exstyle 里加上WS_EX_TRANSPARENT.
3. 修改它的parent的window style, 去掉WS_CLIPCHILDREN.
4. 截获WM_ERASEBKGND, 什么都不做直接返回1.(不搽除背景)
一般有上面3步能成. 有些控件比如TPanel, 在它的paint中用了fillrect, 所以要实现透明的话还要override 它的paint方法, 自己画.
按钮透明需要进一步处理.
createparams里加上style := style or BS_OWNERDRAW;
然后在WM_DRAWITEM中自己画
 
后退
顶部