时间:19:55 2010-9-1
环境:
开发环境:VS2008 +XAML2CPP.EXE + SWE 2 + BLEND 2
运行环境:WINCE 6.0 R3
硬件加速: DirectX
背景:
文件浏览器已经基本实现。接下应该实现图片浏览的功能。
用户需求:
在文件浏览的基础之上,文件浏览器要求能够显示图片的缩略图,
用户点击图片文件,其就开始进行图片浏览了。
浏览图片的两种模式:
A. 手动:上一张,下一张的功能
B. 自动播放:自动播放的开关,自动播放切换时间。
今天暂时完善文件浏览器的图标显示图片的功能。
图标控件: 自定义控件,其要显示文件的图标与文件名,且能够根据文件类型正确的显示相关图标,如:图片文
件就要显示图片的缩略图。
此功能应该谁来完成了:
得到文件名,==》判断文件名类型,==》 根据类型显示相应的图标。(策略模式应用)
其是由图片控件来完成==》 其的接口只要是一个图片文件名。
其是由CONTROLLER来控制完成 ==》 图片控件其要提供操作接口,如SetImage()。
STEP 1:
从图片文件互图片控件。
MS 的SWE开发人员其是怎么样实现的呢。
图片类型多种,怎么样提供统一的操作接口给用户呢.
策略模式 + 工厂函数。
这些操作接口与IMAGE CONTROL 之间保持什么样的联系呢。其之间使用了什么样的设计模式。
如:
其的用户操作接口是什么呢. 思考:是什么,有什么,怎么样使用,其为什么只要这些
图片源(source): 其对于图片源的操作有,GET,SET; 其对于图片源是直接文件名,还是要进行规范呢。
伸拉模式设置(stretch):
retrieves a value that describes how an image should be stretched to fill the destination rectangle.
其的返回值是怎么样设置。同样也有SET,GET;
事件:
AddImageFailedEventHandler
RemoveImageFailedEventHandler
ImageFailed 其包括哪些情况:是否包括从图片文件加载到内存当中呢
控件与源之间的关系
silverlight for windows embedded uses bitmap caching.Therefore, if a requested image was requested at a
previous time .the cached and decoded image is used again instead of starting a new request from the URI.
其是使用先缓存与解码的工作方式。 所以在显示流程上要求用户实现这一步,然后再设置IMAGE CONTROL 的源
。
包括:规范。
任何类型的图片文件,其最终要变成bitmap
图片到控件
图片文件 --》IXRBitmapImage ==>(IXRImage) IMAGE CONTROL
IXRBitmapImage:( class IXRBitmapImage : public IXRImageSource)
this class represents a bitmap image that is used as part of an application user interface.
( 其难道可以直接显示吗而不要通过IXRImage control) 或者: 位图其也是要通过控件才能够显示。
IXRImage: ( class IXRImage : public IXRFrameworkElement)
this class represents a control that displays an image
IXRImageSource:
其是为了统一操作接口。其是使用了什么样的设置模式呢. 策略模式吧
This is an object type that is used in the method signatures for
IXRImage::GetSource,IXRImage::SetSource
IXRImageBrush::GetImageSource, IXRImageBrush::SetImageSource.
==> IXRBitmapImage 其是IXRImageSource 的子类。
图片文件 ==》cached (IXRImageSource 的实例:IXRBitmapImage) ==> 图片控件(接口:IXRImageSource)
IXRIamge
随便学习一下方法的当中字符串的设置:
virtual HRESULT STDMETHODCALLTYPE GetUriSource(
WCHAR* *pUriSource
) = 0;
virtual HRESULT STDMETHODCALLTYPE SetUriSource(
const WCHAR* pUriSource
) = 0;
得到 使用指针的指针 没有且不能加const
设置使用指针且添加了一个 const 且类型是使用 WCHAR 强制,而不是TCHAR 这样不确定。
图片文件 ==》 到cached要使用LoadImage之类的函数,或者使用Image组件,这与在MFC当中是一样的.
IXRBitmapImage的成员方法:
virtual HRESULT STDMETHODCALLTYPE SetBitmapSource(
HBITMAP hBitmap
) = 0;
==》 从图片文件到地于图片进行操作其要经历的过程。
1. cache and decoded 从而得到 HBITMAP。
其为什么要这样一步呢。
其是为了统一接口,因为图片的格式是多种的,包括现有的和未来的。但其只要解码,得到HBITMAP 其就可以
被SWE所操作了。
这一步是变化的,所以SWE将其独立出来,且一个统一的接口:HBITMAP.
2.对于图片文件进行操作处理。
大家使用WIN32编程就知道,我们操作对象是使用HBITMAP,对于图片的操作许多种:放大,缩略,旋转...。
其都要求对于HBITMAP进行的操作。
MS的SWE开发人员其就是这样设置的。
==> IXRImage 其只是为图片提供一个显示与操作的平台。而没有提供解码的功能的,所以要想显示
(JPEG,GIF,PNG) 等格式的图片,自身0S当中要提供一些解码DLL, 幸好在WINDOWS 当中提供一个IMAGE
LIBRARY 其能够解析现在最常用的图片格式,当然其他的图片格式,要用户自己提供解码DLL。
其为什么不将HBITMAP直接与IXRImage进行联系。而是在中间加一个IXRImageSource.
使用IXRImage 其只要针对于IXRImageSource就可以了。
其除了为提高灵活性与解耦,还是什么呢, 其属于哪一种设计模式呢。
具体操作实现
essential sentence:
to be able to load and use image files( jpegs ,bmps,gifs) inside your application you should include the imagelibrary components in your OSDesign.
==>在MFC当中,就是使用此图片组件来编写图片浏览器的。
To display an image inside your application user interface you have to use the image control of silverlight.
==> 显示图片使用IMAGE CONTROL(IXRImage), IMAGE CONTROL( IXRImage)其是用于显示图片的 。
操作图片的模型:
图片文件 ==> hbitmap ==> IXRIMageSource INSTANCE(如:IXRBitampImage) ==> IXRImage( image control)
定义对象:
IXRBitmapImagePtr img01;
创建对象
IXRApplication::CreatObject()
load the bitmaps and store them inside the IXRBitmapImagePtr objects。
if( FAILED( retcode = img01->SetUriSource(L("\\Windows\\ img01.jpg"))))
==> 解析了这样几个问题:
1. 从图片到HBITMAP到IXRImageSource,
其都由IXRBitmapImage 所包括了,用户只要提供了文件的完整路径了,
2.解释了为什么只要IXRImageSource
其SWE的框架当中,大量的使用了工厂模式,这应该是我们值得思考与学习的
同时IXRBitmapImage 其提供了IXRBitmapImage::SetBitmapSource(HBITMAP hBitmap)的方法,其能够方便未知
图片格式的显示。
问题:
ATL:CString 向const WCHAR * 转换。
解法:
只要强制类型转换就可以了,因为CString 重载了const WCHAR* 方法
如: CString str;
(const WCHAR*) str;
问题:
纠结于类与类之间的结构组织,在程序当中具体的表现为:自定义的一个控件,且有一个相联系的
MODEL类,此MODEL其要完成一些什么样的任务呢,其与CONTROLLER之间的联系。自定义控件其要完成一些什么样工作呢。
解法:
现打算这样执行: 自定义控件其提供操作控件的元素的接口,不进行任何逻辑处理。
此MODEL进行业务逻辑处理,而CONTROLLER 其进行对象的创建与任务的分配,流程的调遣,
重要原则:首先在VERSION 1.0 做出来,然后再谈功能与性能的增加与提高,否则只是白白的浪费时间.
问题:
error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
解法:
其已经说明了错误的原因: 缺少类型说明符 ,如方法的返回值类型是否写了呀
essential tips:
the main initialization will be performed inside our init method( it's not a good idea to put this kind of initialization
code inside the constructor because some API calls may fail and you don't have a way to return an error code
from a c++ constructor.
其与视频控件之间有联系,
在下来的视频播放器的实现当中,对于视频播放的控件:
IXRWin32Control + DirectShow,
完成实现了图片缩略图的显示
接下要实现图片浏览的功能