aardio 官方社区

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 7553|回复: 4

窗体透明化之后,里面的控件脱离原来的窗口显示在窗体外面之后怎么还原回去?

[复制链接]

38

主题

129

回帖

1045

积分

荣誉会员

积分
1045
发表于 2017-10-25 21:09:53 | 显示全部楼层 |阅读模式
如题:
窗体透明化之后,里面的控件脱离原来的窗口显示在窗体外面之后怎么还原回去?

我建立了一个窗口,里面与一个背景色为蓝色的plus.
我设置了窗口透明度是80,然后里面的控件plus也透明化了.
我继续设置
  1. winform.plus.orphanWindow();
复制代码

使这个plus脱离父窗体,这样plus确实透明化消失了..
下一步我设置这个plus的父窗体为winform.
  1. win.setParent(winform.plus.hwnd,winform.hwnd);
复制代码

plus控件确实再一次透明化了,但是发现它的位置不是在原来的地方.
所以我猜测需要先要获取脱离窗体之后的plus相对整个电脑窗口的pos,然后将这个pos从窗口坐标转换为客户区坐标
再设置plus相对winform位置..
于是:
  1. var x,y = winform.plus.getPos();
  2.         var bx,by = win.toClient(winform.hwnd,x,y)

  3.         win.setParent(winform.plus.hwnd,winform.hwnd);
  4.         winform.plus.setPos(bx,by);
复制代码

运行后,确实透明化在原来的地方.
但,问题又来了. 拖动窗口发现,这个plus不是随着窗体移动相对窗口静止,而是随着移动窗口移动的更大幅度....


下面是测试的整个代码:
  1. import win.ui;
  2. /*DSG{{*/
  3. var winform = win.form(text="aardio form";right=759;bottom=469)
  4. winform.add(
  5. button={cls="button";text="button";left=86;top=372;right=253;bottom=429;z=3};
  6. button2={cls="button";text="button2";left=462;top=356;right=613;bottom=427;z=4};
  7. edit={cls="edit";text="edithjfdjhfgdjhkjhvgdfd";left=93;top=90;right=328;bottom=125;edge=1;font=LOGFONT(h=-21);multiline=1;z=1};
  8. plus={cls="plus";left=105;top=172;right=567;bottom=240;bgcolor=15780518;z=2}
  9. )
  10. /*}}*/

  11. import console;
  12. console.open();

  13. winform.button2.oncommand = function(id,event){
  14.         //winform.msgbox( winform.button2.text );
  15. /*
  16.         console.dump(
  17.                 win.getPos(winform.plus.hwnd,true)
  18.         )
  19.         console.dump(
  20.                 winform.plus.getPos()
  21.         )
  22. */
  23.         var x,y = winform.plus.getPos();
  24.         var bx,by = win.toClient(winform.hwnd,x,y)

  25.         win.setParent(winform.plus.hwnd,winform.hwnd);
  26.         winform.plus.setPos(bx,by);
  27.        
  28. }


  29. winform.button.oncommand = function(id,event){
  30.         //winform.msgbox( winform.button.text );
  31.        
  32.         winform.edit.orphanWindow();
  33.         winform.plus.orphanWindow();
  34. }


  35. winform.transparent(80);

  36. winform.show()
  37. win.loopMessage();
复制代码

170

主题

2182

回帖

1万

积分

管理员

积分
13226
发表于 2017-10-25 21:40:34 | 显示全部楼层

orphanWindow的前提是从子窗口脱离,
他实际上已经是一个独立的窗口,但是成为一个影子窗口,类似窗口阴影效果的做法一样,
如影随形的跟着主窗口,看起来就仿佛悬挂在主窗体上一样。

他是用来实现这样的效果的:


你把他重新设置为子窗口,他已经不是orphanWindow了,
而且他自动管理位置,你又去强制控制他,当然显示乱套了。

首先要知道他是一个假的“子窗口”,Windows里本来没有这个东西,这是plus控件虚拟出来的,
真实性质上,请把他理解为一个独立窗口,

所以需要他透明,这样写就行了:
winform.plus.orphanWindow();

winform.plus.modifyStyleEx(0,0x80000/*_WS_EX_LAYERED*/)
::User32.SetLayeredWindowAttributes( winform.plus.hwnd,0, 80,2)



38

主题

129

回帖

1045

积分

荣誉会员

积分
1045
 楼主| 发表于 2017-10-25 22:12:56 | 显示全部楼层
Jacen.He 发表于 2017-10-25 21:40
orphanWindow的前提是从子窗口脱离,
他实际上已经是一个独立的窗口,但是成为一个影子窗口,类似窗口阴 ...

谢谢Jacen.

这两天对一直使用的Q+桌面管理精灵挺好奇的,所以想模仿一个学习一下,哈
这个应该是类似于 : 一个全屏最大化的软件,里面内置了几个listview列表来管理桌面上的文件和文件夹, 然后它的界面完全贴合桌面是透明的,listview又是不完全透明.
我第一时间考虑这个应该是layout那种好做很多,layout还在看,所以想先利用winform控件实现下试试.
然后我第一个想到的是,winform.transparent(true);全透明
第二个就是winform上面的listview半透明, 这个有点难了,估计要上gdi了.

额,写到这,突然想到vb里面直接在窗体上开个透视洞是咋实现的? 我知道layout上有这个功能,不知道标准控件能不能实现...

附上个Q+界面.

170

主题

2182

回帖

1万

积分

管理员

积分
13226
发表于 2017-10-25 23:11:43 | 显示全部楼层
popdes 发表于 2017-10-25 22:12
谢谢Jacen.

这两天对一直使用的Q+桌面管理精灵挺好奇的,所以想模仿一个学习一下,哈

这种是分层窗口,分层窗口不仅仅是只可以设置透明度,
象论坛的桌面宠物效果这些都是分层窗口实现,分层窗口就是你可以直接画半透明,镂空的效果,技术上很简单,但是分层窗口的性能不好。

HTMLayout支持分层窗口。你在HTML里设置怎么样透明镂空,最后就是怎样透前镂空。

orphanWindow的好处是性能好,可以只是部分分层窗口,类似aardio中的那个阴影窗口。

170

主题

2182

回帖

1万

积分

管理员

积分
13226
发表于 2017-10-25 23:13:07 | 显示全部楼层
HTMLayout做了个桌面宠物---虎鲸
http://bbs.aardio.com/forum.php?mod=viewthread&tid=8485


这都5年前的代码了。
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|aardio.com|aardio 官方社区 ( 皖ICP备09012014号 )

GMT+8, 2024-5-23 11:58 , Processed in 0.058350 second(s), 22 queries .

Powered by Discuz! X3.5

Copyright © 2001-2023 Tencent Cloud.

快速回复 返回顶部 返回列表