Rss & SiteMap

曙海教育集团论坛 http://www.bjzhda.cn

曙海教育集团论坛
共1 条记录, 每页显示 10 条, 页签: [1]
[浏览完整版]

标题:我的 ARM-WinCE 编程探索之旅(二)

1楼
wangxinxin 发表于:2010-11-26 10:04:49
前几天,我的HP 1715终于修好了,重新换了块屏,解决了触屏失灵及自己拆机把背光弄没的问题(在 pdafans 上询问多日,毫无结果)。我的编程探索又可以继续了。
经过多次测试,找到了使用 FPC(Free Pascal Compiler)加 SDL(SImple DirectMedia Layer)进行 ARM-WinCE 图象编程的途径(最终,建立过程中还是不得不借助于M$的开发工具eVC)。

1、从 http://www.libsdl.org/download-1.2.php 下载最新的 SDL 1.2.13 源码,解压其中 src 和 include 到 c:\,解压其中 visualce.zip 到 c:\VisualCE。

2、下载并安装eMbedded Visual C++ 4.0(同时附带安装了Platform SDK),运行,打开WorkSpace文件 c:\VisualCE\*.vcw,修改工程配置为 arm4,release,然后 Build SDL.DLL,生成 ARM-WinCE 下用的 SDL.DLL,约220K大小,将 SDL.DLL 拷入 PPC。

3、从 http://www.hu.freepascal.org/lazarus/ 下载并安装最新的 Lazarus + fpc 2.2.5 win32 -> arm wince。修改 \lazarus\fpc\2.2.5\source\packages\sdl\src\sdl.pas 的源码,注释掉连续的多个 *getenv 和 *putenv 二函数,再用 ppcrossarm.exe 编译 sdl.pas,得到libimpsdl.a、sdl.o、sdl.ppu三个文件,覆盖原 \lazarus\fpc\2.2.5\units\arm-wince\sdl\ 下的文件。

至此,FPC+SDL的WinCE图形编程环境构建完成。

接下来,将前些日子根据 PGCC 示例用 FPC 改写的一个简单的桌面版 SDL 测试程序,重新用 ppcrossarm.exe 编译,生成的EXE文件大小为82K,只导入了额外的 SDL.DLL(前面已经放入PPC),在PPC上运行通过。运行时会先出现 SDL 初始化的控制台窗口,显示一些视频信息(桌面版的SDL也是如此,类似于dosbox的运行),其运行结果是每秒20次在全屏幕上显示随机大小、随机颜色的方块,按任意键或触笔点击退出。

下面是昨天晚上最后的程序源码(在事件查询循环上好像有点逻辑问题,有时候退不出程序,待修正):
  1. program Test;
  2. uses windows, sysutils, sdl;

  3. var
  4.         screen: PSDL_Surface;
  5.         event: TSDL_Event;
  6.         draw_count:int64=0;
  7.         done:boolean;
  8.         l,t:integer;

  9. procedure Draw_Box(screen:PSDL_Surface; x,y,w,h:dword; r,g,b:dword);
  10. var
  11.         p:PByte;
  12.         p2:PWord;
  13.         i,j:dword;
  14.         c:dword;
  15. begin
  16.         if SDL_MUSTLOCK(screen) then begin
  17.                 if SDL_LockSurface(screen) < 0 then exit;
  18.         end;

  19.         c := SDL_MapRGB(screen^.format, R, G, B);
  20.         assert (screen^.format^.BytesPerPixel=2);
  21.         p := screen^.pixels + y*screen^.pitch + x*screen^.format^.BytesPerPixel;
  22.         for j:=1 to h do begin
  23.                 p2:=PWord(p);
  24.                 for i:=1 to w do begin
  25.                         p2^:=c;
  26.                         inc(p2);
  27.                 end;
  28.                 inc(p,screen^.pitch);
  29.         end;

  30.         if SDL_MUSTLOCK(screen) then SDL_UnlockSurface(screen);
  31.         SDL_UpdateRect(screen, x, y, w, h);
  32. end;

  33. procedure HandleKey(key: TSDL_KeyboardEvent);
  34. begin
  35.         done:=true;
  36. end;

  37. //main at here
  38. begin
  39.         SDL_Init(SDL_INIT_VIDEO or SDL_INIT_AUDIO);
  40.         screen := SDL_SetVideoMode(320, 240, 16, SDL_HWSurface);
  41.         SDL_WM_SetCaption('My SDL',nil);

  42.         while not done do begin
  43.                 //Set_Pixel(screen,random(320),random(240),random(255),random(255),random(255));
  44.                 l:=random(320-40);
  45.                 t:=random(240-30);

  46.                 Draw_Box(Screen,l,t,random(320-40-l)+41,random(240-30-t)+31,random(255),random(255),random(255));
  47.                 inc(draw_count);
  48.                 while SDL_PollEvent(@event)<>0 do begin
  49.                               case event.type_ of
  50.                               SDL_MouseButtonDown,
  51.                                 SDL_QUITEV, SDL_KEYDOWN,SDL_KEYUP: done := true;
  52.                                       //handleKey(event.key);
  53.                         end;
  54.                 end;
  55.                 SDL_Delay(50);
  56.         end;

  57.         SDL_Quit();
  58. end.
复制代码
接下来打算搞点有实际用处的程序,比如说一个文本阅读器,使用24点阵字体;还要尝试是否能将一些 sdl 辅助库(比如:SDL_Mixer)编译成 ARM-WinCE 可用的 DLL。

共1 条记录, 每页显示 10 条, 页签: [1]

Copyright © 2000 - 2009 曙海教育集团
Powered By 曙海教育集团 Version 2.2
Processed in .01563 s, 2 queries.