aardio 官方社区

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 11401|回复: 3

改动库win.util.popup,使之从右下角向左滑出,且不影响主窗口

[复制链接]

3

主题

23

回帖

238

积分

荣誉会员

积分
238
发表于 2013-11-6 20:36:14 | 显示全部楼层 |阅读模式
最近在用百度杀毒,发现其通知窗口与其他大多数软件(如qq等)不同,是在右下角从右向左滑出,而不是从右下角从下往上滑出。
标准库win.util.popup实现的是在右下角从下向上滑出,今新建用户库win.util.popup2,使通知窗口在右下角从右侧滑出。

另外,原标准库win.util.popup有一个小问题,就是在通知窗滑出的过程中,通知窗不断地被激活,使得主窗口的某些操作不能进行(如弹出菜单,主窗口失去焦点,菜单立即消失,再次点击菜单亦然,直到通知窗口完全滑出,给操作带来不便。)

查找库win.util.popup中的
0x8/*_SWP_NOREDRAW*/
改为
0x10/*_SWP_NOACTIVATE*/
即可。共两处,约在第16行与第72行。

改动后的用户库:源码保存为win.util.popup2.aardio,作为用户库导入。

  1. //popup2 屏幕右下通知窗口(从右侧滑出)
  2. namespace win.util;

  3. class popup2 {

  4.     ctor( winform,delayClose=10000,clickClose=true,marginRight=25,tick=3,step=3 ){
  5.         this = winform;  
  6.         var x,y,width,height = this.getPos();
  7.         var sRight = ::GetSystemMetrics(0x10/*_SM_CXFULLSCREEN*/);
  8.         var sBottom = ::GetSystemMetrics(0x11/*_SM_CYFULLSCREEN*/) + ::GetSystemMetrics(0x4/*_SM_CYCAPTION窗口标题的高度*/) ;
  9.         leftMost = sRight - marginRight - width;
  10.         x = sRight;
  11.         width_ = width;
  12.         y = sBottom -  height;
  13.         winform.setPos(x,y,0,height,,0x10/*_SWP_NOACTIVATE*/);
  14.       
  15.         var tickstart;
  16.         var remaintime;
  17.         var remaintime_pre;
  18.         
  19.         var waitClick = function(){
  20.             this.capture = true;
  21.             this.wndproc = function(hwnd,message,wParam,lParam){
  22.                                 if( message == 0x201/*_WM_LBUTTONDOWN*/ ){  
  23.                                         var x,y = ..win.getMessagePos(lParam);
  24.                                         if( x < 0 || y < 0 || x > width || y > height ){
  25.                                     this.close();
  26.                             }
  27.                                 }
  28.                         }  
  29.         }
  30.         
  31.         var tmid = this.setInterval( tick,
  32.             function(hwnd,msg,id,tick){
  33.                     if( tickstart ){
  34.                             var span = ..time.tick()-tickstart
  35.                             if( span > delayClose) {
  36.                                     this.clearInterval(id);
  37.                                     if(clickClose){
  38.                                             waitClick();
  39.                                     }
  40.                                     else{
  41.                                             this.close();
  42.                                     }
  43.                             }
  44.                             else {
  45.                                     remaintime = ..math.floor( (delayClose - span) /1000 )
  46.                                     if( remaintime != remaintime_pre ){
  47.                                             remaintime_pre = remaintime;
  48.                                             if(this[["countdown"]])
  49.                                                     this.countdown( remaintime )
  50.                                     }
  51.                             }
  52.                             return;
  53.                     }
  54.             
  55.                 if( x <= leftMost && width_>=width ) {
  56.                         tickstart = ..time.tick()
  57.                         if(delayClose < 0){
  58.                                 this.clearInterval(id);
  59.                                 
  60.                                 if(clickClose){
  61.                                             waitClick();
  62.                                     }
  63.                         }
  64.                                 
  65.                     return;
  66.                 }
  67.                 else{
  68.                         x -= step;
  69.                         width_ = sRight - x;
  70.                         winform.setPos(x,y,width_,height,,0x10/*_SWP_NOACTIVATE*/);
  71.                 }
  72.             }
  73.         );
  74.         ..win.setTopmost(this.hwnd)
  75.         this.show();
  76.     }
  77. }

  78. /**intellisense()
  79. win.util.popup2(.(winform对象,显示超时,点击是否关闭,屏幕右侧边距,移动速度,移动步进) = 创建一个通知窗口,在屏幕右下角弹出\n除参数一以外,所有参数可选,\n显示延时: 以毫秒为单位,延时为-1表示一直显示\n点击是否关闭: 为true则在显示超时以后点击窗口范围外时关闭自身\n移动速度:每次向上移动显示的间隔,以毫秒为单位\n移动步进:每次向上移动的距离
  80. !utilpopup.countdown = @.countdown=function(remaintime){
  81.         ..io.print("剩余时间:",remaintime  + "秒")
  82. }

  83. win.util.popup2() = !utilpopup.
  84. end intellisense**/
复制代码


用法与原库相同。

点评

真棒: 5.0
真棒: 5
感谢,已更新 win.util.popup,并已添加 win.util.popup2 到扩展库,大家可直接使用 import win.util.popup2 导入  发表于 2013-11-8 12:36

9

主题

193

回帖

1297

积分

四级会员

积分
1297
发表于 2013-11-8 10:39:30 | 显示全部楼层
拜读,谢谢分享

0

主题

2

回帖

13

积分

新手入门

积分
13
发表于 2018-5-16 15:52:16 | 显示全部楼层
import win.ui;
import win.util.popup;
import win.reg;
/*DSG{{*/
var winform = win.form(text="";right=301;bottom=599;border="none";exmode="toolwindow";max=false;parent=...)
winform.add(
button={cls="button";text="button";left=80;top=95;right=260;bottom=135;z=1};
edit={cls="edit";text="edit";left=92;top=192;right=247;bottom=266;edge=1;multiline=1;z=2}
)
/*}}*/

/*


win.util.popup(winform);
//启动消息循环
win.loopMessage();

弹出一个窗口,窗口内的控件抖动
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

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

GMT+8, 2023-3-28 12:53 , Processed in 0.054357 second(s), 25 queries .

Powered by Discuz! X3.5

Copyright © 2001-2023 Tencent Cloud.

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