5.Step by Step

为了偷懒,我只是简单翻译一下一个国外朋友的博客文章,文章不错,我只是在此基础上做一点补充,并提供带Embedded XAML Runtime引擎的SDK(下一篇文章),让你可以在这个SDK提供的模拟器上测试你编写的SE Application,这样你不需要每次都编译一下CE OS的subproject。但是有一点需要申明,在模拟器跑起来的效果会很差,一方面因为没有硬件加速(没有硬件加速的情况下不可能使用任何技术实现即非常绚丽又快速的效果),另一方面PC上的显示器清晰度比一些CE高DPI的设备低很多。

原文地址:http://geekswithblogs.net/WindowsEmbeddedCookbook/archive/2009/10/01/silverlight-for-embedded-tutorial.aspx

1.使用Expression Blend 2生成XAML等资源

创建一个Silverlight application:

你需要使用Expression Blend 2 SP1,该版本支持Silverlight 2。从向导中你会看到你需要选择开发语言是C#还是Visual Basic,SE只能用C++编写,很可惜Expression Blend目前并不支持C++,所以我们不需要Expression Blend生成的任何代码。

那么怎样不让Expression Blend帮我们生成的C#或者VB.NET代码呢?请看下图:

创建一个新的项目之后,Expression Blend已经帮你生成好一个空XAML文件(默认叫page.xaml)。

我们从Silverlight提供的控件集中拖一个简单的按钮:

使用属性窗口我们给新按钮分配一个名称:

属性窗口允许你自定义按钮的各种属性:颜色、旋转角度(你可以让一个垂直的按钮旋转45度!)、透明度等等。

我们在下一篇文章中体验这些特性,现在我们仅仅保持按钮原样,并保存XAML文件。

如果你用一个记事本打开一个XAML文件你会发现它们非常简单:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
<UserControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"   
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Class="SimpleApp.Page"
Width="640" Height="480">
    <Grid x:Name="LayoutRoot" Background="White">
        <Button Height="87" Margin="189,106,209,0" VerticalAlignment="Top" Content="Button" x:Name="MyButton"/>
    </Grid>
</UserControl>

UserControl作为顶部容器包含我们的按钮,Grid用于布局(对象被组织成以列和行的形式)。

按钮具有各种属性,比如在grid cell中的定位、对齐方式、content(字符串值“Button”)和name(字符串值”MyButton”)。

2.编码

到这一步我们做好了Design,下一步我们可以启动Platform Builder,在我们自己的OS Design项目上创建一个新的subproject。(在后面我会提供一个Alchemy SDK,在这个SDK上编写SE based Application你甚至不需要安装任何CE系统的开发环境。)

在solution窗口,右击新建一个subproject,创建一个WCE Application:

选择A simple Windows Embedded CE application:

这会创建一个应用程序仅仅包含WinMain函数,对与我们第一个SE应用程序来说已经够了。

第一件要做的事是包含一些头文件:

?
1
2
3
4
#include "pwinuser.h"
#include "xamlruntime.h"
#include "xrdelegate.h"
#include "xrptr.h"

下一步我们添加Expression Blend为我们生成好的XAML到程序资源中。

包含资源文件到exe文件中,我们需要添加一个资源脚本文件(rc文件)到subproject中:

在subproject上右击,选择”add\new item”并从对话框中选择资源文件并起一个名字:

创建一个新资源:

现在可以导入XAML文件,XAML中的数据将被以二进制的形式包含到exe文件中:

为新资源起个类型名字叫”XAML”:

这里为了方便我们保留资源默认的ID (IDR_XAML1)不变,在一个真正的项目中,起个meaningful names是更好的主意:

为了使用资源ID,我们在我们的cpp文件中需要包含"resource.h":

?
1
#include "resource.h"

然后在WinMain中我们开始使用XAML运行时,首先需要初始化它:

?
1
2
if (!XamlRuntimeInitialize())       
return -1;

如果XamlRuntimeInitialize执行成功,SE的运行时会被你的应用程序加载并准备好处理UI。

每个SE应用程序只有一个”Application”对象让我们用来访问全局应用程序的属性和特性。

为了访问它们,我们需要使用GetXRApplicationInstance API。

?
1
2
3
4
5
HRESULT retcode;
 IXRApplicationPtr app;
  
 if (FAILED(retcode=GetXRApplicationInstance(&app)))
     return -1;

我们用Application对象做的第一件事是告诉它从哪里能找到资源文件(XAML,图片等)。

资源问题我们都已经包含到exe中了,所以我们传递我们的HINSTANCE句柄给它就可以了:

?
1
2
if (FAILED(retcode=app->AddResourceModule(hInstance)))
    return -1;

