aardio 官方社区

用户名  找回密码
 注册会员

QQ登录

只需一步,快速开始

帖子
查看: 10302|回复: 9

多个文本框响应回车事件的疑问?

[复制链接]

12

主题

39

回帖

310

积分

二级会员

积分
310
发表于 2017-11-7 04:09:28 | 显示全部楼层 |阅读模式
一开始用PLUS列子的发现怎么都不能回车事件。

就是用那个快捷键 就调用出来 对应的文本框,然后响此文本框的内容,现在发现他们不是按照我的想法来的,最主要的就是另外一个获取不到回车事件

菜鸟,求助。。。
  1. import win.ui;
  2. import win.ui.atom;
  3. import console
  4. /*DSG{{*/
  5. var winform = win.form(text="来回切换";right=376;bottom=36;image=$"\res\form-background.jpg";bkBottom=5;bkLeft=0;bkRight=0;bkTop=11;border="none";parent=...)
  6. winform.add(
  7. editCard={cls="edit";left=115;top=18;right=280;bottom=43;color=16711680;edge=1;font=LOGFONT(name='';h=-24);z=4};
  8. editGoods={cls="edit";left=7;top=4;right=172;bottom=29;edge=1;font=LOGFONT(name='';h=-24);z=1};
  9. picturebox3={cls="picturebox";left=349;top=7;right=369;bottom=27;image=$"\res\close-hover.jpg";notify=1;z=3};
  10. static={cls="static";text="正在运行中...";left=199;top=8;right=367;bottom=29;transparent=1;z=2}
  11. )
  12. /*}}*/

  13. winform.editCard.wndproc = function(hwnd,message,wParam,lParam){
  14.        
  15.          select(message) {//判断消息类型
  16.         case 0x100/*_WM_KEYDOWN*/ //键盘按下
  17.         {
  18.             if(wparam == 0xD/*_VK_RETURN*/ or wparam == 0x20/*_VK_SPACE*/){
  19.                 win.msgbox("123","aardio")
  20.                }
  21.         }   
  22.     }
  23.        
  24.        
  25. }


  26. hkid1 = winform.reghotkey(function(id,mod,vk){
  27. //editCard 热键 用M激活
  28.        
  29.         winform.editGoods.show(false)
  30.         winform.editCard.show(true)

  31.         win.setForeground(winform.hwnd)
  32.         winform.editCard.setFocus()
  33.        
  34.        
  35.        
  36.        
  37. }
  38. ,0x2/*_MOD_CONTROL*/,'M'#);


  39. hkid2 = winform.reghotkey(function(id,mod,vk){
  40. //editGoods 热键
  41.         winform.editCard.show(false)
  42.         winform.editGoods.show(true)
  43.         win.setForeground(winform.hwnd)
  44.         winform.editGoods.setFocus()
  45.        
  46. }
  47. ,0x2/*_MOD_CONTROL*/,'D'#);



  48. var atom,hwnd = winform.atom("E9F88383-D4D9-4BF3-A617-88DB308B0E70");
  49. if(!atom){
  50.         /*为窗口设置原子值可以避免一个程序重复运行多个实例*/
  51.         win.quitMessage();        return;
  52. }


  53. //退出按钮
  54. winform.picturebox3.oncommand = function(id,event){
  55.         //winform.msgbox( winform.picturebox3.text );
  56.         winform.close()
  57.        
  58. }

  59. winform.editCard.oncommand = function(id,event){
  60. //响应回车事件       
  61.         console.log("会员事件")
  62.        
  63.     if( event=== 0/*_BN_CLICKED*/){
  64.         winform.msgbox( winform.editCard.text,"会员事件")
  65.         winform.editCard.setFocus()

  66.     }
  67. }


  68. winform.editGoods.oncommand = function(id,event){
  69. //响应回车事件       
  70.         console.log("商品事件")
  71.        
  72.     if( event=== 0/*_BN_CLICKED*/){
  73.         winform.msgbox( winform.editGoods.text,"商品")
  74.         winform.editGoods.setFocus()

  75.     }
  76. }


  77. winform.wndproc = {
  78.         [ 0x201/*_WM_LBUTTONDOWN*/ ] = function(hwnd,message,wParam,lParam){
  79.                 winform.hitCaption();
  80.                 console.dump(winform.getRect(true))
  81.                 //console.log("拖动了窗口")
  82.         }
  83. }


  84. //创建圆角窗体
  85. import win.region.round;
  86. win.region.round(winform)  
  87. winform.show(true)

  88. win.setTopmost(winform.hwnd)//置顶
  89. win.setForeground(winform.hwnd)//可以输入
  90. win.setPos(winform.hwnd,win.getScreen()-400,30,,)//改变位置


  91. win.loopMessage();

复制代码

166

主题

2154

回帖

1万

积分

管理员

积分
13056
发表于 2017-11-7 10:48:57 | 显示全部楼层
“按照你的想法来” --- 具体指的是什么想法?!
“另外一个获取不到回车事件” -- 这里的“另外一个”具体指的是什么?!
“就是用那个快捷键” -- 这里的“那个快捷键” 具体指的是哪一个?!

你发的源代码我扫了一眼,看到的全是跟你问题无关的阴影、圆角、原子窗体这些代码,
能不能在提问前,稍微的整理一下去掉无关代码呢?!

关于回车键,直接在论坛搜索“回车” 能找到许多的帖子,
回车是对话框快捷键,是由窗体来响应,不是控件来响应。

8

主题

34

回帖

273

积分

二级会员

积分
273
发表于 2017-11-7 11:22:55 | 显示全部楼层
梳理了一下楼主的代码,猜测了一下楼主的意图,写了个例子,看是不是楼主想要的效果

import win.ui;
import console
/*DSG{{*/
var winform = win.form(text="aardio form";right=759;bottom=469)
winform.add(
edit={cls=
"edit";left=65;top=79;right=504;bottom=99;edge=1;multiline=1;z=1};
edit2={cls=
"edit";left=63;top=111;right=502;bottom=131;edge=1;multiline=1;z=2}
)
/*}}*/

winform.edit.wndproc =
function(hwnd,msg,wParam,lParam){
   
if(msg == 0x100/*键盘*/){
        
//console.log(..string.format("0x%x", msg), ..string.format("0x%x", wParam), ..string.format("0x%x", lParam))
        if(wParam == 0xd/*回车键*/){
            winform.msgbox(
"会员事件")
        }
    }
}
winform.edit2.wndproc =
function(hwnd,msg,wParam,lParam){
   
if(msg == 0x100/*键盘*/){
        
if(wParam == 0xd/*回车键*/){
            winform.msgbox(
"商品事件")
        }
    }
}

/*热键{{*/
import key.hotkey
//ctrl+d键
var hotkey = key.hotkey(winform)
hotkey.reg(
   
"ctrl", "d",
   
function(hwnd,...){
        winform.edit.setFocus()
    }
)

//ctrl+m键
hotkey.reg(
   
"ctrl", "m",
   
function(hwnd,...){
        winform.edit2.setFocus()
    }
)
/*}}*/

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

166

主题

2154

回帖

1万

积分

管理员

积分
13056
发表于 2017-11-7 13:41:03 | 显示全部楼层
土冒 发表于 2017-11-7 11:22
梳理了一下楼主的代码,猜测了一下楼主的意图,写了个例子,看是不是楼主想要的效果

import win.ui;

有些控件是不响应回车的,
关键看 _WM_GETDLGCODE 消息怎么应答,可以看plus控件中这个消息的处理,plus默认不接收回车。

回车默认是发给对话框的的快捷键,用 winform.isDialogMessage winform.preTranslateAccelerator winform.translateAccelerator win.ui.accelerator 这些来响应快捷键

一个简单的方法是,右键点plus控件,排序到最后面,回车就可以触发该控件的事件了。
或者直接输入 winform.isDialogMessage 会生成演示的代码。

可以论坛里搜一下“回车”

我还没有很明白楼主的目的,代码就不写了。

8

主题

34

回帖

273

积分

二级会员

积分
273
发表于 2017-11-7 15:59:30 | 显示全部楼层
多谢版主指正,当时看了楼主的代码就随手写了段测试一看没毛病就发上来了,现在回头看去掉了文本框的多行属性就不行了,plus控件也是。嗯,又多了一个知识点,奉上修正过的代码:

import win.ui;
import console
/*DSG{{*/
var winform = win.form(text="aardio form";right=759;bottom=469)
winform.add(
edit={cls=
"edit";left=65;top=79;right=504;bottom=99;edge=1;multiline=1;z=2};
edit2={cls=
"edit";left=63;top=111;right=502;bottom=131;edge=1;z=3};
plus={cls=
"plus";left=76;top=205;right=540;bottom=259;bgcolor=32768;notify=1;z=1}
)
/*}}*/

winform.edit.wndproc =
function(hwnd,msg,wParam,lParam){
   
if(msg == 0x100/*键盘*/){
        
if(wParam == 0xd/*回车键*/){
            winform.msgbox(
"edit会员事件")
            
owner.setFocus()
        }
    }
}
winform.edit2.wndproc =
function(hwnd,msg,wParam,lParam){
   
if(msg == 0x100/*键盘*/){
        
if(wParam == 0xd/*回车键*/){
            winform.msgbox(
"edit2商品事件")
            
owner.setFocus()
        }
    }
}
winform.plus.wndproc =
function(hwnd,message,wParam,lParam){
   
if(message == 0x100/*键盘*/){
        
if(wParam == 0xd/*回车键*/){
            winform.msgbox(
"plus事件")
            
owner.setFocus()
        }
    }
}

//**
winform.isDialogMessage = function(hwnd,msg){
   
if(  msg.wParam == 0xD/*_VK_RETURN*/ ){
        
return false;
    }
   
return win.isDialogMessage(hwnd,msg);
}
//**/

/*热键{{*/
import key.hotkey
var hotkey = key.hotkey(winform)
//ctrl+d键
hotkey.reg(
   
"ctrl", "d",
   
function(hwnd,...){
        winform.edit.setFocus()
    }
)
//ctrl+m键
hotkey.reg(
   
"ctrl", "m",
   
function(hwnd,...){
        winform.edit2.setFocus()
    }
)
//ctrl+a键
hotkey.reg(
   
"ctrl", "a",
   
function(hwnd,...){
        winform.plus.setFocus()
    }
)
/*}}*/

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

166

主题

2154

回帖

1万

积分

管理员

积分
13056
发表于 2017-11-7 16:08:44 | 显示全部楼层
土冒 发表于 2017-11-7 15:59
多谢版主指正,当时看了楼主的代码就随手写了段测试一看没毛病就发上来了,现在回头看去掉了文本框的多行属 ...

回车触发plus事件,这样也可以:
import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio form";right=759;bottom=469)
winform.add(
button={cls=
"button";text="button";left=504;top=264;right=640;bottom=320;z=1};
plus={cls=
"plus";text="回车触发";left=216;top=120;right=456;bottom=192;notify=1;z=2}
)
/*}}*/

winform.plus.oncommand =
function(id,event){
    winform.msgbox(
"plus,回车")
}

winform.isDialogMessage =
function(hwnd,msg){

   
if(  msg.wParam == 0xD/*_VK_RETURN*/ ){
        
if( msg.message == 0x100/*_WM_KEYDOWN*/)
            winform.plus.oncommand();
            
        
return true;
    }
   
return win.isDialogMessage(hwnd,msg);
}

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


166

主题

2154

回帖

1万

积分

管理员

积分
13056
发表于 2017-11-7 16:11:11 | 显示全部楼层
Jacen.He 发表于 2017-11-7 16:08
回车触发plus事件,这样也可以:

这样写也可以:
import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio form";right=759;bottom=469)
winform.add(
button={cls=
"button";text="button";left=504;top=264;right=640;bottom=320;z=1};
plus={cls=
"plus";text="回车触发";left=216;top=120;right=456;bottom=192;notify=1;z=2}
)
/*}}*/

winform.plus.oncommand =
function(id,event){
    winform.msgbox(
"plus,回车")
}

//添加快捷键
import win.ui.accelerator;
win.ui.accelerator({
    {  vkey = 0xD
/*_VK_RETURN*/; oncommand = winform.plus.oncommand }  
},winform);


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


166

主题

2154

回帖

1万

积分

管理员

积分
13056
发表于 2017-11-7 16:16:25 | 显示全部楼层
可以看一下 win.loopMessage  处理按键的这一段源码:
        if( frm  ){   
            
var message = msg.message;
            
if( (message <= 0x108/*_WM_KEYLAST*/) && (message >= 0x100/*_WM_KEYFIRST*/) ){
               
var ctrl = frm;
               
if( msg.hwnd != frm.hwnd ){
                    ctrl = frm.getCtrl(msg.hwnd) : frm;
                }
               
               
if( frm[["preTranslateAccelerator"]] && frm.preTranslateAccelerator(msg) )
                        
return true;
                        
               
if( ctrl[["translateAccelerator"]] && ctrl.translateAccelerator(msg) )
                        
return true;
               
               
if( ctrl[["isDialogMessage"]] ){
                    
if( ctrl.isDialogMessage( frm.hwnd,msg ) )
                        
return true;
                }
               
elseif( frm[["isDialogMessage"]] && frm.isDialogMessage( frm.hwnd,msg ) )
                    
return true;
            }

            
if( frm[["pretranslate"]] && frm.pretranslate(msg) )
               
return true;
        }
再看看 win.ui.accelerator 里面的关键源码:

                winform.preTranslateAccelerator = function(msg){
                        if( TranslateAccelerator(hwnd,this.handle,msg) ){
                                return true;
                        }
                }
如果按键被这些检查快捷键的函数事先拦截,就不会再发送给控件。

166

主题

2154

回帖

1万

积分

管理员

积分
13056
发表于 2017-11-7 16:23:43 | 显示全部楼层
参考下:aardio范鲍->Windows窗口应用->快捷键 这下面的源代码演示

8

主题

34

回帖

273

积分

二级会员

积分
273
发表于 2017-11-7 17:12:55 | 显示全部楼层
Jacen.He 发表于 2017-11-7 16:23
参考下:aardio范鲍->Windows窗口应用->快捷键 这下面的源代码演示

多谢版主,回头得好好研究、吸收下。。。
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

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

GMT+8, 2025-6-4 22:13 , Processed in 0.084569 second(s), 22 queries .

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

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