aardio 官方社区

用户名  找回密码
 注册会员

QQ登录

只需一步,快速开始

帖子
查看: 20095|回复: 7

如何调用按钮的点击事件?

[复制链接]

5

主题

42

回帖

540

积分

三级会员

积分
540
发表于 2014-2-8 23:13:24 | 显示全部楼层 |阅读模式
比如当按钮取得焦点时,用ENTER键来调用此按钮的点击事件

  1. import win.ui;
  2. import winex
  3. /*DSG{{*/
  4. var winform = ..win.form(text="aardio Form";right=599;bottom=399)
  5. winform.add(
  6. button={cls="button";text="button";left=169;top=141;right=232;bottom=170;z=1}
  7. )
  8. /*}}*/
  9. winform.button.setFocus()
  10. winform.button.wndproc = function(hwnd,message,wparam,lparam){
  11.         if(message = 0x101/*_WM_KEYUP*/ && wparam = 0xD/*_VK_RETURN*/){
  12.                 winex.click(owner.hwnd)
  13.     }
  14. }
  15. winform.button.oncommand = function(id,event){
  16.                 winform.msgbox("clicked")
  17. }
  18. winform.show();
  19. win.loopMessage();

复制代码


这是用模拟的方法,请问下,有没有其他直接的调用呢?

42

主题

628

回帖

3765

积分

版主

积分
3765
发表于 2014-2-9 03:02:55 | 显示全部楼层
winform.button.oncommand() 直接调用按钮事件就可以了,他不就是一个函数么?!
没有任何必要绕那么大一个弯子.

5

主题

42

回帖

540

积分

三级会员

积分
540
 楼主| 发表于 2014-2-9 12:11:11 | 显示全部楼层
谢谢版主的答复,
可如何在按钮上用按键来达到鼠标点击的效果?
既是当按键取得焦点后,通过键盘上的ENTER键(或其他按键),取得和用鼠标点击此按钮的效果?
用winform.button.oncommand() 好像不能捕获按键的消息吧,

42

主题

628

回帖

3765

积分

版主

积分
3765
发表于 2014-2-9 14:02:35 | 显示全部楼层
lightsword 发表于 2014-2-9 12:11
谢谢版主的答复,
可如何在按钮上用按键来达到鼠标点击的效果?
既是当按键取得焦点后,通过键盘上的ENTE ...

winform.button.oncommand() 就是鼠标点击此按钮的效果。
至于按钮默认设置你能按空格键代替鼠标点击,而回车键通常是用来作对话框快揵键,
例如一个登录对话框,你输好用户名、密码,不会把焦点移到登录按钮上才按回车键,而是直接按回车键触发默认按钮。

回车键总是触发第一个按钮,
所以你可以在对话框设计器中右键点击默认按钮,在弹出菜单中点击排序到【最后面】他就可以响应回车键了。
defbutton.png

如果你希望取而代之的是用户必须将焦点移动到按钮、然后才能响应回车键,你需要添加下面的代码修改按钮样式:
//通知按钮响应回车按键
winform.button2.modifyStyle(,0x1/*_BS_DEFPUSHBUTTON*/)
但不建议你这样做,因为按钮需要得到焦点才响应回车、或者对话框上出现多个默认按钮、这都会不必要的制造混乱。


0

主题

9

回帖

128

积分

一级会员

积分
128
发表于 2014-2-9 17:20:29 | 显示全部楼层
下方这个是从自己写的小程序中截出来的:

  1. //调用『回复』按钮
  2. mainForm.edit.wndproc = function(hwnd,message,wParam,lParam){
  3.         select(message) {
  4.                 case 0x100/*_WM_KEYDOWN*/{
  5.                         if( key.getState("CTRL") and key.getState("ENTER") ){
  6.                                 mainForm.btn_reply.oncommand()
  7.                                 win.delay(1); mainForm.edit.text = "" //加DELAY是为了能删除"ENTER"字符
  8.                         }
  9.                         if( key.getState("CTRL") and key.getState("A") ){
  10.                                 mainForm.edit.selectAll() //全选回复区的内容
  11.                         }
  12.                 }
  13.         }
  14. }
复制代码

42

主题

628

回帖

3765

积分

版主

积分
3765
发表于 2014-2-9 19:14:00 | 显示全部楼层
大将军 发表于 2014-2-9 17:20
下方这个是从自己写的小程序中截出来的:

感谢分享代码,不过代码中存在一些小问题。

1、取CTRL键状态不必要的重复调用 key.getState("CTRL") ,应当在前面加个局部变量,例如:
var ctrl = key.getState("CTRL") 以避免重复调用,程序的性能是点滴挤出来的,所以应注意这些细节。

2、可以使用 wParam 直接取到当前按键虚拟码,不需要使用 key.getState("ENTER") 这种方式。

3、快捷键实际上可以在 mainForm.edit.translateAccelerator  事件中处理,因为这个是专门处理键盘消息的,
这样不必增加一个回调函数减少了一次消息调用过程,并且他过滤了其他的消息只会处理键盘消息,在消息处理中简单的返回true就可以阻止默认的消息处理(文本框里不会输入回车)、不必再去清空文本框。

下面是一个完整的示例:

  1. import win.ui;
  2. /*DSG{{*/
  3. var mainForm = ..win.form(text="aardio Form";right=599;bottom=399)
  4. mainForm.add(
  5. button={cls="button";text="button";left=262;top=339;right=518;bottom=379;z=2};
  6. edit={cls="edit";text="edit";left=64;top=51;right=550;bottom=313;edge=1;multiline=1;z=1}
  7. )
  8. /*}}*/

  9. mainForm.button.oncommand = function(id,event){
  10.         mainForm.msgbox( mainForm.button.text );
  11. }

  12. import key;
  13. mainForm.edit.translateAccelerator = function( msg ){
  14.     var ctrl = key.getState("CTRL");
  15.     var shift =  key.getState("SHIFT");
  16.     var alt = key.getState("ALT");
  17.     if( msg.wParam == 'A'#  && ctrl && !alt && !shift){
  18.         mainForm.edit.selectAll();
  19.         return true;
  20.     }
  21.     elseif( ctrl &&  msg.wParam == 0xD/*_VK_RETURN*/ ){
  22.             if( msg.message == 0x100/*_WM_KEYDOWN*/ )
  23.                     mainForm.button.oncommand()
  24.                 return true;
  25.     }
  26. }

  27. mainForm.show()
  28. win.loopMessage();

复制代码


或者用下面的方法,
在处理对话框快捷键的isDialogMessage事件中也可以自定义快捷键,关键代码如下:

  1. import key;
  2. mainForm.isDialogMessage = function(hwnd,msg){

  3.     if(  msg.wParam == 0xD/*_VK_RETURN*/ && msg.hwnd == mainForm.edit.hwnd && key.getState("CTRL") ){
  4.         msg.hwnd = mainForm.button.hwnd;
  5.     }
  6.     return win.isDialogMessage(hwnd,msg);
  7. }
复制代码

点评

同意: 5.0
同意: 5
感谢指点  发表于 2014-2-10 13:10

5

主题

42

回帖

540

积分

三级会员

积分
540
 楼主| 发表于 2014-2-10 22:26:24 | 显示全部楼层
多谢编程老师,受教了!
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

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

GMT+8, 2025-6-18 08:43 , Processed in 0.063803 second(s), 27 queries .

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

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