程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> Windows Mobile 5.0橫豎屏自識別技術

Windows Mobile 5.0橫豎屏自識別技術

編輯:.NET實例教程

前不久我編寫了一個基於Windows Mobile 5.0的參賽程序《北京2008奧運場館速查》,可惜當時那個程序並不支持橫豎屏自動識別,後來看了參賽的規則,原來這一個功能是必須實現的,所以今天抽出時間又把這方面的內容給添加了進去。

V1.0.0版介紹文章:

http://blog.csdn.Net/yefanqiu/archive/2007/11/13/1882835.ASPx

V1.0.0版源碼下載:

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事件中根據不同的屏類型,配置不同的布局,在鼠標處理事件中也要分別處理,這部分代碼是比較繁雜的,有興趣的朋友可以下載源碼後自行去看。

此外需要注意的是,在模擬器中橫豎屏切換的時候,原來的

UP鍵會變成Right鍵(模擬器橫屏是豎屏順時針旋轉90度而成的,我的PPC也是這樣,不知道其它設備是不是這樣),當然其他的鍵的含義也會發生變化,麻煩的是一般都把upleft方向當作起始,旋轉之後,功能含義相反了,所以在代碼中要做相應的處理。

//方向控制

        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設備上才能完美的體驗用手指撥動查詢的快感,在模擬器上用鼠標模擬太勉為其難了。

升級後的程序,我同樣也是以源碼的方式發布,希望這個程序能起到拋磚引玉的作用,在此基礎上網友能推出自己更棒的程序。

V1.1.0版源碼下載地址:

http://microsoft.csdn.Net/mobile/dev_contest/demon-detail_1.ASPx?pointid=95

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved