开发SWE的心得
key:
1.xamlsrc.SetFile (动态加载XAML文件,而不是以资源的形式)
2.XAML文件当中有IMAGE 控件,但图片不能够显示(我所知道的有两种解决方案)
开发环境:
VS2005,VS2008
建议使用VS2008,听说VS2010更加好,
界面制作:
使用BLEND X(2,3,4,...) 制作好界面,然后保存。
使用VS200X(5,8)创建创建一个空的智能WIN32项目。
1.加载XAML文件,加载成功之后,要注意此XAML文件还是在原来的存储位置,并没有移到当前工程目录下,也
就是其只一个份,没有二份,这使用得与BLEND保持了同步。
这个特点也提醒我们:当我们加载其它工程的源文件的时候,在使用#include的时候,要注意写清楚路径,当出现
不能打开"xxx.h"文件的时候,要知道是有可能是路径不对。建议先将代码源文件COPY到当前工程目录上,然后再
加载.
SWE 其对于XAML是怎么样处理的呢.
其是动态加载还是静态加载的呢。
之前看到人家使用DirectUI的时候,其是程序运行之后,然后加载UI文件,之后进行解析。对于UI 部分的修改
,不需要重新编译。
SWE其的处理机制与DirectUI有所不同,首先其是将XAML当作一种资源,这样其在编译的时候,资源编译器
(RC.EXE)其将XAML编译成了二进制保存在程序的数据段当中,这就是为什么编译连接之后变成一个EXE,且这个
EXE运行不受路径的影响.
(其实这不全面,SWE其也能够实现DirectUI的特点,下面有所介绍,
说的真的,这是在写此文的时候,才突然意识到,==>这也就是我的随笔,段与段之间有可能没有联系,我突然想到
了,就要马上写下来,原因之一:在写的过程当中能够深入思考,原因之二:不写下来过会儿就forget)
这种机制给我们带来了什么影响呢。
1.如果我们想改变程序UI的结构,我只能运行的时候通过代码修改,且不能静态的修改XAML文件。如果修改了
XAML文件且想得到XAML文件的效果,那么就是重新编译一次.
2. SWE其将XAML作为资源,==>我们就应该以资源的角度来看待与使用,资源一个很重要特点:其保存在EXE的数据
段当中。
如 XRXamlSource 结构( xaml runtime xaml source)
当我们已经加载了XAML作为资源的时候
我们就使用
XRXamlSource.SetResource(hInstance,TEXT("XAML"),MAKEINTRESOURCE(IDR_XAML1));
当我们没有加载XAML作为资源,那么我们应该怎么样做呢.
XRXamlSource::SetFile(filename); XRXamlSource其有一个SetFile的方法,此方法其有什么用处了。
此方法其能够实现DirectUI特点:动态加载,但要注意路径。
其作法如下:
1.将XAML(S)文件COPY到目标设备nand flash目录 其路径应该:
\NAND FLASH\Page.xaml
2.XRXamlSource.SetFile("\\NAND FLASH\\Page.xaml");
就是这么简单,刚开始错误的写成了
xamlsrc.SetFile(L"F:\\C++2008_wince\\TestSWESimple\\TestSWESimple\\Page.xaml");
出现的错误是:找不到目标文件。
其为什么会找不到文件呢,是因为我们运行的EXE是在WINCE 6.0 目标设备上,而不是PC上,所以找不文件。
TIPS:以后出现找“找不到目标文件”之类的错误,要思考是否是目录不对呀。
XAML文件当中有IMAGE 控件,但图片不能够显示。
这问题的原因与上面SetFile的”找不到目标文件"是一样的.
也就是设计与运行环境不同而制造成的。这与将XAML文件作为资源与还不作为资源是没有关系的。
其有两种办法:
1.手动地将此控件<Image Source ="Image/xxx.png" ... />的图片xxx.png,复制到目标设备上,如\NAND
FLASH\Image 目录下,然后将此控件的图片源路径修改为
<Image Source="\NAND FLASH\Image\xxx.png" ... />
优点:与EXE 分开,减少EXE的大小且能够在不重新编译的情况下替换图片。
不足: 制作完界面之后,又要修改界面,一来麻烦(我有一个项目,其是使用图片作为控件,六十多张图片,要修改
起来,那真是麻烦)二来不利于与美工同步工作。因为修改\NAND FLASH\Image\xxx.png 这样的路径在PC是
无法显示的。
MS的SWE 设计人员们其应该也考虑了这个问题,其提供了第二种方法:
PAGE:http://msdn.microsoft.com/en-us/library/ee501817.aspx
2.使用资源:
首先 以资源的形式加载图片,
然后 打开 资源文件 xx.rc.( 在XXX.RC上右键单击,选择查看代码),
添加 如下代码. 以<Image Source ="Image/xxx.png" ... />为例
Image/xxx.png XAML_RESOURCE DISCARDABLE "xxx.png"
(Image/xxx.png 其是在BLEND下为了方便管理图片,自己添加的一个文件夹,
注意我们没有必要(突然想一下也许有必要,反正先以最简单的方式制作,之后熟练了,想怎么样就怎么样了)
在VS当中添加此文件
)
如果是<Image Source ="yyy.png" ... /> (yyy.png在当前工程的目录下)
yyy.png XAML_RESOURCE DISCARDABLE "yyy.png"
如果yyy.png 没有在当前工程的目录下,如在D:下
yyy.png XAML_RESOURCE DISCARDABLE "D:\\yyy.png"
优点:不需要修改XAML文件且能够与美工保持同步
不足: EXE文件太大(听话太大了影响加载速度,有时还不能够加载,其实我们一般不要担心这个问题,
原因:我们程序一般也不会太大,如果真的很大的话,我们可以可以就资源单独出来制作纯资源
DLL(MSDN 上有,我只是制作过WINCE 6.0 非SWE项目的时候,使用过这种技术,希望哪位工程师提能一个
DEMO))
(一个小笑话:我在用BLEND 2 制作好界面,界面当中包含图片,其使用格式如下<Image
Source="images/xxx.png" .../>。然后我在VS2005的工程当中也添加一个Images文件夹且将相关图片添加此目录下
,结果其没有显示,原因与解决方法在此文章当中)
(小插曲:我总是喜欢将当前工程所需要的文件先COPY 到当前工程下来,然后再进行加载,以求能够成功加载,
如将background_帮助_2.png这张图片复制到当前工程目录下来,然后再加载,结果如下:
BACKGROUD_帮助_2.PNG XAML_RESOURCE "backgroud_帮助_2.PNG"
其实这完成没有必要且还有很大的负作用,我们可以直接的加载,得到的结果如下:
BACKGROUD_照片.PNG XAML_RESOURCE "D:\\backgroud_照片.PNG"
(tips:BACKGROUD_照片.PNG 在D:盘下)
==> 只要提供了访问路径就可以了
)
小结:解决了加载APP.XAML 资源文件,与显示图片,为我们制作图片按钮提供了信心。