博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
新建 WinCE7.0 下的 Silverlight 工程
阅读量:4310 次
发布时间:2019-06-06

本文共 23995 字,大约阅读时间需要 79 分钟。

以下文章以  中的工程为基础,这也是我写此文章时一步一步建立的 Silverlight 工程。

1 使用 Microsoft Expression Blend 3 创建一个 Silverlight for Windows Embedded Application 工程,放一个按键控件在窗体上,命名按键然后保存。由于 Microsoft Expression Blend 3 现在只支持生成 C# 的代码,对我们没有什么用,所以我们只用其中的 XAML 文件。
2 VS2008 新建:智能设备->Win32 智能设备项目,选拔一个支持 Silverlight 的SDK。
3 文件 SilverlightHelloWorld.cpp 中,只保留如下代码,其它删除:

1 // SilverlightHelloWorld.cpp : 定义应用程序的入口点。   2 //   3    4    5 #include "stdafx.h"   6 #include "SilverlightHelloWorld.h"   7    8    9   10   11 int WINAPI WinMain(HINSTANCE hInstance,  12                    HINSTANCE hPrevInstance,  13                    LPTSTR    lpCmdLine,  14                    int       nCmdShow)  15 {  16   return 0;  17 }

4 新增加 4 个空文件,内容后面补,分别是: 

App.cpp  App.h  MainPage.cpp  MainPage.h

5 增加文件 XRPack.rules,文件的内容如下:  

6 将 XRPack.rules 增加到工程文件 SilverlightHelloWorld.vcproj 中,修改了两个地方,修改后的内容如下:

......

7 新增文件 SilverlightHelloWorld.xrpack,其内容如下:

# This file is used to generate the rc2 file and baml resources      # Uncomment /C to force xrpack to perform a clean build every time  # /C      # Verbosity can be a value between 1 and 10  /Verbosity=3      /NoResourceCompile  "/TargetRC=WinEmbeddedHelloWorldGenerated.rc2"  "/TargetHeader=WinEmbeddedHelloWorldGenerated.h"  "/Project=..\WinEmbeddedHelloWorld\WinEmbeddedHelloWorld.csproj"

8 修改 stdafx.h ,增加以下内容:

1 // Xaml Runtime Header Files   2 #include 
3 #include
4 #include
5 #include
6 7 8 // IUnknown 9 extern "C" const GUID __declspec(selectany)IID_IUnknown = __uuidof(IUnknown); 10 11 12 // Resource type for XAML files 13 #define RT_XAML L"XAML" 14 15 16 // Application headers 17 #include "App.h" 18 #include "resource.h"

9 将 SilverlightHelloWorld.xrpack 文件增加到工程中 

这样才能自动生成 WinEmbeddedHelloWorldGenerated.rc2 和 WinEmbeddedHelloWorldGenerated.h 文件
10 WinMain() 函数的实现代码如下:

  1. int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpCmdLine,int nCmdShow)  
  2. {  
  3.   App AppInstance;  
  4.   
  5.   
  6.   HRESULT hr = AppInstance.Initialize(hInstance);  
  7.   if(SUCCEEDED(hr))  
  8.   {  
  9.     hr = AppInstance.Run();  
  10.   }  
  11.   
  12.   
  13.   return AppInstance.GetWinMainResultCode();  
  14. }  

 

11 编译,是可以成功的,但还需要根据 XAML 文件的内容来修改 MailPage.cpp 和 MailPage.h。

MailPage.h

 

