前回の記事では、Silverlight for Windows embedded用アプリの
プロジェクト『SLDemoApp』を作成しました。
今回は、前々回作成したGUIを表示するコードを作成します。
簡単なコードの流れは
・Silverlightエンジンの初期化
↓
・XAMLデータ元の設定
↓
・表示するWindowの設定
↓
・XAMLデータを使ってWindowを表示開始
といった感じです。
※説明のために、エラー処理等を省いていますので、
お気を付けください。
①まずは『SLDemoApp』プロジェクト内にある、
SLDemoApp.cppファイルを開いてください。
Silverlight for WEの機能を使うために、
関連ヘッダをincludeします。
#include <pwinuser.h>
#include <XamlRuntime.h>
#include <xrdelegate.h>
#include <xrptr.h>
②WinMain関数に、Silverlight for WEを使うためのコードを
記述していきます。
まずは、Silverlgiht for WEのエンジンを初期化します。
XamlRuntimeInitialize();
③XAMLデータ元を指定します。
ここでは、前々回作成したXAMLファイルがデータ元なので、
SetFile関数を使用して、ファイルを指定します。
ファイルは、ルートフォルダにある想定です。
XRXamlSource XamlSource;
XamlSource.SetFile(TEXT("SLDemoAPPGUI.xaml"));
④XAMLで作成したGUIを表示する際の
Windowのパラメータを指定します。
Win32APIでWindowを表示する際にも
同じようなことをしますよね。
XRWindowCreateParams WindowsParam;
// 変数初期化(お忘れなく)
memset(&WindowsParam,0x00,sizeof(WindowsParam));
// Window タイトルの設定
WindowsParam.pTitle = TEXT("Silverligh for WE Demo Application");
// Window スタイルの設定
WindowsParam.Style = WS_POPUP;
// Windowの表示位置指定
WindowsParam.Left = 0;
WindowsParam.Top = 0;
⑤上記の③、④での設定を使って、
XAMLファイルでのGUI表示を開始します。
ここからは少しだけややこしいです。
アプリケーションオブジェクト(IXRApplicationのインスタンス)を取得します。
このオブジェクトは、プロセス毎に一つ生成されるそうです。
IXRApplicationPtr pAppPtr;
hRes = GetXRApplicationInstance(&pAppPtr);
取得したインスタンスから、XAMLファイルデータからWindowを表示したり、
XAMLの構造を解析する、ホストオブジェクトを生成します。
IXRVisualHostPtr pHostPtr;
pAppPtr->CreateHostFromXaml(&XamlSource,&WindowsParam,&pHostPtr);
そして、Window(ダイアログ)の表示を開始します。
この関数は同期処理のようですね。
MFCのDoModal関数のようなものでしょうか。
uiRetにはWindowを閉じたときの終了コードが入ります。
UINT uiRet = 0;
pHostPtr->StartDialog(&uiRet);
実装は以上です。
これだけでXAMLファイルの表示ができます。
といっても、ホントに表示だけで、
このままだと終了処理もないので
強制終了以外にWindowを閉じれないですが(笑)。
早速ビルドすると、
・・・ビルドが失敗しました
2か所ほど追記が必要です。
⑥ビルドして、以下のようなエラーが出る場合
fatal error C1083: Cannot open include file: 'pwinuser.h': No such file or directory
単純にincludeのパスが通っていないだけだと思います。
SLDemoAppのプロジェクトフォルダ内にあるSourcesファイルに
以下の記述を追加してみてください。
INCLUDES= $(_WINCEROOT)publiccommonoakinc;
⑦ビルドして、以下のようなリンクエラーが出る場合
error LNK2019: unresolved external symbol GetXRApplicationInstance referenced in function WinMain
参照するライブラリファイルが足りていません。
SLDemoAppのプロジェクトフォルダ内にあるSourcesファイルの
項目[TARGETLIBS]に、
・xamlruntime.lib
・uuid.lib
を追記してみてください。
TARGETLIBS=
・・・・・・
$(_PROJECTROOT)cesysgensdklib$(_CPUINDPATH)xamlruntime.lib ¥
$(_PROJECTROOT)cesysgensdklib$(_CPUINDPATH)uuid.lib
以上でビルドが通るかと思います。
次回は、作成したアプリをデバイスエミュレータ上で
動作させてみようと思います。
プロジェクト『SLDemoApp』を作成しました。
今回は、前々回作成したGUIを表示するコードを作成します。
簡単なコードの流れは
・Silverlightエンジンの初期化
↓
・XAMLデータ元の設定
↓
・表示するWindowの設定
↓
・XAMLデータを使ってWindowを表示開始
といった感じです。
※説明のために、エラー処理等を省いていますので、
お気を付けください。
①まずは『SLDemoApp』プロジェクト内にある、
SLDemoApp.cppファイルを開いてください。
Silverlight for WEの機能を使うために、
関連ヘッダをincludeします。
#include <pwinuser.h>
#include <XamlRuntime.h>
#include <xrdelegate.h>
#include <xrptr.h>
②WinMain関数に、Silverlight for WEを使うためのコードを
記述していきます。
まずは、Silverlgiht for WEのエンジンを初期化します。
XamlRuntimeInitialize();
③XAMLデータ元を指定します。
ここでは、前々回作成したXAMLファイルがデータ元なので、
SetFile関数を使用して、ファイルを指定します。
ファイルは、ルートフォルダにある想定です。
XRXamlSource XamlSource;
XamlSource.SetFile(TEXT("SLDemoAPPGUI.xaml"));
④XAMLで作成したGUIを表示する際の
Windowのパラメータを指定します。
Win32APIでWindowを表示する際にも
同じようなことをしますよね。
XRWindowCreateParams WindowsParam;
// 変数初期化(お忘れなく)
memset(&WindowsParam,0x00,sizeof(WindowsParam));
// Window タイトルの設定
WindowsParam.pTitle = TEXT("Silverligh for WE Demo Application");
// Window スタイルの設定
WindowsParam.Style = WS_POPUP;
// Windowの表示位置指定
WindowsParam.Left = 0;
WindowsParam.Top = 0;
⑤上記の③、④での設定を使って、
XAMLファイルでのGUI表示を開始します。
ここからは少しだけややこしいです。
アプリケーションオブジェクト(IXRApplicationのインスタンス)を取得します。
このオブジェクトは、プロセス毎に一つ生成されるそうです。
IXRApplicationPtr pAppPtr;
hRes = GetXRApplicationInstance(&pAppPtr);
取得したインスタンスから、XAMLファイルデータからWindowを表示したり、
XAMLの構造を解析する、ホストオブジェクトを生成します。
IXRVisualHostPtr pHostPtr;
pAppPtr->CreateHostFromXaml(&XamlSource,&WindowsParam,&pHostPtr);
そして、Window(ダイアログ)の表示を開始します。
この関数は同期処理のようですね。
MFCのDoModal関数のようなものでしょうか。
uiRetにはWindowを閉じたときの終了コードが入ります。
UINT uiRet = 0;
pHostPtr->StartDialog(&uiRet);
実装は以上です。
これだけでXAMLファイルの表示ができます。
といっても、ホントに表示だけで、
このままだと終了処理もないので
強制終了以外にWindowを閉じれないですが(笑)。
早速ビルドすると、
・・・ビルドが失敗しました
2か所ほど追記が必要です。
⑥ビルドして、以下のようなエラーが出る場合
fatal error C1083: Cannot open include file: 'pwinuser.h': No such file or directory
単純にincludeのパスが通っていないだけだと思います。
SLDemoAppのプロジェクトフォルダ内にあるSourcesファイルに
以下の記述を追加してみてください。
INCLUDES= $(_WINCEROOT)publiccommonoakinc;
⑦ビルドして、以下のようなリンクエラーが出る場合
error LNK2019: unresolved external symbol GetXRApplicationInstance referenced in function WinMain
参照するライブラリファイルが足りていません。
SLDemoAppのプロジェクトフォルダ内にあるSourcesファイルの
項目[TARGETLIBS]に、
・xamlruntime.lib
・uuid.lib
を追記してみてください。
TARGETLIBS=
・・・・・・
$(_PROJECTROOT)cesysgensdklib$(_CPUINDPATH)xamlruntime.lib ¥
$(_PROJECTROOT)cesysgensdklib$(_CPUINDPATH)uuid.lib
以上でビルドが通るかと思います。
次回は、作成したアプリをデバイスエミュレータ上で
動作させてみようと思います。