现在我们已经初始化了Application对象,我们可以创建主窗口并让SE管理它的内容:

?
1
2
3
4
5
6
7
8
9
10
11
XRWindowCreateParams wp;
ZeroMemory(&wp, sizeof(XRWindowCreateParams));
wp.Style       = WS_OVERLAPPED;
wp.pTitle      = L"S4E Test";
wp.Left        = 0;
wp.Top         = 0;
XRXamlSource xamlsrc;
xamlsrc.SetResource(hInstance,TEXT("XAML"),MAKEINTRESOURCE(IDR_XAML1));
IXRVisualHostPtr vhost;
if (FAILED(retcode=app->CreateHostFromXaml(&xamlsrc, &wp, &vhost)))
    return -1;


VisualHost对象"hosts"运行时并让我们可以访问它的内容,以及从资源中加载我们的XAML(使用XRXamlSource对象)。

SE应用程序中的对象以对象树的方式组织起来。访问对象树中的对象,我们需要得到指向这棵树根部(root)的指针:

?
1
2
3
IXRFrameworkElementPtr root;
if (FAILED(retcode=vhost->GetRootElement(&root)))
    return -1;

从树的根部我们可以通过在Expression Blend中指定的name来访问我们的按钮:

?
1
2
3
4
IXRButtonBasePtr btn;
if (FAILED(retcode=root->FindName(TEXT("MyButton"), &btn)))
    return -1;


为了能够收到用户点击按钮时的通知,我们需要提供一个委托(delegate)。使用C#开发的朋友对委托的概念应该比较清楚,在这里一个委托即是一个指向具有指定原型(prototype)的C++实例的成员的指针。 
我们可以在我们的cpp文件中声明一个简单的C++类,并在其中实现按钮点击事件的委托:

?
1
2
3
4
5
6
7
8
9
class BtnEventHandler
{
public:
    HRESULT OnClick(IXRDependencyObject* source,XRMouseButtonEventArgs* args)
    {
        MessageBox(NULL,TEXT("Click!"),TEXT("Silverlight for Windows Embedded test"),MB_OK);
        return S_OK;
    }
};

当按钮被点击时我们的事件处理器(event handler)仅仅是简单的显示一个消息框。

正如你看到的事件处理器(event handler)有2个参数:一个指向产生事件(我们的按钮)的对象的指针和一个包含事件参数的结构体的指针。 
为了连接事件处理器(event handler)和按钮,我们需要创建一个委托对象:

?
1
2
3
4
5
6
BtnEventHandler handler;
IXRDelegate<XRMouseButtonEventArgs>* clickdelegate;
if (FAILED(retcode=CreateDelegate(&handler,&BtnEventHandler::OnClick,&clickdelegate)))
    return -1;
if (FAILED(retcode=btn->AddClickEventHandler(clickdelegate)))
    return -1;


事件处理器已经连上我们的按钮了,现在只需要等待用户去点击我们漂亮的按钮并显示我们的UI:

?
1
2
3
UINT exitcode;
if (FAILED(retcode=vhost->StartDialog(&exitcode)))
    return -1;

指向委托对象的指针并不是一个智能指针(smart pointer),我们需要显式释放它:

?
1
clickdelegate->Release();

在我们build我们的subproject前我们需要添加头文件所在的目录和一些SE需要的库文件。

右击subproject打开source script添加如下代码:

?
1
2
3
4
5
6
INCLUDES=$(_OEMINCPATH)
and libraries:
TARGETLIBS= \
    $(_PROJECTROOT)\cesysgen\sdk\lib\$(_CPUINDPATH)\coredll.lib \
    $(_PROJECTROOT)\cesysgen\sdk\lib\$(_CPUINDPATH)\xamlruntime.lib \
    $(_PROJECTROOT)\cesysgen\sdk\lib\$(_CPUINDPATH)\uuid.lib \

(你需要在sources script 中已经包含了TARGETLIBS directive)

现在你可以在设备上跑起来应用程序并点击按钮了!

你可以从这里下载到Demo代码: 
http://cid-9b7b0aefe3514dc5.skydrive.live.com/self.aspx/.Public/SilverlightSample.zip

下一篇文章:使用Silverlight for Embedded开发绚丽的界面(3)

作者: 王克伟
出处: http://wangkewei.cnblogs.com/ 
版权声明: 本文的版权归作者与博客园共有。转载时须注明本文的详细链接,否则作者将保留追究其法律责任的权利。
您可以从这里更方便的找到我的文章。

