WINCE应用程序开发小记之文档、图片浏览器


    介绍下先——这是一个在WINCE环境下察看文档、图片的小应用程序,功能是要像PDF、ACDSEE那样实现对文档、图片的拖动察看。为什么要做这个软件?Windows下面不是有很多此类应用程序吗?这就是WINCE,作为一个付费平台,你选择的自带应用组件越多,付费也越多。。我们手头的WINCE系统就看不了图片,文档也只能用WORD打开。

    言归正传,先说下文档浏览的实现:我使用的方法是逐行读取文档内容,然后保存到一个CStringList对象中,显示的时候只要设置好字体,然后调用ExtTextOut()函数就行。值得一提的是,由于WINCE是UNICODE环境,所以所有的文档操作都要使用宽字符版本的接口,如_wfopen()、fgetws();显示文本要用ExtTextOut()函数——WINCE不支持TextOut()函数。

    接下来要解决的是图片浏览,花了我很多时间,毕竟在WINCE如此精简的API里面找个好的图形接口也不那么容易。一开始我想到的是LoadBitmap(),不过它只支持打开resource文件。接下来尝试了LoadImage()、IPicture类,都未能成功(WINCE不支持)!后来在某位仁兄的BLOG中看到一篇《在EVC中使用IImage、IImagingFactory类显示图片》的帖子,一试,果然在触摸屏上看到了久违的图片!并且还支持JPG等其他图片格式,受益匪浅!这里还有一点要注意:由于IImage类的显示函数Draw()速度较慢,因此不适合像LoadBitmap()那样放在WM_PAINT响应函数里面调用。还好可以用双缓冲技术解决:在图形文件打开处理函数里面将图片Draw()到一全局内存DC中,然后每次响应WM_PAINT消息时,只要使用显示DC BitBlt()所保存的内存DC就行,速度很快!

    文档、图片都能在触摸屏上正常显示了,还得实现拖动功能才行。这个功能在WIN32上很快就实现了,只要给由CScrollView派生的MyView视图类添加WM_LBUTTONDOWN、WM_LBUTTONUP、WM_MOUSEMOVE相应事件处理就行,这里我在WM_MOUSEMOVE中使用的是OnScrollBy()函数。在WIN32上可以说完工了,立马用同样的方法在EVC中BUILD了一个EXE,放WINCE平台下一跑,竟然拖动不了,一拖动就会花屏。。先贴上我在OnDraw()里面的屏幕操作语句:
  1. pDC->BitBlt(0,0,docWidth,docHeight,memDC,0,0,SRCCOPY);
    由于每次拖动视图都会触发WM_PAINT事件,所以这里的屏幕操作很关键。这个语句在WIN32上没任何问题,由于默认使用的文档坐标,每次BitBlt()时都显示正常。但在WINCE平台上,很小心的拖动后我发现每次BitBlt()时都会从文档的(0,0)坐标开始重画,造成屏幕花屏!看来问题就出在WINCE跟WIN32的视图/文档结构所使用的坐标系统的不同。知道问题所在后就好解决了,下面是修改后的在WINCE下的屏幕操作语句:
  1. CPoint d_point=GetScrollPosition();  
  2. pDC->BitBlt(0,0,docWidth,docHeight,memDC,d_point.x,d_point.y,SRCCOPY);
    可以实现拖动了,不过问题却依然存在:每次拖动时屏幕的刷新速度都很慢,以至于快速拖动时会花屏!不过在WIN32上拖动是没有任何问题的。是不是因为小机的硬件速度跟不上?我们采用的ARM芯片已经达到了500+MHZ,跟奔3都差不多了,按理说处理图片,速度应该没问题。仔细检查了几遍代码,尝试着用一些其他方法去实现显示跟拖动,终于在拖动处理这里找到了问题所在:OnScrollBy()。这个函数在WIN32上使用没任何异常,不过在WINCE平台下,可能硬件速度的原因,会很慢!于是改为使用OnVScroll(),OnHScroll(),至此问题终于圆满解决~!

    题外话:WINCE的应用程序开发终于告一段落了,接下来公司要我学习驱动方面的知识——对于我这个从未学过电子电路、微机原理等硬件知识的菜鸟程序员来说,确实是一个挑战!没办法,既然选择了嵌入式,就必须做到软硬结合。
 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值