Windows CE嵌入式導航系統研究(應用程式相關)

來源:互聯網
上載者:User
1.1.1 TCPMP多媒體播放器

本系統中採用的多媒體播放器是TCPMP,TCPMP播放器播放速度很快且支援多達幾十中多媒體格式。TCPMP開源項目,同時支援Windows CE作業系統,而且提供很好的擴充性,例如需要重新編寫TCPMP介面只需重新編寫interface.plg即可。TCPMP提供全部的原始碼,移植非常方便,只需編譯後將產生的檔案拷貝到目標機器運行即可。TCPMP多媒體播放器介面非常簡潔, 5.35所示。

圖 5.37 TCPMP軟體介面

另外、TCPMP還支援應用整合,可以將TCPMP播放的核心移入到指定應用程式的指定介面位置,實現多媒體播放和其他任務同時工作的效果,常用於電梯廣告播放器平台上。

1.1.2 凱立德導航軟體

本系統的導航軟體採用凱立德公司的導航軟體,凱立德導航軟體經曆數10多年的發展,已經發展成為一款成熟的導航軟體平台。凱立德公司推出很多嵌入式、手機等平台的導航軟體版本,有支援Windows Mobile平台的、Symbian平台的,當然也有Windows CE平台。凱立德導航軟體介面 57所示。

另外,同行相比,凱立德導航軟體提示資訊比較全,高速公路上,前方的主要出入口距離有多少,服務區距離多少,全部有提示,而且可以根據前方服務區的距離,計劃你可以在哪兒休息,在哪兒加油。

圖 5.38 凱立德導航軟體

1.1.3 TQSHELL介面設計1. 設計說明

為了提供系統的互動性、可操作性,在本系統整合之際,還需要設計一個可用互動的介面軟體,並開機啟動該軟體,320×240解析度顯示。考慮系統本身功能比較獨立,在介面分塊的時候,主要提供了GPS導航、Internet、TCPMP、遊戲、常用工具和我的裝置等幾個調用功能,這樣介面清爽和簡潔, 5.39所示;

圖 5.39 TQSHELL介面

不僅如此,在我們開發板上還支援KEY鍵( 5.40所示),提供左右上下切換等功能。因此、在TASHELL介面設計的時候,我們同樣支援了KEY按鍵功能。支援KEY按鍵功能其實很簡單,只需響應OnKeyDown事件即可。

圖 5.40 KEY按鍵原理圖

2. 圖片繪製

整個TQSHELL介面採用的BMP圖片繪製的方式進行設計的,其中每個按鍵的效果展示都是由一張張圖片切換產生的效果。圖片繪製是TQSHELL介面設計的關鍵,如下詳細介紹圖片繪製的代碼實現,首先介紹CreateCompatibleDC[7]和BitBlt這兩個重要的函數。

(1) CreateCompatibleDC函數

該函數用於建立一個與pDC所指向的裝置環境相容的記憶體裝置環境——也稱記憶體裝置上下文。記憶體裝置環境是一塊用以顯示的記憶體塊,在複製記憶體配置圖像到實際的顯示裝置前用來儲存映像,這也正是避免閃屏的原因之所在,其函數原型如下;

virtual BOOL CreateCompatibleDC( CDC* pDC );

其中pDC指向一個裝置環境,在MFC中常用GetDC()擷取。如果pDC為空白,函數會建立一個與系統顯示相容的記憶體裝置環境。

調用該函數,當記憶體裝置環境建立後,GDI會自動為它裝載一個黑白位元影像。GDI的輸出函數只有當記憶體裝置環境上有了位元影像畫布之後,才能進行輸出。但是用該函數時,有一點需要注意,即該函數只能用來為支援光柵操作的裝置建立相容的裝置環境。

(2) BitBlt函數

如上所述,CreateCompatibleDC函數用於建立裝置上下文相容的記憶體裝置環境,BitBlt函數則用於從源裝置上下文(即記憶體裝置環境)拷貝位元影像到這個當前裝置上下文,該函數原型如下;

