@{_weak="kv"}//在元表中指定为弱引用,以自动清除不使用的元素
}
varmsg_observer={}
varparseMessage=function(msg){
if(msg_observer[[1]]){
for(k,vinmsg_observer){
varre=v(msg);
if(re!==null){
returnre;
}
}
}
varhwnd=msg.hwnd;
if(hwnd&&..win.ui){
varwinform=mapforms[hwnd]
if(winform===null){
winform=..win.ui.getForm(hwnd)
if(!winform)
mapforms[hwnd]=false;//标记为false,避免重复查询父窗口
else
mapforms[hwnd]=winform;
}
if(winform){
if(winform.pretranslate&&winform.pretranslate(msg))
returntrue;
if((msg.message>=0x100/*_WM_KEYFIRST*/)&&(msg.message0)
{
if(msg.message==0x12){
quitMessage();
returnnull;
}
parseMessage(msg);
}
sleep(1)
}
/*
启动消息循环,即使重复调用此函数,一个线程仅启动一个循环。
参数:
observer消息观察函数,可以为null
attach为true则注册observer函数,为false则注销observer函数
*/
loopMessage=function(observer,attach=true){//启动消息循环,参数为主窗体
if(type(observer)==type.function){
if(!attach){
for(i=#msg_observer;1){
if(msg_observer[i]==observer){
..table.remove(msg_observer,i);
returntrue;
}
}
returnfalse;
}
..table.push(msg_observer,observer);
}
//排重
if(msgloop)return;
msgloop=true;
..win.closed=null;
varmsg=::MSG();
while(getMessage(msg,0,0,0)>0)//GetMessage()函数会返回0,非0和-1。其中-1表示由于hWnd不是有效的窗口句柄等原因而出错。
{
parseMessage(msg);
}
msgloop=false;
..win.closed=true;
mapforms={};//清空缓存里的所有窗口对象
returntrue;
}
quitMessage=function(){
::PostThreadMessage(..thread.getId(),0x12/*_WM_QUIT*/,0,0);
..win.closed=true;
}
vartime_tick=..time.tick;
delay=function(nTimeMs=0){
varmsg=::MSG();
varendTick=time_tick()+nTimeMs;
while(time_tick()
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-30959-6.html
有没有人更新了指纹进不去
在叙利亚丢了面子