今回のアプリケーションを動作させるためには、Visual Studio 2005のカタログから以下のアイテムを追加する必要があります。
「コアOS」→「CEBASE」→「シェルおよびユーザーインターフェイス」→「ユーザーインターフェイス」→「Silverlight for Windows Embedded」(SYSGEN_XAML_RUNTIME)
また、上記以外にイメージを取り扱うため、イメージデコーダのカタログを以下のように追加する必要があります。
「コアOS」→「CEBASE」→「グラフィックス技術とマルチメディア技術」→「グラフィックス」→「イメージング」→「静止画像デコーダ」より、利用するイメージフォーマットのデコーダをあらかじめ追加しておく必要があります。
今回はPlatform Builderのワークスペースからサブプロジェクトを作成する流れでアプリケーションを作成していきます。
OSイメージを作成するPlatform BuilderのワークスペースをVisual Studio 2005上で開きます。そして、「ソリューション エクスプローラ」のツリーから「サブプロジェクト」を右クリックして、ショートカットメニューの[新しいサブプロジェクトの追加]を選択します。すると、[Windows Embedded CE サブプロジェクト ウィザード]ダイアログが表示されます。
ここで「使用可能なテンプレート」から「WCE アプリケーション」を選択し、サブプロジェクト名に“XAMLTest”を入力して[次へ]ボタンを押します。次のダイアログでは、「シンプルなWindows Embedded CE アプリケーション」を選択して、[完了]ボタンを押します。
ウィザードの入力が完了すると、「ソリューション エクスプローラ」のツリーにある「サブプロジェクト」以下に、「XAMLTest」アプリケーションが追加されます。
| 関連リンク: | |
|---|---|
| ⇒ | Windows Embedded CEアプリケーション開発手法 |
続いて、以下のサンプルコード1を、先ほど作成した「XAMLTest」アプリケーションのソースファイル「XAMLTest.cpp」に実装します。
#include "stdafx.h"
#include "pwinuser.h"
#include "xamlruntime.h"
#include "xrdelegate.h"
#include "xrptr.h"
#include "resource.h"
IXRVisualHostPtr g_vhost;
IXRStoryboardPtr g_pStoryboard;
class BtnEventHandler
{
public:
HRESULT OnClickStart(IXRDependencyObject* source,XRMouseButtonEventArgs* args)
{
g_pStoryboard->Begin();
return S_OK;
}
HRESULT OnClickExit(IXRDependencyObject* source,XRMouseButtonEventArgs* args)
{
g_vhost->EndDialog(0);
return S_OK;
}
};
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
HRESULT retcode;
IXRApplicationPtr app;
if (!XamlRuntimeInitialize())
return -1;
if (FAILED(retcode=GetXRApplicationInstance(&app)))
return -1;
if (FAILED(retcode=app->AddResourceModule(hInstance)))
return -1;
XRWindowCreateParams wp;
ZeroMemory(&wp, sizeof(XRWindowCreateParams));
wp.Style = WS_OVERLAPPED;
wp.pTitle = L"XAMLTest";
wp.Left = 0;
wp.Top = 0;
XRXamlSource xamlsrc;
xamlsrc.SetFile(TEXT("\\windows\\Page.xaml"));
//Host XAMLの作成
if (FAILED(retcode=app->CreateHostFromXaml(&xamlsrc, &wp, &g_vhost)))
{
MessageBox(NULL,TEXT("Error CreateHostFromXaml()"),
TEXT("XAMLTest"),MB_OK);
return -1;
}
IXRFrameworkElementPtr root;
//ルートエレメントの作成
if (FAILED(retcode=g_vhost->GetRootElement(&root)))
{
return -1;
}
IXRButtonBasePtr btnStart;
IXRButtonBasePtr btnExit;
//名前からオブジェクト取得
if (FAILED(retcode=root->FindName(TEXT("MyButtonStart"), &btnStart)))
{
return -1;
}
if (FAILED(retcode=root->FindName(TEXT("MyButtonExit"), &btnExit)))
{
return -1;
}
if (FAILED(retcode=root->FindName(TEXT("Storyboard1"), &g_pStoryboard)))
{
return -1;
}
IXRDelegate<XRMouseButtonEventArgs>* clickdelegateStart;
IXRDelegate<XRMouseButtonEventArgs>* clickdelegateExit;
BtnEventHandler handler;
//Start Clik Event
if (FAILED(retcode=CreateDelegate(&handler,&BtnEventHandler::OnClickStart,
&clickdelegateStart)))
{
return -1;
}
if (FAILED(retcode=btnStart->AddClickEventHandler(clickdelegateStart)))
{
return -1;
}
//Exit Clik Event
if (FAILED(retcode=CreateDelegate(&handler,&BtnEventHandler::OnClickExit,
&clickdelegateExit)))
{
return -1;
}
if (FAILED(retcode=btnExit->AddClickEventHandler(clickdelegateExit)))
{
return -1;
}
UINT exitcode;
if (FAILED(retcode=g_vhost->StartDialog(&exitcode)))
{
return -1;
}
clickdelegateStart->Release();
clickdelegateExit->Release();
XamlRuntimeUninitialize();
return 0;
}
| サンプルコード1 |
ここで、簡単にサンプルコード1の内容を補足します。
class BtnEventHandler
{
public:
HRESULT OnClickStart(IXRDependencyObject* source,XRMouseButtonEventArgs* args)
{
g_pStoryboard->Begin();
return S_OK;
}
HRESULT OnClickExit(IXRDependencyObject* source,XRMouseButtonEventArgs* args)
{
g_vhost->EndDialog(0);
return S_OK;
}
};
上記のコードは、Blend2上で追加したボタン押下時のイベントハンドラの定義です。[Start]ボタン押下時に作成したStoryboardの再生を開始し、[Exit]ボタン押下時にダイアログを閉じるように実装しています。後ほど解説する「WinMain」内での初期化処理内でこのイベントハンドラを登録します。
HRESULT retcode;
IXRApplicationPtr app;
if (!XamlRuntimeInitialize())
return -1;
if (FAILED(retcode=GetXRApplicationInstance(&app)))
return -1;
if (FAILED(retcode=app->AddResourceModule(hInstance)))
return -1;
上記のコードでは、Silverlight for Windows Embeddedの初期化を行っています。Silverlight for Windows Embeddedを利用するアプリケーションは、必ず上記のコードを実行しなければなりません。
IXRButtonBasePtr btnStart;
IXRButtonBasePtr btnExit;
//名前からオブジェクト取得
if (FAILED(retcode=root->FindName(TEXT("MyButtonStart"), &btnStart)))
{
return -1;
}
if (FAILED(retcode=root->FindName(TEXT("MyButtonExit"), &btnExit)))
{
return -1;
}
if (FAILED(retcode=root->FindName(TEXT("Storyboard1"), &g_pStoryboard)))
{
return -1;
}
上記コードは、XAML上に定義されているボタンやStoryboardのオブジェクトをC++コードからアクセスするために「FindName」メソッドを利用して、オブジェクトを取得しています。
BtnEventHandler handler;
//Start Click Event
if (FAILED(retcode=CreateDelegate(&handler,&BtnEventHandler::OnClickStart,
&clickdelegateStart)))
{
return -1;
}
if (FAILED(retcode=btnStart->AddClickEventHandler(clickdelegateStart)))
{
return -1;
}
//Exit Click Event
if (FAILED(retcode=CreateDelegate(&handler,&BtnEventHandler::OnClickExit,
&clickdelegateExit)))
{
return -1;
}
if (FAILED(retcode=btnExit->AddClickEventHandler(clickdelegateExit)))
{
return -1;
}
上記コードは、定義したボタン押下時のイベントハンドラを登録しています。Blend2上でボタンを追加し、C++コードからボタン押下時のアクションを定義したい場合は、このようにハンドラを登録する必要があります。
UINT exitcode;
if (FAILED(retcode=g_vhost->StartDialog(&exitcode)))
{
return -1;
}
一通りの初期化が終わり、「StartDialog」メソッドによりXAMLで定義したUIをダイアログとして表示します。
Copyright © ITmedia, Inc. All Rights Reserved.
よく読まれている編集記者コラム