BOOL BitBlt( int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, DWORD dwRop );

l x 指定目標矩形左上方的邏輯x座標。

l y 指定目標矩形左上方的邏輯y座標。

l nWidth 指定目標矩形和源位元影像的寬度(邏輯單位)。

l nHeight 指定目標矩形和源位元影像的高度(邏輯單位)。

l pSrcDC 指向CDC對象的指標,標識待拷貝位元影像的裝置上下文。假如dwRop指定不包括源的光柵操作,則它必須為NULL。

l xSrc 指定源位元影像左上方的邏輯X座標。

l ySrc 指定源位元影像左上方的邏輯Y座標。

l dwRop 指定要執行的光柵操作。光柵作業碼定義GDC如何合并輸出操作中的顏色,包括當前畫刷、可能的源位元影像和目標位元影像。

使用BitBlt函數,應用可以在位元組邊界上對齊視窗或用戶端區域,保證BitBlt操作發生在以位元組對齊的矩形上。

在位元組對齊矩形上的BitBlt操作比未經位元組對齊的矩形上的BitBlt操作快許多。假如想對自己的裝置上下文指定位元組對齊類風格,必須登記視窗類別而不要依靠Microsoft基本類,可使用全域函數AfxRegisterWndClass。

一旦使用目標裝置上下文和使用源裝置上下文,GDI變形nWidth和nHeight。假如結果延伸不匹配,必要時GDI使用Windows StretchBlt函數壓縮或展開源位元影像。假如目標、源和特徵位元影像顏色格式不同,BitBlt轉換源和特徵位元影像以匹配目標,轉換中使用目標位元影像的前景和背景色。

BitBlt函數把單色位元影像轉換為彩色時,它設定白色(1)為背景色,黑色(0)作為前景色彩。使用目標裝置上下文的背景和前景色彩。要把彩色轉換為單色,BitBlt把與背景色匹配的像素設定為白色,其餘所有像素設定為黑色。在從彩色到單色的轉換中,BitBlt使用彩色裝置上下文的前景和背景色。

注意,並非所有的裝置上下文都支援BitBlt。為檢查給定裝置上下文是否支援BitBlt,使用GetDeviceCaps成員函數並指定RASTERCAPS索引。

瞭解這兩個函數的作用之後,編寫繪圖程式就相當簡單了,TQSHELL介面中繪圖程式如程式清單 5‑55所示;

程式清單 5‑55 繪製圖片代碼

CDC* pDC = GetDC () ;

CDC memDC ;

memDC.CreateCompatibleDC ( pDC ) ;

CBitmap bmp,bmp1 ;

CBitmap* pOldBitmap ;

bmp1.LoadBitmap ( m_map) ;

pOldBitmap = memDC.SelectObject ( &bmp1 ) ;

pDC->BitBlt ( m_rect[i].TopLeft().x, m_rect[i].TopLeft().y, m_rect[i].Width(),

m_rect[i].Height(), &memDC, 0, 0, SRCCOPY ) ;

memDC.SelectObject ( pOldBitmap ) ;

memDC.DeleteDC () ;

ReleaseDC ( pDC ) ;

3. 按鍵模仿

在系統中,考慮到如果TQSHELL所有的事件都是硬實現而沒有動態效果的話未免有失系統互動性,因此在TQSHELL中,我們採用了雙圖片切換的方式來類比按鍵觸發, 5.41、圖 5.42所示。

圖 5.41 按鍵之前

圖 5.42 按鍵之後

按鍵模仿需要響應兩個事件,一個OnLButtonDown、另一個是OnLButtonUp。當OnLButtonDown事件發生之後,圖片切換,當OnLButtonUp事件發生之後,圖片恢複,代碼如程式清單 5‑56、程式清單 5‑57所示。

程式清單 5‑56 OnLButtonDown事件

bmp.LoadBitmap ( IDB_GPS_W ) ;

CBitmap* pOldBitmap = memDC.SelectObject ( &bmp ) ;

