关于窗口嵌入桌面及透明的注意事项

这几天在做个东东,需要将窗体嵌入桌面及窗口透明
开始我以为以我现在的所知应该没什么大问题,结果也的确如此,没什么大问题,只是细节上出了几个小问题...

1. 关于嵌入桌面
原理很简单,找到 Progman 并将窗口 SetParent 过去即可
(当然也可以嵌入到 Progman 的子窗口以保证窗口不覆盖桌面的图标,不过我的要求是我的窗口必须覆盖桌面图标,呵呵)
但是问题来了,我发现我的窗口在桌面上F5或者Win+D的时候会隐藏,尝试拦截 WM_SYSCOMMAND/SC_MINIMIZED消息无效
但是其他嵌入桌面的程序则没有此问题
查看了一下Window Style,发现我的窗口的 Ex Style 多了一个 WS_EX_APPWINDOW 属性(因为是主窗口)
但是我的主窗口此属性去不掉,因此 New 了一个 Form 动态创建后 OK

代码(就一句...)

1 Windows.SetParent(Handle, FindWindow( ' Progman ' ' Program Manager ' ));


2. 关于透明
第一个想到的是 Layered Window
需要注意的是窗口样式 ExStyle 必须包含 WS_EX_LAYERED(0x80000),而且在 CreateParams 里指定无效...
然后使用 SetLayeredWindowAttributes 设置透明度,关于这个函数网上有很多问题,这里不在赘述
执行时我发现我的窗口并没有被透明,SetLayeredWindowAttributes 返回 False
于是我估计还是跟窗体的 Style 有关系(因为我的窗口 BorderStyle=bsNone)
果然,在 CreateParams 里给窗体加上 WS_POPUP 后透明成功~鼓掌~~
不过这样窗口虽然透明了可是窗体里控件也跟着透明了...

跟着就想到 WS_EX_TRANSPARENT 样式,加上后窗体透明,但是控件不透明了
不过这个样式下当桌面被刷新的时候窗口得不到及时通知,因此显示会有点问题
正在尝试 MsgHook...(待续)

先贴个代码吧

 1 procedure  TSubForm.CreateParams( var  Params: TCreateParams);
 2 begin
 3   inherited;
 4    with  Params  do  Style : =  Style  or  WS_POPUP;
 5 end ;
 6
 7 procedure  TSubForm.FormCreate(Sender: TObject);
 8 begin
 9   UpdateStyle;
10 end ;
11
12 procedure  TSubForm.UpdateStyle;
13 begin
14   SetWindowLong(Handle, GWL_EXSTYLE,
15     GetWindowLong(Handle, GWL_EXSTYLE)  or  WS_EX_LAYERED);
16    if  Assigned(SetLayeredWindowAttributes)  then
17     SetLayeredWindowAttributes(Handle,  0 128 , LWA_ALPHA);
18 end ;
19
// 好久不用 D,都忘光了。。。
// D7以上直接使用 Form 的 AlphaBlend/AlphaBlendValue 或者 TransparentColor/TransparentColorVale 即可实现透明
// 其实最终还是用 SetLayeredWindowAttributes 实现的
 
1 procedure  TSubForm.CreateParams( var  Params: TCreateParams);
2 begin
3   inherited;
4    with  Params  do  ExStyle : =  ExStyle  or  WS_EX_TRANSPARENT;
5 end ;

转载于:https://www.cnblogs.com/sephil/archive/2008/06/23/trans_form.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值