1 #pragma once   2    3    4 // 
5 class __declspec(uuid("{1756acb7-63be-4a4b-97cf-edc048541e75}")) MainPage 6 : public XRCustomUserControlImpl
7 { 8 QI_IDENTITY_MAPPING(MainPage, XRCustomUserControlImpl) 9 10 11 public: 12 static HRESULT GetXamlSource(__in XRXamlSource* pXamlSource) 13 { 14 HRESULT hr = E_INVALIDARG; 15 16 17 if (pXamlSource) 18 { 19 pXamlSource->SetResource (App::GetHInstance(), IDR_SILVERLIGHTCLOCK_MAINPAGE); 20 hr = S_OK; 21 } 22 23 return hr; 24 } 25 26 27 static HRESULT Register() 28 { 29 return XRCustomUserControlImpl
::Register (__uuidof(MainPage), L"MainPage", L"clr-namespace:SilverlightClock"); 30 } 31 32 33 #pragma region GeneratedCode 34 // ============================================================================ 35 // WARNING: DO NOT EDIT THIS ALWAYS-GENERATED CODE 36 // ============================================================================ 37 HRESULT OnLoaded(__in IXRDependencyObject* pRoot); 38 HRESULT InitializeComponent(); 39 40 41 IXRGridPtr m_pLayoutRoot; // Grid x:Name="LayoutRoot" ... 42 IXRButtonBasePtr m_MyBtn; 43 IXRDelegate
*m_clickDelegate; 44 // ============================================================================ 45 // WARNING: DO NOT EDIT THIS ALWAYS-GENERATED CODE 46 // ============================================================================ 47 #pragma endregion GeneratedCode 48 };

 

MailPage.cpp

1 #include "stdafx.h"   2 #include "SilverlightHelloGenerated.h"   3 #include "MainPage.h"   4 #include "App.h"   5 #include "resource.h"   6    7    8 #define TEST_BTN_CLICK_PROCESS  1   9   10   11 #if TEST_BTN_CLICK_PROCESS  12 class BtnEventHandler  13 {  14 public:  15   HRESULT OnClick(IXRDependencyObject* source,XRMouseButtonEventArgs* args)  16   {  17     MessageBox(NULL,TEXT("Click!"),TEXT("Silverlight for Hello World!!!"),MB_OK);  18     return S_OK;  19   }  20 };  21 #endif  22   23   24 // ============================================================================  25 //  OnLoaded  26 //  27 //  Description: Calls InitializeComponent to bind member variables to named  28 //               elements, and attach event handlers specified in XAML  29 //  30 //  Parameters:  pRoot - The root dependency object.  31 // ============================================================================  32 HRESULT MainPage::OnLoaded(__in IXRDependencyObject* pRoot)  33 {  34     UNREFERENCED_PARAMETER(pRoot);  35   36   37     HRESULT hr = InitializeComponent();  38   39   40     return hr;  41 } // OnLoaded  42   43   44 #pragma region GeneratedCode  45 // ============================================================================  46 //  WARNING: DO NOT EDIT THIS ALWAYS-GENERATED CODE  47 // ============================================================================  48 HRESULT MainPage::InitializeComponent()  49 {  50     HRESULT hr = E_FAIL;  51   m_clickDelegate = NULL;  52   53   54     FindName(L"LayoutRoot", &m_pLayoutRoot);  55   56   57 #if TEST_BTN_CLICK_PROCESS  58   {  59     HRESULT retCode = 0;  60     BtnEventHandler handler;  61   62   63     if(FAILED(retCode = FindName(TEXT("HelloWorldBtn"), &m_MyBtn)))  64       return -1;  65     /* 66     指向委托对象的指针并不是一个智能指针(smart pointer),我们需要显式释放它:clickDelegate->Release(); 67     现在未释放!!!可以仿 OnLoaded 中 AddLoadedEventHandler 的实现方式。 68     */  69     if(FAILED(retCode = CreateDelegate(&handler,&BtnEventHandler::OnClick,&m_clickDelegate)))  70       return -1;  71     if(FAILED(retCode = m_MyBtn->AddClickEventHandler(m_clickDelegate)))  72       return -1;  73   }  74 #endif  75   76   77     if (m_pLayoutRoot && m_MyBtn)  78     {  79         hr = S_OK;  80     }  81   82   83     return hr;  84 }  85 // ============================================================================  86 //  WARNING: DO NOT EDIT THIS ALWAYS-GENERATED CODE  87 // ============================================================================  88 #pragma endregion GeneratedCode

12 App.cpp 和 App.h 的代码如下:

App.h

1 #pragma once    2     3     4 #include 
5 6 7 // 8 // This function pointer type is used to declare a table of 9 // registration functions in App.cpp 10 // 11 typedef HRESULT (*PFN_XRCUC_REGISTER)(); 12 13 14 // 15 // This is the main application class. 16 // 17 class App 18 { 19 public: 20 21 22 // 23 // Intialize member variables that cannot fail initialization in the constructor. 24 // 25 App(): 26 m_bInitialized(FALSE), 27 m_nResult(0) 28 { 29 } 30 31 32 // 33 // Destructor 34 // 35 ~App() {} 36 37 38 // Intialize the XamlRuntime API, a VisualHost, and initialize the application 39 HRESULT Initialize(HINSTANCE hInstance); 40 41 42 // Create the VisualHost. 43 HRESULT CreateHost(XRWindowCreateParams* pCreateParams); 44 45 46 // Run the application until the message pump exits. 47 HRESULT Run(); 48 49 50 // Register the UserControls implemented in this module 51 HRESULT RegisterUserControls(); 52 53 54 // Get the host window creation parameters 55 HRESULT GetWindowParameters(XRWindowCreateParams* pWindowParameters); 56 57 58 // Get the result code to be returned from WinMain 59 int GetWinMainResultCode(); 60 61 62 // Set the result code to be returned from WinMain 63 void SetWinMainResultCode(int nResult); 64 65 66 // Get the application HINSTANCE 67 static HINSTANCE GetHInstance(); 68 69 70 // Exit the application 71 HRESULT Exit(); 72 73 74 // OnStartup is called after the visual host is created 75 // and before the message loop is entered 76 HRESULT OnStartup(); 77 78 79 // OnExit is called after the message pump is exited 80 // and before the visual host, and IXRApplication are destroyed. 81 HRESULT OnExit(); 82 83 84 // Register the resource dictionary for this application 85 HRESULT InitializeComponent(); 86 87 88 // Gets the visual host for this application 89 static HRESULT GetVisualHost(IXRVisualHost** ppHost); 90 91 92 // Gets IXRApplication for this class 93 static HRESULT GetApplication(IXRApplication ** ppApp); 94 95 96 private: 97 // Sets the visual host for this application 98 static void SetVisualHost(IXRVisualHost* pHost); 99 100 101 // Sets IXRApplication for this class 102 static void SetApplication(IXRVisualHost* pApp); 103 104 105 protected: 106 // member variables 107 BOOL m_bInitialized; // Initialization succeeded 108 int m_nResult; // WinMain result code 109 110 111 // static member variables 112 static HINSTANCE m_hInstance; // The HINSTANCE of this process 113 // 为指向运行 SilverLight 应用程序的单体对象,此对象用来加载管理分析 XAML 文件。 114 static IXRApplicationPtr m_pApplication; // IXRApplication for this process 115 // 指向 Windows(HWND) 容器对象对象树,以便在运行时用 C++ 或 XAML 创建的对象处理相应事件消息,并显示或隐藏其 XAML 或 C++ 类创建的窗口。 116 static IXRVisualHostPtr m_pVisualHost; // IXRVisualHost for this process 117 }; 118 119 120 121 122 // ============================================================================ 123 // Initialize 124 // 125 // Description: Intialize the XamlRuntime API, and the XRApplication and then 126 // create a visual host. 127 // 128 // Parameters: hInstance - The HINSTANCE from WinMain 129 // ============================================================================ 130 inline HRESULT App::Initialize(HINSTANCE hInstance) 131 { 132 HRESULT hr = E_FAIL; 133 134 135 // 创建主窗口并让 SE 管理它的内容 136 XRWindowCreateParams WindowParameters = {
0}; 137 138 139 m_hInstance = hInstance; 140 // Public API exported from XamlRumtime.dll. Initialize the system. 141 BOOL m_bInitialized = XamlRuntimeInitialize(); 142 143 144 // Create IXRApplication instance 145 if (m_bInitialized) 146 { 147 // Public API exported from XR.dll. Obtain a reference to the XRApplication object singleton. 148 hr = GetXRApplicationInstance(&m_pApplication); 149 } 150 151 152 if (SUCCEEDED(hr)) 153 { 154 // Add this module for the XamlRuntime to use when automatically resolving Image Source URIs as presented in XAML. 155 hr = m_pApplication->AddResourceModule(m_hInstance); 156 } 157 158 159 if (SUCCEEDED(hr)) 160 { 161 hr = RegisterUserControls(); 162 } 163 164 165 if (SUCCEEDED(hr)) 166 { 167 hr = InitializeComponent(); 168 } 169 170 171 if (SUCCEEDED(hr)) 172 { 173 hr = GetWindowParameters(&WindowParameters); 174 } 175 176 177 if (SUCCEEDED(hr)) 178 { 179 hr = CreateHost(&WindowParameters); 180 } 181 182 183 if (SUCCEEDED(hr)) 184 { 185 hr = OnStartup(); 186 } 187 188 189 return hr; 190 } // Initialize 191 192 193 // ============================================================================ 194 // Run 195 // 196 // Description: Run the application until the message pump exits. 197 // ============================================================================ 198 inline HRESULT App::Run() 199 { 200 HRESULT hr = E_FAIL; 201 UINT uiExitCode = 0; 202 203 204 if (m_pVisualHost != NULL) 205 { 206 // save the exit code for WinMain 207 hr = m_pVisualHost->StartDialog(&uiExitCode); 208 SetWinMainResultCode(uiExitCode); 209 } 210 211 212 // Allow user to cleanup resources. 213 OnExit(); 214 215 216 // 217 // XamlRuntime interfaces must be released in the 218 // following order: IXRVisualHost, IXRApplication. 219 // After these interfaces are released the runtime 220 // can be uninitialized. 221 // 222 223 224 // First release IXRVisualHost 225 m_pVisualHost = NULL; 226 227 228 // Second release IXRApplication 229 m_pApplication = NULL; 230 231 232 // If XamlRuntime was initialized, uninitialize it 233 if (m_bInitialized) 234 { 235 m_bInitialized = FALSE; 236 XamlRuntimeUninitialize(); 237 } 238 239 240 m_hInstance=NULL; 241 242 243 return hr; 244 } // Run 245 246 247 248 249 // ============================================================================ 250 // GetWinMainResultCode 251 // 252 // Description: Get the result code to be returned from WinMain 253 // ============================================================================ 254 inline int App::GetWinMainResultCode() 255 { 256 return m_nResult; 257 } // GetWinMainResultCode 258 259 260 // ============================================================================ 261 // SetWinMainResultCode 262 // 263 // Description: Set the result code to be returned from WinMain 264 // 265 // Parameters: nResult - The result code to be returned from WinMain 266 // ============================================================================ 267 inline void App::SetWinMainResultCode(int nResult) 268 { 269 m_nResult = nResult; 270 } // SetWinMainResultCode 271 272 273 // ============================================================================ 274 // GetHInstance 275 // 276 // Description: Get the application HINSTANCE 277 // ============================================================================ 278 inline HINSTANCE App::GetHInstance() 279 { 280 return m_hInstance; 281 } // GetHInstance 282 283 284 // ============================================================================ 285 // Exit 286 // 287 // Description: Exit the application 288 // ============================================================================ 289 inline HRESULT App::Exit() 290 { 291 HRESULT hr = E_FAIL; 292 293 294 if (NULL != m_pVisualHost) 295 { 296 hr = m_pVisualHost->EndDialog(0); 297 } 298 299 300 return hr; 301 } // Exit 302 303 304 // ============================================================================ 305 // GetVisualHost 306 // 307 // Gets the visual host for this application 308 // ============================================================================ 309 inline HRESULT App::GetVisualHost(IXRVisualHost ** ppHost) 310 { 311 if (!ppHost) 312 return E_INVALIDARG; 313 314 315 if (m_pVisualHost) 316 { 317 *ppHost = m_pVisualHost; 318 (*ppHost)->AddRef(); 319 return S_OK; 320 } 321 322 323 return E_FAIL; 324 } 325 326 327 // ============================================================================ 328 // SetVisualHost 329 // 330 // Sets the visual host for this application 331 // ============================================================================ 332 inline void App::SetVisualHost(IXRVisualHost* pHost) 333 { 334 // Smart pointer automatically calls AddRef 335 m_pVisualHost = pHost; 336 } 337 338 339 // ============================================================================ 340 // GetApplication 341 // 342 // Gets IXRApplication for this class 343 // ============================================================================ 344 inline HRESULT App::GetApplication(IXRApplication ** ppApp) 345 { 346 HRESULT hr = E_FAIL; 347 348 349 if (!ppApp) 350 return E_INVALIDARG; 351 352 353 if (m_pApplication) 354 { 355 *ppApp = m_pApplication; 356 (*ppApp)->AddRef(); 357 hr = S_OK; 358 } 359 360 361 return hr; 362 } 363 364 365 // ============================================================================ 366 // SetApplication 367 // 368 // Sets IXRApplication for this class 369 // ============================================================================ 370 inline void App::SetApplication(IXRVisualHost* pApp) 371 { 372 // Smart pointer automatically calls AddRef 373 m_pApplication = pApp; 374 }

