如何維護用於 Pocket PC 和 Smartphone

來源:互聯網
上載者:User

概述
為了使應用程式的維護和支援工作儘可能少,應該儘可能使您計劃支援的平台都用統一的原始碼。按照以下技巧,您甚至可以使一個二進位檔案在兩個平台上都能運行。如果您的目標是所有版本的 Pocket PC 和 Smartphone,那麼使大多數商務邏輯代碼保持同步是相對簡單的方式,因為所有 Pocket PC 和 Smartphone 版本都是基於 Microsoft Windows CE 的。新版本的 Pocket PC 2003 和 Smartphone 2003 使用 Windows CE 4.2,並且需要 eMbedded Visual Tools 4.0 (eVT 4.0)。而舊的裝置仍然使用 eMbedded Visual Tools 3.0 (eVT 3.0)。

關鍵代碼技巧
為平台執行運行時檢查

許多開發人員都是檢查螢幕解析度,然後使用該資訊來確定承載應用程式的是什麼平台。市場上有幾種工具可以更改 Pocket PC 的螢幕解析度(例如,Nydidot 的 Virtual Display 或 Jimmysoft 的 JS Landscape)。檢測平台的正確方式是:

#define POCKETPCV1   1
#define SMARTPHONEV1   2
#define POCKETPCV2   3
#define SMARTPHONEV2   4
int MyDeviceType()
{
TCHAR szPlatform[MAX_STRING_BUFFER];
int iDeviceType=0;
   OSVERSIONINFO osVer;
   GetVersionEx(&osVer);
   if (osVer.dwMajorVersion==3)
{
if (SystemParametersInfo(SPI_GETPLATFORMTYPE,
sizeof(szPlatform),szPlatform,0)!=0)
      {
if (lstrcmp(szPlatform,TEXT("PocketPC"))==0)
                  iDeviceType= POCKETPCV1; // runs on Pocket PC 2000 and 2002
            else if (lstrcmp(szPlatform,TEXT("Smartphone"))==0)
                  iDeviceType= SMARTPHONEV1; // runs on Smartphone 2002
}  
else
{
   if (GetLastError()==ERROR_ACCESS_DENIED)   //(5)
      iDeviceType= SMARTPHONEV1;      // is a smartphone:
      // Smartphone creates an access denied error on
      // SystemParametersInfo()
}
}
else
{
      if (osVer.dwMajorVersion==4)
   {
   if (SystemParametersInfo(SPI_GETPLATFORMTYPE,
sizeof(szPlatform),szPlatform,0)!=0)
           {
if (lstrcmp(szPlatform,TEXT("PocketPC"))==0)
                  iDeviceType= POCKETPCV2;      // runs on Pocket PC 2003
            else if (lstrcmp(szPlatform,TEXT("Smartphone"))==0)
                  iDeviceType= SMARTPHONEV2;      // runs on Smartphone 2003
   }  
   else
   {
      if (GetLastError()==ERROR_ACCESS_DENIED) //(5)
         iDeviceType= SMARTPHONEV2;         // is a smartphone:
         // Smartphone creates an access denied error on
         // SystemParametersInfo()
   }
}
}
return iDeviceType;
}在 Smartphone 上,調用“SystemParametersInfo()”可能會因“Access Denied”而失敗,這取決於 Smartphone 是否鎖定和應用程式簽署的認證。因為只有這種平台才會因 Access Denied 而調用失敗,所以您也可以用它作為 Smartphone 的標記。

檢查螢幕解析度

雖然我描述了應該如何檢查平台而不是通過檢查螢幕解析度來檢測平台類型,但是一旦知道了平台,您還需要知道裝置的螢幕解析度。再次強調,不要假設 Pocket PC 或 Smartphone 有任何固定的解析度。Windows Mobile 今後版本將支援不同的螢幕解析度和方向。

一旦知道了螢幕解析度,您就可以調整視窗來適合它。如果您的應用程式基底於對話方塊,您必須為想要支援的每種解析度建立獨立的對話方塊資源,或手動將控制項放在對話方塊中。不管哪種情況,您都應該將控制項放在 WM_SIZE 處理常式中。

最小化功能表項目

嘗試將菜單限制為兩個主菜單,而且最多七個子功能表。

Smartphone 有兩個熱鍵,對應於兩個螢幕菜單。對於 Pocket PC,我建議也不要為了改進使用者介面設計而超過這一限制。另外,避免使用串聯功能表。Smartphone 不支援這個功能,它會使大多數 Pocket PC 使用者不知所措。

將通用對話方塊的使用限制在最低限度

Smartphone 不支援通用對話方塊。如果您需要儲存檔案,要麼請求名稱,要麼自動產生某些描述名稱,然後將它儲存到“My Documents”。當您想要檢索檔案時,請將應用程式可以載入的所有檔案填充到一個微調控制項中,讓使用者從中選擇一個檔案。

Pocket PC 不支援用於儲存和載入的通用對話方塊,但您應該為 Pocket PC 考慮相同的方法,這樣不僅更方便於使用,也可以使代碼保持同步。如果您的應用程式需要“Save File”或“Load File”對話方塊,您就應該在 Pocket PC 中使用通用對話方塊。

只儲存到“My Documents”並從中載入

