GDI+ 半透名 高手急急!!!!(100)

  • 主题发起人 主题发起人 ldk0110
  • 开始时间 开始时间
L

ldk0110

Unregistered / Unconfirmed
GUEST, unregistred user!
我现在想实现 窗体边框用png半透明图片铺成,效果想这样http://hiphotos.baidu.com/hapymengze/pic/item/040068d9cfdf86f738012fde.jpg 看看怎么实现,能给我做个例子吗?谢谢!分少了可以再加!只要解决问题,现在急用
 
看不到图...必须baidu用户才能看的到是不是部分半透明部分不透明的?目前没什么特好的解决方法...自己画的见过不少人说,实际代码从来没见到目前我能找到的效果和效率都还不错的有一种办法(只不过办法有点龌龊.......)1.建立主窗体(假设叫form1),上面显示要半透明的图片,并且设置这个窗体半透明显示(这一步好办,使用AlphaBlend或者GDI自己画都行)2.再建立一个窗体(假设叫form2),把你要显示的控件什么的都放到这个窗体里,所有的代码也是要放到这个窗体里的,然后设置这个窗体BorderStyle:=bsNone;TransparentColor:=true;,也就是说这个窗体的背景部分弄成全透明的现在你应该知道怎么做了吧,把form2叠加到form1上,设置form2.FormStyle:=fsStayOnTop然后在form1里截获WM_MOVE消息,在消息处理里控制form2和form1同样的BoundsRect大功告成.....
 
To:hs-kill 我昨天也是这样做给你的方法一样,form1上的图片我是用GDI画上的,其他的方法都给你的大同小异,谢谢你啊,这帖子再放几天吧,看谁还有更好胡方法
 
2楼的方法太牛了
 
To:xusong168有更好的方法吗?
 
截桌面作为背景图 自己绘制到你的窗体里 伪造的透明效果以下内容来自csdn8 楼boyzhang(张郎)(爱你爱到Windows没BUG的那天)回复于 2002-11-23 19:31:05 得分 0可以哟,比如要一个窗体透明[W9X下],只要先 隐藏自身,然后获取Windows最上层的DC,Bitblt 窗体的RECT到Form,就"透明"了,不过,一定要在Hook 到窗体的KillFocus消息的时候让窗体隐藏,等到SetFocus 的时候再用上面的方法Bitblt一次,只不过效果没有在 2K/XP下的效果好罢了! :)Top9 楼boyzhang(张郎)(爱你爱到Windows没BUG的那天)回复于 2002-11-23 19:35:36 得分 0半透明可以用AlphaBlend实现,先获取Win最上层DC,再获取窗体DC,调用这个API就OK了,不过,呵呵,在W9X下要实现半透明真的太麻烦了,建议还是用2K或XP中的API吧!
 
http://www.cnblogs.com/del/archive/2008/10/20/1314749.html没试过放在窗体边框
 
现在用两个窗体重叠放可以实现了,不过就是点程序的其他窗体后,再点这两个窗体,如果三个窗体与这两个窗体重叠时就会出现两个窗体分开的情况,有没有办法让这两个窗体绑定到一块,不受其他窗体或主窗体的影响?
 
哦....确实 fsStayOnTop不用写控制了 简单点 不过不能多窗口如果你有多个类似的窗口的话....可以这样假设form1是你的背景from form2是你要重叠上去的form 先取消from2的fsStayOnTop然后在form1添加如下代码:procedure TForm1.FormActivate(Sender: TObject);begin SetWindowPos(form2.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE);end;procedure TForm1.FormDeactivate(Sender: TObject);begin SetWindowPos(form2.Handle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE);end;
 
To:hs-kill: 这样我试了,如果点背景窗体form1正确,但是如果点form2 两个窗体就被第三个窗体分开了,反复调试 用这个 SetWindowPos(form1.Handle,form2.Handle,0,0,0,0,SWP_NOMOVE+SWP_NOSIZE); 也不行,看还有什么好的办法??
 
GDI++ 实现半透明效果,需要设置矩陈 为了赚点分,我把完整GDI++实现代码全给你。其实实现半透明,用GDI也很方便的。一方面是DELPHI在gdi++方面的资料确实少。procedure TForm1.Button1Click(Sender: TObject);const ColorMatrix: TColorMatrix = ((1.0, 0.0, 0.0, 0.0, 0.0), (0.0, 1.0, 0.0, 0.0, 0.0), (0.0, 0.0, 1.0, 0.0, 0.0), (0.0, 0.0, 0.0, 0.5, 0.0), //0.5 为半透明度 1 为不透明 (0.0, 0.0, 0.0, 0.0, 1.0));var Image, Mask: TGpImage; Attr: TGpImageAttributes; g: TGpGraphics; W, H: Integer;begin Image := TGpImage.Create('..mediamsn.jpg'); Mask := TGpImage.Create({'..mediamsn1.gif'}'..mediaMask1.bmp'); Attr := TGpImageAttributes.Create; g := TGpGraphics.Create(Handle, False); try W := Image.Width; H := Image.Height; g.DrawImage(Image, 10, 10, W, H); // 显示图片原图 g.TranslateTransform(W + 4, 0); g.DrawImage(mask, 10, 10, W, H); // 显示掩码原图 Attr.SetColorMatrix(ColorMatrix); g.TranslateTransform(W + 4, 0); g.DrawImage(Image, 10, 10, W, H); // 混合显示 g.DrawImage(mask, GpRect(10, 10, W, H), 0, 0, W, H, utPixel, Attr); finally g.Free; Attr.Free; Mask.Free; Image.Free; end;end;
 
我的图片是PNG格式的,PNG本来就是透明的,我是想让它浮在窗体周围,跟迅雷启动后弹出的迅雷咨询的窗口效果一样,边框是透明的
 
呃.........那就在form2的Activate事件里再加:procedure TForm2.FormActivate(Sender: TObject);begin SetWindowPos(form1.Handle, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE); SetWindowPos(Handle, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE);end;另外,很奇怪,在点击其他窗体时,应该是form1或者form2先失去焦点触发Deactivate然后才是其他窗体触发Activate事件,可是如果什么都不做的话,先点了form1,再点form3的时候form2仍然会档在form3前面,虽然此时form2已经不是HWND_TOPMOST了所以,在其他的窗体Activate事件里还要加一句 BringToFront;
 
为什么就要用png呢,把png用ps保存成位图;在程序中将Timage控件设成透明;将窗体的颜色与透明色统一,在把窗体透明属性设成true;界面什么的能用图片都用图片;窗体设成无边缘,自己用图片做标题栏,随心所欲
 
因为PNG支持半透明 而且是每个点都有自己独立的透明度你说的只能是全透明或者不透明
 
hs-kill 说的很对,要不PNG也不会那么流行了,现在还是那个问题,大侠们再想想办法!!!
 
?我最后写的那些不行吗? 我试过了 3个窗体 其中2个联动 没问题啊 不会出现遮挡问题了
 
To:hs-kill 你的最后写的那个方法很对,如果是一个程序的几个窗体这个方法能解决,但是如果是其他程序的窗体就不行了,如:你说的那个form3是遨游的话 就还会出现那种情况,本程序的第三个窗体可以用BringToFront ,但是其他程序就没法控制了,看还有没有其他办法
 
恩? 奇怪 我这里没你说的那个问题啊....其他程序的窗口不受HWND_TOPMOST的影响,不会出现其他程序激活而你的窗口仍然在前面的问题....你看看是不是其他代码影响了
 

Similar threads

D
回复
0
查看
824
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部