使用Silverlight for Embedded开发绚丽的界面(2)相关推荐

  1. 使用Silverlight for Embedded开发绚丽的界面(4)

    在文章使用Silverlight for Embedded开发绚丽的界面(2)我介绍了如何通过subproject的方式开发SE应用程序,并在文章使用Silverlight for Embedded开 ...

  2. 使用Silverlight for Embedded开发绚丽的界面(3)

    上一篇文章在这里:使用Silverlight for Embedded开发绚丽的界面(2) 上一篇文章是介绍通过subproject的方式来开发SE应用程序,开发起来太麻烦.这篇文章我提供Alchem ...

  3. 使用Silverlight for Embedded开发绚丽的界面(1)

    本文目标读者 这系列文章写给对使用Silverlight for Embedded(SE)在Windows嵌入式系统上开发绚丽界面感兴趣的朋友.要求读者有一定的Win32基础,C++基础,虽然SE是基 ...

  4. 艾伟_转载:如何开发绚丽、高效率的界面(Windows嵌入式系统)

    上篇文章中提到用户体验(UE),并且说到国内有专门去做UE的团队也很少.据我了解Microsoft.Nokia.Google等,还有国内的Baidu是有比较专业的UE团队.对于我们这样的普通团队.普通 ...

  5. python开发的优秀界面-八款常用的 Python GUI 开发框架推荐

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 乔柯 PS:如有需要Python学习资料的小伙伴可以加点击下方链接 ...

  6. Silverlight C# 游戏开发:面向对象在游戏中的实例(一)

    本系列所有代码都是使用Microsoft Visual Studio 2008开发,为基于Silverlight的游戏开发技术,如果您看完之后觉得不错,回复顶一下,万分感激:) 今天,我将带来一个非常 ...

  7. Silverlight C# 游戏开发:L5 3D基本的灯光

    Silverlight C# 游戏开发:L5 3D基本的灯光 我们在设计和开发3D的时候最常用的就是灯光,它有的时候比摄像机还要重要,一些花哨漂亮的表现主要通过灯光实现,相比场景中只有一个的主要摄像机 ...

  8. Silverlight C# 游戏开发:项目开发实例和小技巧索引

    Silverlight C# 游戏开发:项目开发实例和小技巧索引 相比于技术文章而言,本索引中包含的都是独立的项目,争取按照每个独立的项目开发来编写系列,全部为原创,开发过程可能语无伦次,可能相当幼稚 ...

  9. Silverlight C# 游戏开发:Flyer10完成寻找工作

    Silverlight C# 游戏开发:Flyer10完成"寻找"工作 上一次我们一起搞定了动画的一些效果,在最后给出了一排蝴蝶的随机扇动,今次我们一起研究一下互动元素的制作,完成 ...

最新文章

  1. 适用于 IT 专业人员的基本 Windows 部署
  2. Flex里[Exclude]标签的作用:对外忽略/隐藏内部某对象
  3. Maven搭建webService (一) 创建服务端---使用main函数发布服务
  4. js正则表达式验证省份证信息
  5. windows-sys:21:windows系统(win7 win10 win11)设置护眼色详细过程
  6. Hou的图像显著性计算模型
  7. 广西艺术学院2012年本科招生专业考试通知
  8. android 获取屏幕旋转方向,android获取手机屏幕尺寸和旋转方向
  9. java关键字super指什么_java 关键字super详解及用法
  10. gt9xx.c和gt9xx.h文件分析
  11. Array.Sort()排序的原理
  12. 【PB】程序中在普通激光打印机上实现条码打印
  13. 一条气象预警是如何产生的
  14. Windows下‘gbk‘ codec can‘t decode byte 0xae问题出现的原因及解决方法
  15. 在ArcGIS中创建Python工具(三)
  16. oracle-comment on的用法
  17. 微信拼手气红包算法(二倍平均值法)实现示范代码
  18. 风控案例 | 宁波通商银行背后的科技力量
  19. 通过XAMPP访问phpmyadmin管理mysql数据库
  20. Win10 Python yt-dlp下载youtube视频 | 安装使用详细教程

热门文章

  1. 手机h5可以用ifreme_安卓手机可以流畅用几年?至少三年不卡
  2. Windoes 10 笔记本上安装telnet方法
  3. 第七章 oracle的服务启动顺序、认证方式、
  4. javascript BOM对象详解
  5. ubuntu四个屏幕设置_Linux_从9个方面来立体式地美化Ubuntu 桌面,总结了一下桌面美化的设置。 - phpStudy...
  6. python画二维数组散点图_Python散点图二维数组
  7. 怎么用python画花瓣_怎么用python画花朵
  8. redis配置密码_Redis数据库概述
  9. pythonloop循环结构_python - tensorflow,tf.while_loop:这两个结构没有相同的嵌套结构 - SO中文参考 - www.soinside.com...
  10. catia曲面扫掠命令详解_Catia曲面基础与工程实践 3.2 扫掠曲面