App.cpp

 

1 #include "stdafx.h"    2 #include "SilverlightHelloGenerated.h"    3 #include "App.h"    4 #include "MainPage.h"    5     6     7 // The MAX_LOADSTRING constant needs to be equal to or greater    8 // than the length of the string referenced by IDS_APP_TITLE    9 #define MAX_LOADSTRING 100   10    11    12 // ============================================================================   13 // Static class member instantiation.   14 // ============================================================================   15 HINSTANCE App::m_hInstance;                 // HINSTANCE of this process   16 IXRApplicationPtr App::m_pApplication;      // IXRApplication for this process   17 IXRVisualHostPtr App::m_pVisualHost;        // IXRVisualHost for this process   18    19    20 // ============================================================================   21 //  InitializeComponent   22 //    23 //  Description: Load the Application resource dictionary if one exists.   24 // ============================================================================   25 HRESULT App::InitializeComponent()   26 {   27     XRXamlSource appXaml(GetHInstance(), IDR_SILVERLIGHTCLOCK_APP);   28     HRESULT hr = m_pApplication->LoadResourceDictionary(&appXaml,NULL);   29     return hr;   30 } // InitializeComponent   31    32    33 // ============================================================================   34 //  GetWindowParameters   35 //    36 //  Description: Set the window creation parameters for this application.   37 //   38 //  Parameters:  pWindowParameters - Window creation parameters.   39 // ============================================================================   40 HRESULT App::GetWindowParameters(XRWindowCreateParams* pWindowParameters)   41 {   42     static WCHAR szTitle[MAX_LOADSTRING];        // title bar text   43    44    45     HRESULT hr = E_INVALIDARG;   46     if (pWindowParameters)   47     {   48         pWindowParameters->Style       = WS_VISIBLE;   49         pWindowParameters->ExStyle     = WS_EX_TOPMOST;   50    51    52         // Set the title bar text   53         LoadString(m_hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);    54         pWindowParameters->pTitle      = szTitle;   55    56    57         // Set window position   58         pWindowParameters->Left        = 0;   59         pWindowParameters->Top         = 0;   60    61    62         // TODO: To specify a window size for the visual host set Width and Height   63         // If Width and Height are zero the Width and Height specified in the   64         // XAML are used   65    66    67         //pWindowParameters->Width       = GetSystemMetrics(SM_CXSCREEN);   68         //pWindowParameters->Height      = GetSystemMetrics(SM_CYSCREEN);   69    70    71         hr = S_OK;   72     }   73     return hr;   74 } // GetWindowParameters   75    76    77 // ============================================================================   78 //  OnStartup   79 //    80 //  Description: OnStartup is called after the visual host is created.   81 //               and before the message loop is entered.   82 // ============================================================================   83 HRESULT App::OnStartup()   84 {   85     HRESULT hr = S_OK;   86    87    88     IXRFrameworkElementPtr pRoot;   89    90    91     hr = m_pVisualHost->GetRootElement(&pRoot);   92     if (SUCCEEDED(hr))   93     {   94         // TODO: Add one time initialization code here.   95     }   96    97    98     return hr;   99 } // OnStartup  100   101   102 // ============================================================================  103 //  OnExit  104 //   105 //  Description: OnExit is called after the message pump is exited  106 //               and before the visual host, and IXRApplication are destroyed.  107 // ============================================================================  108 HRESULT App::OnExit()  109 {  110     // TODO: Add one-time cleanup code here.  111     return S_OK;  112 } // OnExit  113   114   115 // ============================================================================  116 //  CreateHost  117 //   118 //  Description: Create the visual host.  119 //  120 //  Parameters:  pCreateParams - The parameters used for creating the   121 //               visual host's window  122 // ============================================================================  123 HRESULT App::CreateHost(XRWindowCreateParams* pCreateParams)  124 {  125     XRPtr
pControl; 126 HRESULT hr = E_FAIL; 127 128 129 hr = m_pApplication->CreateObject(__uuidof(MainPage),&pControl); 130 if (SUCCEEDED(hr)) 131 { 132 hr = m_pApplication->CreateHostFromElementTree(pControl, pCreateParams, &m_pVisualHost); 133 } 134 135 136 return hr; 137 } 138 139 140 #pragma region RegisterUserControls Generated Code 141 // ============================================================================ 142 // RegisterUserControls 143 // 144 // Description: Register all XRCustomUserControl implemenations here. 145 // 146 // WARNING: DO NOT EDIT THIS ALWAYS-GENERATED FUNCTION 147 // ============================================================================ 148 HRESULT App::RegisterUserControls() 149 { 150 HRESULT hr = S_OK; 151 152 153 static PFN_XRCUC_REGISTER pfn[] = 154 { 155 &MainPage::Register, 156 }; 157 158 159 for (int i=0; i<_countof(pfn) && SUCCEEDED(hr); i++) 160 { 161 hr = pfn[i](); 162 163 164 if (FAILED(hr)) 165 { 166 RETAILMSG(1,(L"RegisterUserControls failed.")); 167 } 168 169 170 } 171 172 return hr; 173 } // RegisterUserControls 174 175 176 // ============================================================================ 177 // WARNING: DO NOT EDIT THIS ALWAYS-GENERATED FUNCTION 178 // ============================================================================ 179 #pragma endregion RegisterUserControls Generated Code

 

