搜索
查看: 1645|回复: 6

让Button按钮实现[单击]和[长按]功能

[复制链接]

39

主题

174

帖子

1037

积分

荣誉会员

htmlayout.cn 我的学习笔记

Rank: 8Rank: 8

积分
1037
发表于 2018-3-10 16:13:04 | 显示全部楼层 |阅读模式
很多时候为了用户操作方便,需要在窗口功能中实现 长按功能 ,并且也不能失去这个按钮的单击功能, 那么

一般应该是这样判断, 当按钮被按下的同时, 开启一个定时器(例如300毫秒), 然后判断在这段时间内是否松开了鼠标, 如果没有松开就判断它为长按, 否则为普通的单击事件



由此考虑: 有两种办法

1,开启一个1毫秒定时器 , 在定时器里获取鼠标左键状态 , 如果发现在不到300毫秒的间隔之内松开了鼠标,那么判定为单击, 超过300毫秒仍然处于按下状态则判断为长按!

2,利用多线程操作, 按下的同时开启一个线程, 线程里判断鼠标的状态,并且和按下当时的时间进行比较, 如果大于300毫秒仍然没有检测到鼠标松开状态就判定为长按, 否则为单击



那么两者有什么优略呢?

它们之间最大不同是: 定时器是在界面线程中操作, 而下面的是在另外一个线程中操作...



我个人猜测,第二种优于第一种方法, 至少不会影响到界面线程的其他方面....

欢迎大家探讨更优的方案!!



第二种实现代码如下:
  1. import win.ui;
  2. /*DSG{{*/
  3. var winform = win.form(text="aardio form";right=356;bottom=240)
  4. winform.add(
  5. button={cls="button";text="单击 / 长按";left=92;top=91;right=261;bottom=156;z=1}
  6. )
  7. /*}}*/

  8. import console
  9. console.open()
  10. winform.button.wndproc = function(hwnd,message,wParam,lParam){
  11.     if(message == 0x202/*_WM_LBUTTONUP*/){
  12.         thread.set("左键按下",false )
  13.         console.log("终止操作")

  14.     }elseif(message == 0x201/*_WM_LBUTTONDOWN*/){
  15.          
  16.         thread.invoke(
  17.             function(  ){
  18.                 import console;
  19.                 var Pretk = time.tick();
  20.                 var Nexttk;
  21.                 var 长按标志 = false;
  22.                 thread.set("左键按下",true )      
  23.                 while( thread.get("左键按下") ){
  24.                     Nexttk = time.tick() - Pretk;
  25.                     if(Nexttk > 300){
  26.                         console.log("连续操作")
  27.                         长按标志 = true;
  28.                         break;
  29.                     }
  30.                 }
  31.                 if(长按标志 == false){
  32.                     console.log("单击操作")
  33.                 }
  34.                  
  35.             }   
  36.         )
  37.          
  38.     }
  39.     //无返回值则继续调用默认回调函数
  40. }

  41. winform.show()
  42. win.loopMessage();
复制代码
! www.HtmLayout.Cn 我的学习笔记
回复

使用道具 举报

12

主题

679

帖子

4008

积分

荣誉会员

子非魚、安知魚之樂

Rank: 8Rank: 8

积分
4008
发表于 2018-3-10 16:57:03 | 显示全部楼层
按钮常用的就是单击操作
我宁愿加个CheckBox来判断

import win.ui;
/*DSG{{*/
var winform = win.form(text="演示";right=206;bottom=199)
winform.add(
button={cls=
"button";text="按钮";left=51;top=103;right=139;bottom=144;z=2};
checkbox={cls=
"checkbox";text="长按操作";left=64;top=63;right=189;bottom=84;z=1}
)
/*}}*/

winform.button.oncommand =
function(id,event){
    winform.msgbox(winform.checkbox.checked ?
"我执行长按操作":"我执行单击操作" )
}

winform.show()
win.loopMessage();
回复

使用道具 举报

2

主题

57

帖子

1433

积分

新手入门

积分
1433
发表于 2018-3-10 17:54:07 | 显示全部楼层
  1. import win.ui;
  2. /*DSG{{*/
  3. var winform = win.form(text="aardio form";right=356;bottom=240)
  4. winform.add(
  5. button={cls="button";text="单击 / 长按";left=92;top=91;right=261;bottom=156;z=1}
  6. )
  7. /*}}*/

  8. winform.button.wndproc = function(hwnd,message,wParam,lParam){
  9.     if(message == 0x202/*_WM_LBUTTONUP*/){
  10.         var tm = time.tick();
  11.         if((tm - winform.tk) > 300){
  12.                 winform.text = "长按: " + tostring(time());
  13.         }else {
  14.                 winform.text = "单击: " + tostring(time());
  15.         }
  16.         winform.tk = tm;
  17.     }elseif(message == 0x201/*_WM_LBUTTONDOWN*/){
  18.             winform.tk = time.tick();
  19.     }
  20. }

  21. winform.show()
  22. win.loopMessage();
复制代码
回复

使用道具 举报

39

主题

174

帖子

1037

积分

荣誉会员

htmlayout.cn 我的学习笔记

Rank: 8Rank: 8

