先日の記事では、作成したSilverlight for WEのサンプルアプリを
デバイスエミュレータ上で動作させてみました。
今回は、ボタンのクリックイベントハンドラ(クリックされた時の処理)を実装します。
手順は以下のような感じです。
・イベント処理用の関数をクラスのパブリックメンバとして作成する。
↓
・CreateDelegate関数を使用して、デリゲートを作成する。
↓
・ホストオブジェクトから、GetRootElement関数を使用して
XAMLのルートエレメントを取得。
↓
・ルートエレメントから、イベント処理を実装したいオブジェクトを取得。
↓
・AddClickEventHandler関数により、イベント処理のデリゲートを
オブジェクトに登録する。
コードと一緒に確認していきます。
※説明簡略化のため、エラー処理を省いていますので、
お気を付けください。
①イベント処理用の関数を作成する。
クラスを定義し、そのパブリックメンバ関数として、
クリックイベントハンドラを実装します。
class CMyEventHandler
{
public:
HRESULT Click(IXRDependencyObject* source,XRMouseButtonEventArgs* args)
{
return S_OK;
}
}
クリックイベントハンドラは関数の型が決まっています。
戻り値はHRESULT型。
引数として、IXRDependencyObject型ポインタと
XRMouseButtonEventArgs型ポインタをとります。
今回のサンプルアプリでは、
ボタンをクリックしたら、ダイアログ(画面)を閉じるようにしようと
思います。
ダイアログを閉じるには、EndDialog関数を呼ぶ必要がありますが、
この関数はIXRVisualHostクラスのメンバ関数なので、
クラスにIXRVisualHostクラスのオブジェクトを保持する仕組みを作成します。
class CMyEventHandler
{
public:
CMyEventHandler()
{
// メンバ変数を初期化
m_pHostPtr = NULL;
}
HRESULT Click(IXRDependencyObject* source,XRMouseButtonEventArgs* args)
{
// ダイアログを閉じる
m_pHostPtr->EndDialog(1);
return S_OK;
}
SetHostPtr(IXRVisualHostPtr pHostPtr)
{
// ホストオブジェクトのアドレスを保存
m_pHostPtr = pHostPtr;
}
private:
IXRVisualHostPtr m_pHostPtr;
};
EndDialog関数を使用すると、ダイアログが閉じられ、
ダイアログを表示開始する関数であるStartDialog関数から抜けてきます。
その時、EndDialog関数の引数で指定した値が、
StartDialog関数の引数で指定したバッファに格納されています。
このサンプルソースでは、とりあえず1を渡していますが、
特に意味はありません。
②デリゲートの作成
先ほど作成したクラスのインスタンスを生成し、
デリゲートを作成します。
C#でのプログラミング経験がある方は、
デリゲートをご存知だと思います。
関数ポインタに近いイメージです。
ここでは、マウス操作イベント用関数型 XRMouseButtonEventArgs型で
デリゲートを作成します。
WinMain関数でホストオブジェクトを生成後、
以下のような処理を追加してください。
CMyEventHandler objEventHandler;
IXRDelegate<XRMouseButtonEventArgs>* pClickdelegate;
CreateDelegate(&objEventHandler, &CMyEventHandler::Click, &pClickdelegate);
これで、デリゲートオブジェクトが生成され、
そのデリゲートにCMyEventHandlerクラスのClick関数が登録されました。
③XAMLのルートエレメントを取得。
XAMLにより生成されたGUIの各要素にアクセスするための準備作業です。
ホストオブジェクトのGetRootElement関数で、
ルートエレメントオブジェクトを取得します。
IXRFrameworkElementPtr pRoot;
pHostPtr->GetRootElement(&pRoot);
GUIの各要素にアクセスするには、
さらにこのルートエレメントから各要素のオブジェクトを取得します。
④イベント処理を実装したいオブジェクトを取得。
「Silverlight for Windows embedded でアプリを作る - 2 -」でGUIを作成しましたが、
ボタンは『btn001』という名前をつけています。
先ほど取得したルートエレメントのFindName関数を使用して、
『btn001』という名前のボタンオブジェクトを取得します。
IXRButtonBasePtr pObjBtn;
pRoot->FindName(TEXT("btn001"),&pObjBtn);
ボタンオブジェクトはIXRButtonBase型です。
⑤イベント処理のデリゲートを登録
②で作成したデリゲートを、
④で取得したボタンオブジェクトに登録します。
クリックイベントハンドラの登録には、
AddClickEventHandler関数を使用します。
pObjBtn->AddClickEventHandler(pClickdelegate);
基本的なクリックイベントハンドラの追加方法は、
以上のように実装できます。
なお、このサンプルでは、クリックイベント時にダイアログを閉じる際、
ホストオブジェクトを使用しますので、
①で作成したイベントハンドラを定義したクラスの
StartDialog関数を呼ぶ前に、SetHostPtr関数をコールして
ホストオブジェクト情報をクラスに渡しておいてください。
objEventHandler.SetHostPtr(pHostPtr);
実装は以上になりますので、
Silverlight for Windows embedded でアプリを作る - 5 -同様、
デバイスエミュレータで動作を確認してください。
デバイスエミュレータ上で動作させてみました。
今回は、ボタンのクリックイベントハンドラ(クリックされた時の処理)を実装します。
手順は以下のような感じです。
・イベント処理用の関数をクラスのパブリックメンバとして作成する。
↓
・CreateDelegate関数を使用して、デリゲートを作成する。
↓
・ホストオブジェクトから、GetRootElement関数を使用して
XAMLのルートエレメントを取得。
↓
・ルートエレメントから、イベント処理を実装したいオブジェクトを取得。
↓
・AddClickEventHandler関数により、イベント処理のデリゲートを
オブジェクトに登録する。
コードと一緒に確認していきます。
※説明簡略化のため、エラー処理を省いていますので、
お気を付けください。
①イベント処理用の関数を作成する。
クラスを定義し、そのパブリックメンバ関数として、
クリックイベントハンドラを実装します。
class CMyEventHandler
{
public:
HRESULT Click(IXRDependencyObject* source,XRMouseButtonEventArgs* args)
{
return S_OK;
}
}
クリックイベントハンドラは関数の型が決まっています。
戻り値はHRESULT型。
引数として、IXRDependencyObject型ポインタと
XRMouseButtonEventArgs型ポインタをとります。
今回のサンプルアプリでは、
ボタンをクリックしたら、ダイアログ(画面)を閉じるようにしようと
思います。
ダイアログを閉じるには、EndDialog関数を呼ぶ必要がありますが、
この関数はIXRVisualHostクラスのメンバ関数なので、
クラスにIXRVisualHostクラスのオブジェクトを保持する仕組みを作成します。
class CMyEventHandler
{
public:
CMyEventHandler()
{
// メンバ変数を初期化
m_pHostPtr = NULL;
}
HRESULT Click(IXRDependencyObject* source,XRMouseButtonEventArgs* args)
{
// ダイアログを閉じる
m_pHostPtr->EndDialog(1);
return S_OK;
}
SetHostPtr(IXRVisualHostPtr pHostPtr)
{
// ホストオブジェクトのアドレスを保存
m_pHostPtr = pHostPtr;
}
private:
IXRVisualHostPtr m_pHostPtr;
};
EndDialog関数を使用すると、ダイアログが閉じられ、
ダイアログを表示開始する関数であるStartDialog関数から抜けてきます。
その時、EndDialog関数の引数で指定した値が、
StartDialog関数の引数で指定したバッファに格納されています。
このサンプルソースでは、とりあえず1を渡していますが、
特に意味はありません。
②デリゲートの作成
先ほど作成したクラスのインスタンスを生成し、
デリゲートを作成します。
C#でのプログラミング経験がある方は、
デリゲートをご存知だと思います。
関数ポインタに近いイメージです。
ここでは、マウス操作イベント用関数型 XRMouseButtonEventArgs型で
デリゲートを作成します。
WinMain関数でホストオブジェクトを生成後、
以下のような処理を追加してください。
CMyEventHandler objEventHandler;
IXRDelegate<XRMouseButtonEventArgs>* pClickdelegate;
CreateDelegate(&objEventHandler, &CMyEventHandler::Click, &pClickdelegate);
これで、デリゲートオブジェクトが生成され、
そのデリゲートにCMyEventHandlerクラスのClick関数が登録されました。
③XAMLのルートエレメントを取得。
XAMLにより生成されたGUIの各要素にアクセスするための準備作業です。
ホストオブジェクトのGetRootElement関数で、
ルートエレメントオブジェクトを取得します。
IXRFrameworkElementPtr pRoot;
pHostPtr->GetRootElement(&pRoot);
GUIの各要素にアクセスするには、
さらにこのルートエレメントから各要素のオブジェクトを取得します。
④イベント処理を実装したいオブジェクトを取得。
「Silverlight for Windows embedded でアプリを作る - 2 -」でGUIを作成しましたが、
ボタンは『btn001』という名前をつけています。
先ほど取得したルートエレメントのFindName関数を使用して、
『btn001』という名前のボタンオブジェクトを取得します。
IXRButtonBasePtr pObjBtn;
pRoot->FindName(TEXT("btn001"),&pObjBtn);
ボタンオブジェクトはIXRButtonBase型です。
⑤イベント処理のデリゲートを登録
②で作成したデリゲートを、
④で取得したボタンオブジェクトに登録します。
クリックイベントハンドラの登録には、
AddClickEventHandler関数を使用します。
pObjBtn->AddClickEventHandler(pClickdelegate);
基本的なクリックイベントハンドラの追加方法は、
以上のように実装できます。
なお、このサンプルでは、クリックイベント時にダイアログを閉じる際、
ホストオブジェクトを使用しますので、
①で作成したイベントハンドラを定義したクラスの
StartDialog関数を呼ぶ前に、SetHostPtr関数をコールして
ホストオブジェクト情報をクラスに渡しておいてください。
objEventHandler.SetHostPtr(pHostPtr);
実装は以上になりますので、
Silverlight for Windows embedded でアプリを作る - 5 -同様、
デバイスエミュレータで動作を確認してください。