aardio 文档
aardio 范例: 窗口程序 - 预处理通知消息
//窗口程序 - 预处理通知消息
import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio form";right=759;bottom=469)
winform.add(
edit={cls="edit";left=301;top=8;right=734;bottom=443;edge=1;multiline=1;z=2};
treeview={cls="treeview";left=18;top=8;right=276;bottom=443;asel=false;bgcolor=16777215;edge=1;z=1}
)
/*}}*/
/********
预处理通知消息属于标准库保留自用的接口,
原则上 aardio 不建议在普通代码中使用此功能。
如果必须要使用,也应当用于编写底层库模块,不可用于一般性代码。
预处理通知消息提供了一个机会可以提前拦截控件的通知消息。
并在 onnotify 事件之前触发。在预处理消息的回调函数中,
返回任何非 null 值会阻止继续调用 onnotify 回调。
如果编写控件库,在控件的属性元表中
必须使用带下划线的 _prenotify 定义预处理通知消息。
例如 win.ui.tooltip 源码中是这样写的:
win.ui.tooltip._metaProperty = ..win.ui.ctrl.metaProperty(
_prenotify = {
[0xFFFFFDF7/*_TTN_SHOW*/] = function(id,code,ptr){
if(owner.onPopupShow)owner.onPopupShow();
};
}
)
但是在控件创建以后,
_prenotify 会被属性元表接管,不再允许直接修改。
这时候应当使用去掉下划线的 prenotify 定义预处理通知消息。
例如 win.ui.explorer 的源码里是这样写的:
this.treeview.prenotify = {
[0xFFFFFFFE/*_NM_CLICK*/] = function(id,code,ptr){
var hItem,flags = this.treeview.hitTest()
if( hItem && this.onClick && ( flags & 6/*_TVHT_ONITEMLABEL | _TVHT_ONITEMICON*/) ){
this.onClick( this.getFilePath(hItem),hItem );
}
};
};
控件的 prenotify 可以被重复赋值,
每次赋值都会与之前定义的 prenotify 合并。
同一个通知代码只能定义一个回调,新的总是覆盖旧的。
_prenotify 或 prenotify 应当总是定义为表对象,
如果将 _prenotify 定义为函数,将不能再通过 prenotify 进行修改预处理通知消息,
如果你是控件库的第一作者,并且清楚所导致的后果,那么你可以这样做。
如果不是清楚的了解自己在做什么,
任何时候都不应当覆盖标准库定义的预处理通知消息。
********/
winform.treeview.onnotify = function(id,code,ptr){
if(code==0xFFFFFFFE/*_NM_CLICK*/){
var hItem,flags = winform.treeview.hitTest()
if( hItem ){
winform.edit.print("winform.treeview.onnotify",winform.treeview.getItemText(hItem));
}
}
}
//在代码提示、库函数文档中都会隐藏这个属性,因为我们并不建议普通用户使用。
winform.treeview.prenotify = {
[0xFFFFFFFE/*_NM_CLICK*/] = function(id,code,ptr){
if(0xFFFFFFFE/*_NM_CLICK*/){
var hItem,flags = winform.treeview.hitTest()
if( hItem ){
winform.edit.print("winform.treeview.prenotify",winform.treeview.getItemText(hItem));
}
}
}
}
winform.treeview.insertItem( {
text = "下面用一个数组指定子节点"; {
{ text = "子节点1" };
{ text = "子节点2" };
{ text = "下面用一个数组指定子节点"; {
"a";"b";"c";{ text = "d" }
}
};
}
} )
winform.show();
win.loopMessage();
Markdown 格式