コントロールスタック

UI コントロールがコントロールスタックに追加されると、キーイベント (ナビゲーションキーを含む) を取得できるようになります。通常は View のみがそれ自身をコントロールスタックに追加します。 View はキーイベントを、所有する各コンポーネントコントロールに、それぞれの OfferKeyEventL() をコールしてパスします。

以下は、コントロールをコントロールスタックに追加する例です。

void CTestAAppUi::ConstructL()
{
BaseConstructL();
iAppDialog = new (ELeave) CTestADialog;
iAppDialog->SetMopParent(this);
iAppDialog->ExecuteLD( R_TESTA_DIALOG );
AddToStackL( iAppDialog );
}

この例では、 AppUi の ConstructL() がダイアログをコントロールスタックに追加し、キーイベントを受け取れるようにしています。

キーイベントは、コントロールスタック上にあるコントロールにパスされます。この際、キーイベントは、 OfferKeyEventL() によって、最後に追加されたコントロールに最初に提供されます。そのコントロールにとって、そのキーイベントが意味のないものであれば、コントロールは EKeyWasNotConsumed をリターンし、そのキーイベントはコントロールスタック上の次のコントロールにパスされます。

AppUi はコントロールスタック上の最下位に置かれていることに注意してください。他のどのコントロールでも受け取られなかったキーイベントは AppUi にパスされます。

5.4.2 AppUi の生成

AppUi は View を生成しなければなりません。これは ConstructL() メソッドの中で実行されます。

void CContainerAppUi::ConstructL()
{
BaseConstructL();
iAppContainer = new (ELeave) CContainerContainer;
iAppContainer->SetMopParent(this);
iAppContainer->ConstructL( ClientRect() );
AddToStackL( iAppContainer );
}

AppUi が View (コンテナ) を保有し、その ConstructL() をコールして View を生成します。さらに View は、コントロールスタックに追加されます (AddToStackL()) 。つまり、 View はキーイベントを( OfferKeyEventL() を介して) 受け取るわけです。通常は View (最上位のコンテナコントロール) のみがコントロールスタックに追加されます。キーイベントを必要とする他のコントロールは、それぞれの OfferKeyEventL() に対して View からイベントをパスしてもらいます。