前不久我編寫了一個基于Windows Mobile 5.0的參賽程式《北京2008奧運場館速查》,可惜當時那個程式并不支援橫豎屏自動識别,後來看了參賽的規則,原來這一個功能是必須實作的,是以今天抽出時間又把這方面的内容給添加了進去。
V1.0.0版介紹文章:
<a href="http://blog.csdn.net/yefanqiu/archive/2007/11/13/1882835.aspx">http://blog.csdn.net/yefanqiu/archive/2007/11/13/1882835.aspx</a>
V1.0.0版源碼下載下傳:
<a href="http://microsoft.csdn.net/mobile/dev_contest/demon-detail_1.aspx?pointid=47">http://microsoft.csdn.net/mobile/dev_contest/demon-detail_1.aspx?pointid=47</a>
由于我這個程式大部分是繪圖操作,是以橫豎屏切換的代碼實作,基本等于是做兩套不同的程式,這也是當初我為何懶得做的原因,廢話少說,我下面談一談,針對該功能我是如何實作的(不知道此外有沒有其它更好的辦法,如果有的話,希望網友告訴我一聲)。
先介紹一下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事件中根據不同的屏類型,配置不同的布局,在滑鼠處理事件中也要分别處理,這部分代碼是比較繁雜的,有興趣的朋友可以下載下傳源碼後自行去看。
此外需要注意的是,在模拟器中橫豎屏切換的時候,原來的UP鍵會變成Right鍵(模拟器橫屏是豎屏順時針旋轉90度而成的,我的PPC也是這樣,不知道其它裝置是不是這樣),當然其他的鍵的含義也會發生變化,麻煩的是一般都把up和left方向當作起始,旋轉之後,功能含義相反了,是以在代碼中要做相應的處理。
//方向控制
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))
// 向下導航
// 向下鍵
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裝置上才能完美的體驗用手指撥動查詢的快感,在模拟器上用滑鼠模拟太勉為其難了。
更新後的程式,我同樣也是以源碼的方式釋出,希望這個程式能起到抛磚引玉的作用,在此基礎上網友能推出自己更棒的程式。
V1.1.0版源碼下載下傳位址:
<a href="http://microsoft.csdn.net/mobile/dev_contest/demon-detail_1.aspx?pointid=95">http://microsoft.csdn.net/mobile/dev_contest/demon-detail_1.aspx?pointid=95</a>