前不久我編寫了一個基於Windows Mobile 5.0的參賽程序《北京2008奧運場館速查》,可惜當時那個程序並不支持橫豎屏自動識別,後來看了參賽的規則,原來這一個功能是必須實現的,所以今天抽出時間又把這方面的內容給添加了進去。
V
http://blog.csdn.Net/yefanqiu/archive/2007/11/13/1882835.ASPx
V
http://microsoft.csdn.Net/mobile/dev_contest/demon-detail_1.ASPx?pointid=47
由於我這個程序大部分是繪圖操作,所以橫豎屏切換的代碼實現,基本等於是做兩套不同的程序,這也是當初我為何懶得做的原因,廢話少說,我下面談一談,針對該功能我是如何實現的(不知道此外有沒有其它更好的辦法,如果有的話,希望網友告訴我一聲)。
先介紹一下Screen對象,顧名思義,該對象就包含了顯示屏相關的信息,其中的Screen.PrimaryScreen.Bounds屬性特別有用,該屬性就是描述顯示屏的大小的。
下面是具體的代碼:
//屏的類型
public enum ScreenType { QVGA240320, QVGA320240, VGA480640, VGA640480,Other};
//獲取屏的類型
public static ScreenType GetScreenType()
{
ScreenType SType = ScreenType.Other;
if (Screen.PrimaryScreen.Bounds.Width == 240 && Screen.PrimaryScreen.Bounds.Height == 320)
{
SType = ScreenType.QVGA240320;
}
if (Screen.PrimaryScreen.Bounds.Width == 320 && Screen.PrimaryScreen.Bounds.Height == 240)
{
SType = ScreenType.QVGA320240;
}
if (Screen.PrimaryScreen.Bounds.Width == 480 && Screen.PrimaryScreen.Bounds.Height == 640)
{
SType = ScreenType.VGA480640;
}
if (Screen.PrimaryScreen.Bounds.Width == 640 && Screen.PrimaryScreen.Bounds.Height == 480)
{
SType = ScreenType.VGA640480;
}
return SType;
}
接著說一下在程序中如何自適應橫豎屏的識別,首先要添加窗體的Resize事件,該事件會在窗體大小發生變化的時候自動觸發(由於我程序中的窗體都默認為最大化,所以橫豎屏切換的時候它一定會觸發,針對普通的窗體是否也這樣?這得要實際測一測了,為了保險期間,可以在窗體的Paint事件中檢查橫豎屏是否切換)。
//屏幕翻轉
private void frmMain_Resize(object sender, EventArgs e)
{
if (scrType != DataInfos.GetScreenType())
{
scrType = DataInfos.GetScreenType();
//相關需要改變的代碼
}
}
剩下的就是在Paint事件中根據不同的屏類型,配置不同的布局,在鼠標處理事件中也要分別處理,這部分代碼是比較繁雜的,有興趣的朋友可以下載源碼後自行去看。
此外需要注意的是,在模擬器中橫豎屏切換的時候,原來的
//方向控制
private void frmMain_KeyDown(object sender, KeyEventArgs e)
{
if ((e.KeyCode == System.Windows.Forms.Keys.Up))
{
// 向上導航
// 向上鍵
// 該判斷在真實的PPC設備中就不需要了
if (scrType == DataInfos.ScreenType.QVGA240320) MoveLeft();
else MoveRight();
}
if ((e.KeyCode == System.Windows.Forms.Keys.Down))
{
// 向下導航
// 向下鍵
// 該判斷在真實的PPC設備中就不需要了
if (scrType == DataInfos.ScreenType.QVGA240320) MoveRight();
else MoveLeft();
}
if ((e.KeyCode == System.Windows.Forms.Keys.Left))
{
// 向左鍵
MoveLeft();
}
if ((e.KeyCode == System.Windows.Forms.Keys.Right))
{ // 向右鍵
MoveRight();
}
if ((e.KeyCode == System.Windows.Forms.Keys.Enter))
{
bSelectDown = true;
this.Refresh();
}
}
要緊的是,橫屏時按模擬器上的鍵,功能如你所願,但是作為PC機上的按鍵的方向並沒有旋轉,所以你按鍵盤的鍵來代替模擬器上的鍵的時候,你所想的和實際正好相反。
還好,最終的程序是運行在實際的PPC設備上去的,這個問題就不存在了,PPC屏幕旋轉後按鍵的定義自動調整,上就是上,左就是左(真夠人性化的!我想模擬器不能這樣,想必是模擬器的一個bug了)。此外也只有在PPC設備上才能完美的體驗用手指撥動查詢的快感,在模擬器上用鼠標模擬太勉為其難了。
升級後的程序,我同樣也是以源碼的方式發布,希望這個程序能起到拋磚引玉的作用,在此基礎上網友能推出自己更棒的程序。
V
http://microsoft.csdn.Net/mobile/dev_contest/demon-detail_1.ASPx?pointid=95