积分
1037
 楼主| 发表于 2018-3-10 19:37:38 | 显示全部楼层

谢谢, 也许我描述的不太明白, 我又重新写了, 希望能描述的清楚.
其实里面用到了类似下面三个函数: 鼠标按下的时候根据时间长短 ,运行不同的 [前进函数] ,无论执行了哪个前进函数, 当鼠标松开的时候都需要调用 那个停止运动的函数.

现在有个问题就是: 当连续点击按钮速度稍快的时候, 有时候只是执行了[停止运动] 这个函数, 感觉好像鼠标按下需要调用的函数没被执行...

伪代码如下:
  1. import win.ui;
  2. /*DSG{{*/
  3. var winform = win.form(text="aardio form";right=356;bottom=240)
  4. winform.add(
  5. button={cls="button";text="单击 / 长按";left=92;top=91;right=261;bottom=156;z=1}
  6. )
  7. /*}}*/

  8. import console;
  9. console.open()
  10. 函数A = function(){
  11.         console.log("正在执行函数A( 单步前进100mm )")
  12. }

  13. 函数B = function(){
  14.         console.log("正在执行函数B( 连续前进 )")
  15. }

  16. 函数C = function(){
  17.         console.log("正在执行函数C ( 停止前进 )")
  18. }


  19. winform.button.wndproc = function(hwnd,message,wParam,lParam){
  20.     //弹起
  21.     if(message == 0x202/*_WM_LBUTTONUP*/){
  22.        
  23.                 thread.set("左键按下",false )
  24.         函数C();
  25.                        
  26.     }elseif(message == 0x201/*_WM_LBUTTONDOWN*/){//按下
  27.                 thread.invoke(
  28.             function( 函数A,函数B ){
  29.                 import console;
  30.                 var Pretk = time.tick();
  31.                 var Nexttk;
  32.                 var 长按标志 = false;
  33.                 thread.set("左键按下",true )      
  34.                 while( thread.get("左键按下") ){
  35.                     Nexttk = time.tick() - Pretk;
  36.                     if(Nexttk > 300){
  37.                         函数B();
  38.                         长按标志 = true;
  39.                         break;
  40.                     }
  41.                 }
  42.                 if(长按标志 == false){
  43.                     函数A();
  44.                 }
  45.                  
  46.             },函数A,函数B)
  47.     }
  48.     //无返回值则继续调用默认回调函数
  49. }

  50. winform.show()
  51. win.loopMessage();
复制代码

! www.HtmLayout.Cn 我的学习笔记
回复

使用道具 举报

2

主题

57

帖子

1433

积分

新手入门

积分
1433
发表于 2018-3-10 19:55:48 | 显示全部楼层
popdes 发表于 2018-3-10 19:37
谢谢, 也许我描述的不太明白, 我又重新写了, 希望能描述的清楚.
其实里面用到了类似下面三个函数: 鼠标 ...

你不知道速度较快时,回调得到的是
0X203/*_WM_LBUTTONDBLCLK*/
???
回复

使用道具 举报

39

主题

174

帖子

1037

积分

荣誉会员

htmlayout.cn 我的学习笔记

Rank: 8Rank: 8

积分
1037
 楼主| 发表于 2018-3-10 20:02:22 | 显示全部楼层
松江 发表于 2018-3-10 19:55
你不知道速度较快时,回调得到的是
0X203/*_WM_LBUTTONDBLCLK*/
???

对啊, 我咋没注意到.... 阿里嘎多
以上伪代码添加这个双击就可以了
  1. elseif(message == 0x203/*_WM_LBUTTONDBLCLK*/){
  2.             函数A();
  3.     }
复制代码


完美, 结贴
! www.HtmLayout.Cn 我的学习笔记
回复

使用道具 举报

0

主题

1

帖子

92

积分

一级会员

Rank: 2

积分
92
发表于 2018-3-11 22:32:11 | 显示全部楼层
这样会不会简单些?
  1. import win.ui;
  2. tick = 0;
  3. /*DSG{{*/
  4. var winform = win.form(text="aardio form";right=759;bottom=469)
  5. winform.add(
  6. button={cls="button";text="button";left=117;top=84;right=229;bottom=142;z=1};
  7. static={cls="static";text="static";left=83;top=187;right=315;bottom=229;transparent=1;z=2}
  8. )
  9. /*}}*/

  10. winform.button.wndproc = function(hwnd,message,wParam,lParam){
  11.         if(message == 0x0201/*_WM_LBUTTONDOWN*/){
  12.                 winform.static.text = "按下鼠标";
  13.                 tick = time.tick();
  14.         }
  15.         if(message == 0x0202/*_WM_LBUTTONUP*/){
  16.                 winform.static.text = "放开鼠标";
  17.                 jg = time.tick() - tick;
  18.                 if(jg > 300){
  19.                         winform.static.text = "长按。ms:" ++ jg ;       
  20.                 }else {
  21.                         winform.static.text = "单击。ms:" ++ jg;       
  22.                         }       
  23.         }
  24.        
  25. }

  26. winform.show()
  27. win.loopMessage();
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

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

GMT+8, 2018-12-17 18:28 , Processed in 0.062500 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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