9月13日
应用程序架构维护一个控件栈,只有在控件栈中的控件才能接收键盘事件,接收的顺序按照由压入控件栈时所设的优先级决定。
构造好一个Container,用AddToStackL将其压入控件栈。触发键盘事件,在控件栈中找到这个Container,调用其OfferKeyEventL事件。而这个Container的子控件并没有用AddToStackL压入控件栈,所以需要在Container里适时地调用子控件的OfferKeyEventL,完成默认的键盘动作。这是标准的做法,但道理如此。下面这个代码经常遇到
TKeyResponse CMyContainer::OfferKeyEventL ( const TKeyEvent& aKeyEvent, TEventCode aType )
{
return iListBox->OfferKeyEventL( aKeyEvent, aType );
}
为什么不把控件直接压到控件栈里呢?如果是这样,一是没办决定它们的接收顺序吧,因为无法区分优先级;二是只能按照它们的默认行为处理。
在控件栈中的控件,可以通过调用CCoeAppUi::UpdateStackedControlFlags和CCoeAppUi::HandleStackChanged来决定是否可以接收键盘事件。
iEikonEnv->EikAppUi()->UpdateStackedControlFlags( this, IsNonFocusing() ? ECoeStackFlagRefusesFocus :ECoeStackFlagStandard, ECoeStackFlagRefusesFocus | ECoeStackFlagRefusesAllKeys );
iEikonEnv->EikAppUi()->HandleStackChanged();
并且,从上面代码也可以看出,调用SetFocusing( EFalse )并不会阻止控件接收焦点,虽然帮助文档上是这么写的。调用SetFocusing( EFalse )只是改变了一个标志变量,想阻止控件接收事件还要调用上面的代码或者用RemoveFromStack把控件移出控件栈。
如何阻止控件接收键盘事件
最新推荐文章于 2022-07-21 13:59:57 发布