介绍下先——这是一个在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()里面的屏幕操作语句:
- pDC->BitBlt(0,0,docWidth,docHeight,memDC,0,0,SRCCOPY);
- CPoint d_point=GetScrollPosition();
- pDC->BitBlt(0,0,docWidth,docHeight,memDC,d_point.x,d_point.y,SRCCOPY);
题外话:WINCE的应用程序开发终于告一段落了,接下来公司要我学习驱动方面的知识——对于我这个从未学过电子电路、微机原理等硬件知识的菜鸟程序员来说,确实是一个挑战!没办法,既然选择了嵌入式,就必须做到软硬结合。