在某些特殊场合下,需要用到禁止tabs某一项给用户使用的功能。

简单总结一下几种实现方法,并不一定全面,仅供参考。

以下代码都以“批量”设置多项为例(单个的很简单,同理即可),以一个变量保存被禁止的项:

var tbs = win.ui.tabs(winform.nav1,winform.nav2,winform.nav3) ;

tbs.禁止点击的项={1,3} ;

1、简单的将选项设为“禁止”状态,达到鼠标无法点击的效果。

tbs.禁止点击的项={1,3}

for(i=1;#tbs.strips;1){
	tbs.strips[i].disabled = ..table.find(tbs.禁止点击的项,i); 
}

该方法在需要改变被禁止的项时,需要重新设置 tbs.strips[i].disabled 属性。

如将 {1,3} 改为 {1,2} 时:

tbs.禁止点击的项={1,2}

for(i=1;#tbs.strips;1){
	tbs.strips[i].disabled = ..table.find(tbs.禁止点击的项,i); 
}

重要的是,该方法并不安全,容易被用外部工具或代码重置为“可用”状态后再点击,破解简单,所以不建议使用。

2、屏蔽鼠标按下事件,达到鼠标点击无效的效果。

tbs.禁止点击的项={1,3}

for(i=1;#tbs.strips;1){
	tbs.strips[i].wndproc = function(hwnd,message,wParam,lParam){
		if message = 0x201/*_WM_LBUTTONDOWN*/  {
             return ..table.find(tbs.禁止点击的项,i); 
        }
	}
}

该方法比第一种方法安全性高,比较简单、实用。

该方法在需要改变被禁止的项时,只需设置 tbs.禁止点击的项={1,2} 即可,不需要重新设置 tbs.strips[i].wndproc。

但该方法也仅仅是屏蔽了选项卡的“鼠标点击”事件,如果选项卡可以用上一个、下一个等按钮进行切换,或者有快捷键进行切换等复杂操作时,仍旧需要其他额外处理。

当然,如果不嫌麻烦的话,也可以将这些切换选项卡的操作都处理成给对应的 tbs.strips[i] 发送 WM_LBUTTONDOWN 消息,而不是用 selIndex、selStrip、selText、prev()、next() 等进行切换。

如果没有其他切换选项卡的方式,建议采用这种方法。

3、修改tabs实例元表,禁止切换selIndex。

tbs.禁止点击的项={1,3}

tbs@.selIndex1=tbs@.selIndex
tbs@.selIndex={
	_get = function(){
		return 	owner.selIndex1; 		
	}
	_set = function(v){
		if  ..table.find(owner.禁止点击的项,v){
			if #owner.selHistory owner.selHistory[#owner.selHistory].checked=true
			return ;
		}
		owner.selIndex1=v; 
	}

因为该方法是直接从根本上切断selIndex改变的可能性,所以,即使直接用代码 tbs.selIndex=1 都无法进行切换,非常安全,一劳永逸。但因为需要修改tabs实例元表,所以难度稍高,需要对该库有足够的理解。

该方法使用后,对 selIndex、selStrip、selText、prev()、next() 等切换指令均可有效屏蔽。

同样,该方法在需要改变被禁止的项时,只需设置 tbs.禁止点击的项={1,2} 即可,不需要进行其他操作,非常简单。

4、总结:

简单情况下建议用方法2,复杂情况下建议用方法3。

可同时搭配 disabled 使用,在视觉上给人 “禁用” 的明显提示效果。