Pocket PC 和 Smartphone 是為那些還不想在旅途中管理儲存區的使用者構建的。如果您必須將某些東西儲存到儲存媒體或者從中載入,請使用“My Documents”檔案夾來儲存資料。當在裝置中插入儲存卡時,可能又會產生一個問題,需要詢問使用者:“是否儲存到儲存卡中?”。

下面是一小段代碼,它告訴您如何發現儲存卡:

void ShowFlashCard()
{
BOOL bContinue = TRUE;         
HANDLE hFlashCard;             
WIN32_FIND_DATA lpwfdFlashCard;   
   hFlashCard = FindFirstFlashCard (&lpwfdFlashCard);
   if (hFlashCard == INVALID_HANDLE_VALUE)
      return;
   while (bContinue)
   {
      MessageBox(NULL,lpwfdFlashCard.cFileName,
                       TEXT("FindFlash"),MB_OK);
      bContinue = FindNextFlashCard (hFlashCard,
                                           &lpwfdFlashCard);
   }
   FindClose (hFlashCard);  // Close the search handle.
}在 Smartphone 中,My Documents 檔案夾不在根目錄中。如果您寫入程式碼為“/My Documents”,則應用程式不會儲存到 Smartphone 的持久位置中。德語版的 Pocket PC 的這個目錄名稱為“/Meine Dokumente”,這樣的調用也會失敗。相反,應該使用以下的調用來擷取指向“My Documents”的正確路徑。

SHGetSpecialFolderPath(NULL,szTxt,CSIDL_PERSONAL,0);CSIDL_PERSONAL 請求“My Documents”檔案夾以 szTxt (TCHAR) 形式返回。

為每個平台建立資源或者使用“condition”屬性

如果您想讓相同的二進位檔案既可用於 Pocket PC,又可用於 Smartphone,您必須建立兩種資源定義,一個平台一種。如果您只想使原始碼保持同步,您可以使用資源的“condition”屬性來包含正確的資源。

假如您想讓二進位檔案具有相容性,您需要在代碼中載入 Pocket PC 或 Smartphone 資源:

switch (iDeviceType)   // Determined with tip -1- above
      {
         case SMARTPHONEV1:
         case SMARTPHONEV2:
               idd=IDD_SMARTPHONE;
            break;
         case POCKETPCV1:
         case POCKETPCV2:
               idd=IDD_POCKETPC;
            break;
         default:
               idd=IDD_HPC;
            break;
      }
      return DialogBox(hInst,MAKEINTRESOURCE(idd),
                     hWndMain,(DLGPROC)StartDlgMain);如果您使用資源的 Condition 屬性,請在 condition 欄位中放入“WIN32_PLATFORM_WFSP”(對於 Smartphone)和“WIN32_PLATFORM_PSPC”(對於 Pocket PC)。請記住 Palm-size PC(Pocket PC 的前身)和最近出現的 Pocket PC 2003 與 Smartphone 有相同的定義,所以如果您想加以區分,您需要建立自己的定義。如果您試圖保持二進位檔案/可執行檔的平台無關性,您必須對不同平台使用不同資源,但將二者都包含在資源檔中。

動態載入 Pocket PC 和 Smartphone 的特定庫

您可以看到,這是有助於開發的最重要的技巧。任何時候載入以下 DLL 的其中一個時,請確保使用“LoadLibrary”和“GetProcAddress”,而不是將 DLL 靜態連結到應用程式:

AYGSHELL.DLL (AYGSHELL.LIB/AYGSHELL.h)。包含所有 SIP、SH… 和其他特定於 Pocket PC 的函數。該 DLL 也可用於 Smartphone,但有不同的功能集。

CELLCORE.DLL (CellCore.LIB/TSP.h and others)。這個 DLL 只存在於 Pocket PC 2002 Phone Edition 和 Smartphone,而不存在於 Pocket PC 2000。它包含了用於連線管理員和進行撥打電話的所有函數。

在運行時載入這些 DLL 可以讓您開發一些智能的錯誤處理,它仍然允許應用程式在不具備這些庫所提供的功能的情況下運行。如果這些庫在編譯過程中靜態連結,則在 Pocket PC 2002 上應用程式甚至不會啟動,因為它試圖載入這些 DLL 並給出錯誤“One or more components are missing”。

如果您只想使原始碼保持同步,您不需要這樣做;而可以將這些庫連結到編譯過程中。然而要注意,每次在 Pocket PC 2000 和 Pocket PC 2002 編譯過程間切換時,都必須手動取出 cellcore.lib。

不要假設有觸控螢幕

Smartphone 沒有觸控螢幕,而 Pocket PC 沒有數字鍵可以點擊,但這兩種裝置都支援 D-pad 的類似於鍵盤的導航。因此,如果您想保持原始碼同步,所有需要導航的使用者輸入都應該通過 D-pad 導航來實現。Pocket PC 中的菜單是通過觸控螢幕啟用的,而在 Smartphone 中是通過熱鍵啟用的。但因為平台會為您處理該輸入,所以您不需要為此擔心。

小結
雖然保持代碼同步需要做的相對較少,但只維護一種原始碼所帶來的好處是巨大的。大多數問題都是因為螢幕大小和輸入方法的不同引起的。如果您遵循以上的技巧,您就能夠編寫出很酷的跨平台應用程式

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.