pDC->BitBlt ( m_rect[m_prePick].TopLeft().x, m_rect[m_prePick].TopLeft().y, m_rect[m_prePick].Width(),

m_rect[m_prePick].Height(), &memDC, 0, 0, SRCCOPY ) ;

memDC.SelectObject ( pOldBitmap ) ;

程式清單 5‑57 OnLButtonUp事件

CopyBMP(IDB_GPS_W,0);

4. KEY按鍵響應

硬體平台的設計過程當中,考慮到操作的方便,增加了KEY按鍵的實現,主要針對上下左右等幾個功能。在TQSHELL為很好的利用這樣的條件,以增加系統的可互動性,在實現的過程當中,響應KEY按鍵事件。支援KEY按鍵其實很簡單,只需實現OnKeyDown事件即可,事件的實現的時候,有一點需要注意,KEY按下之後,前一個KEY應當恢複,KEY按鍵響應函數如程式清單 5‑58所示。

程式清單 5‑58 OnKeyDown事件

void CGPSDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)

{

m_prePick=m_currentPick ;

if ( nChar == VK_UP|| nChar == VK_LEFT )

{

switch (m_prePick)

{

case 0:

//GPS黑別的白

CopyBMP(IDB_GPS_B,0);

CopyBMP(IDB_MP3_W,1);

CopyBMP(IDB_MP4_W,2);

CopyBMP(IDB_PICTURE_W,3);

CopyBMP(IDB_TOOL_W,4);

CopyBMP(IDB_SET_W,5);

m_currentPick = 0 ;

break ;

......

}

}

if ( nChar == VK_DOWN || nChar == VK_RIGHT)

{

switch (m_prePick)

{

case 0:

//MP3黑別的白

CopyBMP(IDB_GPS_W,0);

CopyBMP(IDB_MP3_B,1);

CopyBMP(IDB_MP4_W,2);

CopyBMP(IDB_PICTURE_W,3);

CopyBMP(IDB_TOOL_W,4);

CopyBMP(IDB_SET_W,5);

m_currentPick = 1 ;

break ;

......

default:

break;

}

}

CDialog::OnKeyDown(nChar, nRepCnt, nFlags);

}

5. 進程調用

TQSHELL介面程式是一個系統整合介面程式,為保證系統能運行,TQSHELL必須實現進程調用,調用子軟體運行,實現如GPS導航、多媒體播放等方面的操作。在MFC中,進程調用的函數有很多中,但是在本系統中支援ShellExecuteEx函數,如下介紹ShellExecuteEx函數,介紹ShellExecuteEx之前,我先介紹SHELLEXECUTEINFO結構體[8]。

(1) SHELLEXECUTEINFO結構體

該結構體作為參數輔助ShellExecuteEx函數的調用進程,指定需要調用的進程相關的參數,該結構體原型如程式清單 5‑59所示;

程式清單 5‑59 SHELLEXECUTEINFO 結構體

typedef struct _SHELLEXECUTEINFO {

DWORD cbSize;

ULONG fMask;

HWND hwnd;

LPCTSTR lpVerb;

LPCTSTR lpFile;

LPCTSTR lpParameters;

LPCTSTR lpDirectory;

int nShow;

HINSTANCE hInstApp;

LPVOID lpIDList;

LPCTSTR lpClass;

HKEY hkeyClass;

DWORD dwHotKey;

union {

HANDLE hIcon;

HANDLE hMonitor;

} DUMMYUNIONNAME;

HANDLE hProcess;} SHELLEXECUTEINFO, *LPSHELLEXECUTEINFO;

在進程調用的過程當中,SHELLEXECUTEINFO結構體中的這些參數是可以選擇性的設定,如下一一介紹。

l lpDirectory:可選。指明工作目錄的名字,成員沒有說明,則預設為目前的目錄

l nShow:必須。指定開啟的程式的顯示方式,為SW_值中的一個。