13 编译、运行,失败了!程序没有加载起来。一般来说,没有加载成功是因为 XMAL 解析失败,或资源没有加载成功。需要进一步分析是什么具体的原因?

调试代码发现,如下函数在加载资源时报错: hr = -2147023082 {找不到映像文件中指定的资源名。}

1 HRESULT App::InitializeComponent()  2 {  3     XRXamlSource appXaml(GetHInstance(), IDR_SILVERLIGHTCLOCK_APP);  4     HRESULT hr = m_pApplication->LoadResourceDictionary(&appXaml,NULL);  5     return hr;  6 } // InitializeComponent

解决方法:

将资源文件 SilverlightHelloWorld.rc 中的 SilverlightHelloWorld.rc2 替换成 SilverlightHelloGenerated.rc2,共两处。
14 编译、运行,可以看到想要的界面。点击按键,会弹出一个对话框。
OK,到此新建 WinCE 下 Silverlight 工程的整个过程算是结束了,是不是有些复杂?
呵呵...,个人的感觉也是,挺复杂的。

转载于:https://www.cnblogs.com/91program/p/5201231.html

你可能感兴趣的文章
Linux下设置postgresql数据库开机启动
查看>>
mysql函数技巧整理
查看>>
二叉树
查看>>
IO多路复用--epoll详解
查看>>
[线段树优化应用] 数星星Star
查看>>
表单序列化以及后台表单数据参数的提取
查看>>
SQL语句(十五)视图
查看>>
nginx 设置开机启动
查看>>
继承和组合
查看>>
小程序-----上传图片
查看>>
工作流表单自定义的误区
查看>>
带有循环功能的存储过程
查看>>
数据结构-链表插入节点
查看>>
软件项目开发流程
查看>>
常用排序算法
查看>>
DOM(文档对象模型)
查看>>
为什么要安全域,哪些区域需要单独划分安全域
查看>>
【BZOJ5297】【CQOI2018】社交网络(矩阵树定理)
查看>>
【BZOJ1921】【CTSC2010】珠宝商(点分治,后缀自动机)
查看>>
追寻生命的意义
查看>>