前幾天,我的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次在全屏幕上顯示隨機大小、隨機顏色的方塊,按任意鍵或觸筆點擊退出。
下面是昨天晚上最后的程序源碼(在事件查詢循環上好像有點邏輯問題,有時候退不出程序,待修正):
- program Test;
- uses windows, sysutils, sdl;
- var
- screen: PSDL_Surface;
- event: TSDL_Event;
- draw_count:int64=0;
- done:boolean;
- l,t:integer;
- procedure Draw_Box(screen:PSDL_Surface; x,y,w,h:dword; r,g,b:dword);
- var
- p:PByte;
- p2:PWord;
- i,j:dword;
- c:dword;
- begin
- if SDL_MUSTLOCK(screen) then begin
- if SDL_LockSurface(screen) < 0 then exit;
- end;
- c := SDL_MapRGB(screen^.format, R, G, B);
- assert (screen^.format^.BytesPerPixel=2);
- p := screen^.pixels + y*screen^.pitch + x*screen^.format^.BytesPerPixel;
- for j:=1 to h do begin
- p2:=PWord(p);
- for i:=1 to w do begin
- p2^:=c;
- inc(p2);
- end;
- inc(p,screen^.pitch);
- end;
- if SDL_MUSTLOCK(screen) then SDL_UnlockSurface(screen);
- SDL_UpdateRect(screen, x, y, w, h);
- end;
- procedure HandleKey(key: TSDL_KeyboardEvent);
- begin
- done:=true;
- end;
- //main at here
- begin
- SDL_Init(SDL_INIT_VIDEO or SDL_INIT_AUDIO);
- screen := SDL_SetVideoMode(320, 240, 16, SDL_HWSurface);
- SDL_WM_SetCaption('My SDL',nil);
- while not done do begin
- //Set_Pixel(screen,random(320),random(240),random(255),random(255),random(255));
- l:=random(320-40);
- t:=random(240-30);
- Draw_Box(Screen,l,t,random(320-40-l)+41,random(240-30-t)+31,random(255),random(255),random(255));
- inc(draw_count);
- while SDL_PollEvent(@event)<>0 do begin
- case event.type_ of
- SDL_MouseButtonDown,
- SDL_QUITEV, SDL_KEYDOWN,SDL_KEYUP: done := true;
- //handleKey(event.key);
- end;
- end;
- SDL_Delay(50);
- end;
- SDL_Quit();
- end.
復制代碼 接下來打算搞點有實際用處的程序,比如說一個文本閱讀器,使用24點陣字體;還要嘗試是否能將一些 sdl 輔助庫(比如:SDL_Mixer)編譯成 ARM-WinCE 可用的 DLL。