l hInstApp:用於輸出,如果設定SEE_MASK_NOCLOSEPROCESS S值並且ShellExecuteEx 調用成功,則該項的值大於32,如果調用失敗,則將設定為 SE_ERR_XXX 的錯誤值。

l lpIDList:一個ITEMIDLIST結構的地址,用來儲存成員的特別標識符,當fMask不包括SEE_MASK_IDLIST或SEE_MASK_INVOKEIDLIST時該項被忽略

l lpClass:用以指明檔案類別的名字或GUID,當fMask不包括SEE_MASK_CLASSNAME時該項被忽略

l hkeyClass:獲得已在系統註冊的檔案類型的Handle,當fMask不包括SEE_MASK_HOTKEY時該項被忽略

l dwHotKey:程式的熱鍵關聯,低位儲存虛擬關鍵碼(Key Code),高位儲存修改標誌位(HOTKEYF_),修改標誌為(modifier flags)的詳細列表請看WM_SETHOTKEY訊息的描述,當fmask不包括SEE_MASK_HOTKEY時該項被忽略

l hIcon :取得對應檔案類型的表徵圖的Handle,當fMask不包括SEE_MASK_ICON時該項被忽略

l hMonitor :將文檔顯示在顯示器上的Handle,當fMask不包括SEE_MASK_HMONITOR時該項被忽略

l hProcess:指向新啟動的程式的控制代碼。若fMask不設為SEE_MASK_NOCLOSEPROCESS則該項值為NULL。但若程式沒有啟動,即使fMask設為SEE_MASK_NOCLOSEPROCESS,該值也仍為NULL。

(2) ShellExecuteEx函數

ShellExecuteEx函數以SHELLEXECUTEINFO結構體為參數,用於調用SHELLEXECUTEINFO結構體中指定的進程,該函數原型如下;

BOOL ShellExecuteEx(LPSHELLEXECUTEINFO lpExecInfo);

瞭解SHELLEXECUTEINFO結構體和ShellExecuteEx函數之後,TQSHELL中調用ShellExecuteEx函數實現進程調用,代碼實現其實很簡單,如程式清單 5‑60所示;

程式清單 5‑60 進程調用

tem = L"//Storage Card//KLD//NaviOne.exe";

exeshell.cbSize = sizeof(SHELLEXECUTEINFO);

exeshell.lpFile = tem;

exeshell.hwnd = NULL;

exeshell.nShow = SW_SHOW;

ShellExecuteEx(&exeshell);

DesktopBar=::FindWindow(L"HHTaskBar",NULL);

::ShowWindow(DesktopBar,SW_HIDE);

6. 核心載入

TQSHELL編譯完成之後,獲得TQSHELL.EXE和TQSHELL.LIB檔案之後,為了方便開機就啟動本介面,我們需要將這兩個檔案加入到核心中,載入到核心中的步驟如下;

(1) 編輯LNK檔案

該檔案其實就是一個快捷檔案,點擊可直接運行指定目錄下的應用程式。該檔案的內容 5.43所示;

圖 5.43 LNK檔案內容

(2) 載入到核心當中

在Windows CE中,需要將應用程式載入到核心當中,只需編輯Pratfrom.bib檔案即可, 5.44所示;

圖 5.44 載入TQSHEEL.exe到核心

(3) Windows CE啟動後直接運行TQSHELL.exe程式

Windows CE支援啟動直接運行使用者程式,設定很簡單,因為Windows CE啟動後預設是啟動explorer.exe程式,如果要替換成指定的應用程式,只需設定相關的註冊表即可,如程式清單 5‑60所示;

程式清單 5‑61 啟動註冊表

[HKEY_LOCAL_MACHINE/init]

"Launch50"="Windows//TQSHELL.EXE"

"Depend50"=hex:14,00,1e,00

Windows CE啟動之後,TQSHELL.EXE啟動並執行介面比起原始Windows CE介面要清爽很多, 5.45、圖 5.46所示;

圖 5.45 主介面

圖 5.46 常用工具介面

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.