例:如何让控件响应左键双击弹出打开文件对话框。
看下面的演示动画
库中源码(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函数则可以处理所有消息。
阅读(3018) | 评论(0) | 转发(0) |