Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4739984
  • 博文数量: 206
  • 博客积分: 5240
  • 博客等级: 大校
  • 技术积分: 3224
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-12 21:40
文章分类

全部博文(206)

文章存档

2013年(13)

2012年(8)

2011年(33)

2010年(152)

我的朋友

分类:

2010-10-16 19:51:30

例:如何让控件响应左键双击弹出打开文件对话框。
看下面的演示动画



库中源码(win-ui-ctrl-metaProperty)

wndproc = {
/* _get = function(){ 
//只读属性
}*/
_set = function(v){ 
//Remove All
if( v === null){
owner[["wndproc__"]] = null;
return;
};
assert(type(v) == type.function,"消息回调函数必须是一个函数对象!") 
var preProc = owner[["wndproc__"]];
if(preProc){
//Decorate the previous WndProc
owner[["wndproc__"]] = function(...){
var ret = v(...);
if(ret===null)
return preProc(...);
return ret;
}
return;
 
owner[["wndproc__"]] = v;
 
//真正的回调函数只能创建一次
if(owner[["_wndproc_c"]] )
return;
var _defwndpoc_c = 0;
var wndproc = function(hwnd,  message, wParam , lParam){
var result;
var proc = owner[["wndproc__"]];
if(proc)
result = proc( hwnd,  message, wParam , lParam);
if( result  === null ){ //必须用恒等式才能判断是否有返回值(包括false,0等)
return  CallWindowProc( _defwndpoc_c,  hwnd,message, wParam , lParam );
return result;//用户函数中返回了自定义的值
}
owner[["_wndproc_c"]] = ..raw.tostdcall( wndproc ,   ..win.CALLBACK.WNDPROC,owner)
_defwndpoc_c=  ::SetWindowPointer(owner[["hwnd"]],0xFFFFFFFC/*_GWL_WNDPROC*/,  owner[["_wndproc_c"]]  ); 
}
};



响应事件一般指的鼠标单击等, id指的控件ID,基本可以忽略不管,event每个控件都仅有有限的几个,用io.print输出看一下。

你可以任意的拦截消息,不存在控制不了顺序的问题。在winform.wndproc可以拦截所有消息,双击窗体进去就会生成示例代码。

另可以增加 winform.pretranslate (参数定义同win.wndproc) 函数在处理消息以前进行过滤.

在win.loopMessage()里可以增加任意多个函数,用以订阅所有窗口消息。
例如win.loopMessage(拦截消息函数)

但是一般用户不需要了解这么多,根据向导生成的一般够用了  

在设计器中双击控件生成的 oncommand 事件响应函数:一般会被鼠标点击触发、以及控件数据发生改变时触发。有事件发生(例如鼠标从控件上滑过只是一个消息,并没有事件发生)
而右键点击控件,在菜单中点击“消息回调”生成的wndproc函数则可以处理所有消息。
阅读(2936) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~