天天看點

Windows Mobile 5.0橫豎屏自識别技術

前不久我編寫了一個基于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 &amp;&amp; Screen.PrimaryScreen.Bounds.Height == 320)

            {

                SType = ScreenType.QVGA240320;

            }

            if (Screen.PrimaryScreen.Bounds.Width == 320 &amp;&amp; Screen.PrimaryScreen.Bounds.Height == 240)

                SType = ScreenType.QVGA320240;

            }

            if (Screen.PrimaryScreen.Bounds.Width == 480 &amp;&amp; Screen.PrimaryScreen.Bounds.Height == 640)

                SType = ScreenType.VGA480640;

            if (Screen.PrimaryScreen.Bounds.Width == 640 &amp;&amp; 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>

繼續閱讀