發(fā)布日期 : 8/17/2004 | 更新日期 : 8/17/2004
Microsoft
適用范圍:
Windows Mobile™ 2003 第二版軟件
基于 Windows Mobile™ 的 Pocket PC
摘要:了解基于 Windows Mobile 的設(shè)備如何在橫豎向模式下顯示、該功能的后臺(tái)情況、為該功能開發(fā)移動(dòng)應(yīng)用程序的相關(guān)信息、開發(fā)者指南中新的建議和示例。
請(qǐng)從 Microsoft 下載中心下載 Crossword.msi。
本頁(yè)內(nèi)容
引言
更改屏幕方向
應(yīng)用程序窗口如何識(shí)別屏幕方向
刷新屏幕內(nèi)容
RelayoutDialog
原有應(yīng)用程序的特性
安裝警告消息
結(jié)論
引言
Windows Mobile 2003 第二版軟件為 Pocket PC 引入了新的功能,使基于 Windows Mobile 的設(shè)備可在橫豎向兩種模式下顯示。在有些設(shè)備中,橫向是默認(rèn)的顯示模式。此外,用戶將能在使用中讓屏幕在兩種方向之間切換,而不必重新設(shè)置設(shè)備。
本文提供了有關(guān)該功能的后臺(tái)信息、并介紹了開發(fā)適用于橫豎向屏幕的移動(dòng)應(yīng)用程序的相關(guān)信息。此外,還向開發(fā)者提供了新的指南(包括一些建議和示例)供參考。
更改屏幕方向
通常,屏幕方向僅在用戶使用“屏幕方向”控制面板,或按下某硬件按鈕來(lái)旋轉(zhuǎn)屏幕時(shí)才改變。
此外,應(yīng)用程序也可通過(guò) ChangeDisplaySettingsEx 函數(shù)以編程方式更改屏幕方向。該函數(shù)使用方法見(jiàn) MSDN 中“Rotating the Content of the Screen”(旋轉(zhuǎn)屏幕內(nèi)容的方向)一文。例如,如果使用的應(yīng)用程序只能在豎向模式下操作,則可通過(guò)編程改變屏幕方向。但是,如果屏幕方向的改變很突然,通過(guò)編程改變屏幕方向會(huì)讓用戶搞不清楚。應(yīng)用程序應(yīng)始終要求用戶在旋轉(zhuǎn)屏幕前確認(rèn)顯示模式。
為了在豎向模式下顯示,將 dmDisplayOrientation 字段中的 DEVMODE 結(jié)構(gòu)設(shè)置為 DMDO_0。對(duì)于右手橫向模式,使用 DMDO_270。對(duì)于左手橫向模式,使用 DMDO_90。
應(yīng)用程序窗口如何識(shí)別屏幕方向
屏幕方向如果改變,或當(dāng)“輸入面板”出現(xiàn)時(shí),應(yīng)用程序的所有全屏頂層窗口都要適應(yīng)新的取向。
注意: 如果窗口的上、左、右坐標(biāo)在工作區(qū)域邊界之上或之外,該窗口被認(rèn)為是全屏窗口。工作區(qū)域是標(biāo)題欄下的整個(gè)屏幕區(qū)域。頂層窗口是無(wú)父窗口的窗口,即有一個(gè) NULL 父窗口。
如果窗口大小改變,窗口將收到 WM_SIZE 通知。WM_SIZE 消息的 lParam 參數(shù)的低位字指定了客戶端區(qū)域的新寬度,高位字指定了客戶端區(qū)域的新高度。應(yīng)用程序應(yīng)識(shí)別窗口大小的改變,并相應(yīng)地更新窗口布局。此外,也應(yīng)重新確定所包含任何子窗口的布局。
如果應(yīng)用程序沒(méi)有全屏窗口,它收不到 WM_SIZE 通知。相反,它應(yīng)在 wParam 參數(shù)設(shè)置為 SETTINGCHANGE_RESET 時(shí)監(jiān)聽 WM_SETTINGCHANGE消息。
注意: 如果應(yīng)用程序有頂層窗口,或使用 SHHandleWMSettingChange、SHInitDialog 和 SHFullScreen 方法創(chuàng)建了窗口,它會(huì)同時(shí)收到 WM_SIZE 和 WM_SETTINGCHANGE 消息。但是,如果應(yīng)用程序創(chuàng)建了子窗口,子窗口收不到 WM_SIZE 消息,即使子窗口是全屏窗口。
以下 WindowProc 模板的代碼示例利用了 WM_SIZE 和 WM_SETTINGCHANGE 消息。
switch (uMessage)
{
case WM_SIZE:
// 重新計(jì)算所有子窗口的布局;重新設(shè)置
// 列出視圖和編輯框的大小,重新確定按鈕、
// 靜態(tài)文字和其他控件的位置。
break;
case WM_SETTINGCHANGE:
if (SETTINGCHANGE_RESET == wParam) {
// 屏幕方向改變。此時(shí)
// 執(zhí)行 WM_SIZE 不能執(zhí)行的處理,
// 如重新調(diào)整全屏子窗口的大小,對(duì)
// 頂層窗口調(diào)用 MoveWindow 等等。
// 如果不需要處理 WM_SETTINGCHANGE 消息,可以
// 忽略它。
}
break;
}
刷新屏幕內(nèi)容
使用 Windows Mobile 2003 第二版軟件時(shí),Pocket PC 的最小顯示區(qū)域是 240 個(gè)像素高和 240 個(gè)像素寬。編程人員應(yīng)保證應(yīng)用程序在最低配置下可用。常見(jiàn)問(wèn)題是,菜單在豎向顯示模式下可能符合要求,但在橫向顯示模式不符合要求。如果這樣,需要在兩個(gè)菜單之間重新排列菜單項(xiàng)。
刷新應(yīng)用程序的屏幕內(nèi)容時(shí),可以使用下列 4 個(gè)編程選項(xiàng):
表 1 顯示了各方法(調(diào)整內(nèi)容適應(yīng)窗口大小有兩個(gè)示例)在 Pocket PC 的 Windows Mobile 軟件中刷新屏幕內(nèi)容的示例:
表 1:豎向圖與橫向圖的屏幕刷新選項(xiàng)
屏幕刷新選項(xiàng)
|
豎向
|
橫向
|
調(diào)整內(nèi)容適應(yīng)窗口大小
重新調(diào)整日歷網(wǎng)格單元的大小以適用工作區(qū)域。
|
|
|
調(diào)整內(nèi)容適應(yīng)窗口大小
“內(nèi)存”設(shè)置控制面板將列表框重新設(shè)置為最大尺寸,然后重新確定它四周所有界面元素的位置。
|
|
|
更改內(nèi)容。
“日歷”在橫向顯示模式下一次只顯示 8 個(gè)月份。
|
|
|
更改布局。
在橫向顯示模式下,Windows Media Player 的按鈕出現(xiàn)在視頻內(nèi)容的一側(cè),不是在下端。
|
|
|
設(shè)計(jì)正方形。
日歷“選項(xiàng)”對(duì)話框的整個(gè)內(nèi)容在兩種取向模式下都顯示在 240x240 的正方形區(qū)域內(nèi)。
|
|
|
請(qǐng)記住,要盡可能的設(shè)計(jì)通用布局,這樣應(yīng)用程序可處理任意尺寸和任何寬高比的顯示內(nèi)容。這意味著盡可能避免分開設(shè)計(jì)橫豎向模式。如果必須設(shè)計(jì)不同的橫豎向布局模式,不要簡(jiǎn)單地因屏幕寬度大于屏幕高度,而假設(shè)應(yīng)用程序能在橫向模式下顯示。例如,設(shè)備屏幕寬可能有 321 個(gè)像素,而屏幕高有 320 個(gè)像素。在這樣的設(shè)備上,應(yīng)用程序也許能以橫豎向兩種模式顯示,應(yīng)選擇應(yīng)用程序最適用或首選的模式,這可能是豎向模式。
RelayoutDialog
在 CrosswordSample 應(yīng)用程序中,有一個(gè)函數(shù)是 RelayoutDialog,它可幫助重新設(shè)置、重新定位對(duì)話框中的子控件。例如,假設(shè)對(duì)話框有兩個(gè)對(duì)話模板,一個(gè)用于橫向,一個(gè)用于豎向。如果這兩個(gè)模板中的控件相同,且有相同的控件 ID,則可使用下列代碼作為 WM_SIZE 處理程序:
case WM_SIZE:
RelayoutDialog(g_hInst, hDlg, InWideMode() ?
MAKEINTRESOURCE(IDD_TOOLS_OPTIONS_1_WIDE) :
MAKEINTRESOURCE(IDD_TOOLS_OPTIONS_1));
注意: 定義為 IDC_STATIC 的控件具有相同的控件 ID,所以如果有多個(gè) IDC_STATIC控件,應(yīng)當(dāng)把它們重命名為 IDC_STATIC_1、IDC_STATIC_2等。
如果靜態(tài)控件在新布局中也發(fā)生了變換,RelayoutDialog 會(huì)同時(shí)更新靜態(tài)控件的文本和位圖。
原有應(yīng)用程序的特性
當(dāng)用戶在基于 Windows Mobile 2003 第二版的 Pocket PC 上運(yùn)行舊應(yīng)用程序時(shí),用戶還保留了以往在豎向模式下的經(jīng)驗(yàn),但豎向模式與橫向模式的經(jīng)驗(yàn)將有所不同。在橫向模式下,對(duì)話框的下半部分可能跑出屏幕底線之外。為了解決這個(gè)問(wèn)題,系統(tǒng)將顯示一個(gè)垂直滾動(dòng)條,允許用戶滾動(dòng)屏幕。只有存在常出現(xiàn)于豎向屏幕底部的控件時(shí),才出現(xiàn)垂直滾動(dòng)條。如果不出現(xiàn),則不出現(xiàn)滾動(dòng)條。
應(yīng)用程序是否是“原有”應(yīng)用程序,取決于可執(zhí)行文件頭中的子系統(tǒng)版本。默認(rèn)情況下,使用 Windows Mobile 2003 SDK 編譯的應(yīng)用程序中的子系統(tǒng)版本號(hào)為 4.20 或更低版本號(hào),在將來(lái)版本的 Pocket PC SDK 中子系統(tǒng)版本號(hào)為 4.21 或更高版本號(hào)。子系統(tǒng)版本號(hào)為 4.20 或低于 4.20 時(shí)被認(rèn)為是舊應(yīng)用程序,可以看見(jiàn)滾動(dòng)條。
知道了這種特性,用戶就能通過(guò)滾動(dòng)條看見(jiàn)隱藏的圖像(假設(shè)不能直接看見(jiàn)的圖像和控件)。此外,您仍可以使用這種技術(shù)快速存儲(chǔ)或檢索圖像,但應(yīng)在屏幕的左側(cè)完成這項(xiàng)工作。
理想情況下,對(duì)話框不應(yīng)需要滾動(dòng)條。為此,最好的方法是:使對(duì)話框控件在豎向模式下不被“輸入面板”覆蓋,故最好設(shè)計(jì) 240x240 的最低分辨率。
安裝警告消息
當(dāng)在基于 Windows Mobile 的可旋轉(zhuǎn)屏幕的 Pocket PC 上安裝了舊應(yīng)用程序時(shí),將出現(xiàn)以下消息,如圖 11 所示:
圖 11 :安裝警告消息
這個(gè)對(duì)話告訴用戶,他們要使用的應(yīng)用程序程序可能無(wú)法識(shí)別正方形屏幕旋轉(zhuǎn),因此不能在橫向模式下正確顯示。只有 VersionMin 值(它指定應(yīng)用程序支持的最低操作系統(tǒng)版本號(hào))低于 4.21,才顯示這個(gè)對(duì)話。
由于將 VersionMin 設(shè)置為 4.21 將阻止把應(yīng)用程序安裝在基于舊 Windows Mobile 的 Pocket PC 上,所以建議把BuildMax 值(不常用)設(shè)置為表 2 中的值,禁用此消息:
表 2:BuildMax 值
|
|
0xA0000000
|
應(yīng)用程序支持正方形屏幕(240x240 像素)。
|
0xC0000000
|
應(yīng)用程序支持屏幕旋轉(zhuǎn)。
|
0xE0000000
|
應(yīng)用程序支持正方形屏幕旋轉(zhuǎn)。
|
這些參數(shù)可通過(guò)編輯 INF 文件的 [CEDevice] 部分(cabwiz 用來(lái)生成 CAB 文件)來(lái)更改。有關(guān) INF 文件格式的詳細(xì)信息,請(qǐng)參閱 MSDN 文檔。
結(jié)論
開發(fā)基于 Windows Mobile 2003 第二版軟件的 Pocket PC 的應(yīng)用程序,要求取消關(guān)于屏幕方向的假設(shè)。使用本文提供的簡(jiǎn)單指南,您可以編寫安裝和運(yùn)行于豎向、橫向和正方形屏幕上的應(yīng)用程序。