天天看點

.Net Micro Framework研究—讓MF支援英文輸入法

一旦支援了滑鼠功能,MF可研究的領域,似乎變得無窮無盡,這也許是我近幾天一直陷于此中不能自拔的原因了。

有了滑鼠即使沒有鍵盤,我們也可以通過虛拟鍵盤完成輸入工作。這個工作很有意義,也很有挑戰性,因為這不是windows平台,也不是Dos平台,這是“一窮二白”的MF平台,所有的工作都得從頭做起(實作繪制鍵盤,向有輸入焦點控件發送按鍵資訊,删除,添加字元等等功能)。

目前字元串不僅無法轉換為數字,并且沒有字元插入功能,是以這個函數也必須自己來實作,此外輸入焦點光标也需要自己繪制,好了,先不說難處了,先看看最終成果。

<a href="http://blog.51cto.com/attachment/201005/104943534.jpg" target="_blank"></a>

這是一個文本輸入執行個體,當文本框有輸入焦點時,自動彈出輸入面闆。

<a href="http://blog.51cto.com/attachment/201005/104958577.jpg" target="_blank"></a>

虛拟鍵盤上的“Shift”鍵也是有效的,切換後可以輸入符号和大寫字母。

<a href="http://blog.51cto.com/attachment/201005/105016748.jpg" target="_blank"></a>

當文本框失去輸入焦點的時候,虛拟鍵盤消失。

以上應用實作的代碼如下:

//個人資訊  

    public class YFSelfInfo : YFDialog  

    {  

        YFLabel[] label=new YFLabel[3];  

        YFText[] text=new YFText[3];  

        string[] strLabelName = new string[] {"姓名:","機關:","部落格:"};  

        public YFSelfInfo(string Title, int Left, int Top, int Width, int Height, YFWindowBase Parent): base(Title, Width, Height, Parent)  

        {  

            //-------------  

            for(int i=0;i&lt;3;i++)  

            {  

                label[i] = new YFLabel(strLabelName[i], 20, ClientRect.Top + 10+30*i,40, 20);  

                Children.Add(label[i]);  

                text[i] = new YFText("", 70, label[i].Top, 140, 20);  

                text[i].Enter += new YFSoft.SPOT.Presentation.YFEventHandler(text_Enter);  

                text[i].Leave += new YFSoft.SPOT.Presentation.YFEventHandler(text_Leave);  

                Children.Add(text[i]);  

            }  

        }  

        //獲得輸入焦點時顯示輸入面闆  

        void text_Leave(object sender, EventArgs e)  

            HideInputPanel();  

            this.Height = SystemMetrics.ScreenHeight;  

        //失去焦點時隐藏輸入面闆  

        void text_Enter(object sender, EventArgs e)  

            ShowInputPanel();  

            this.Height = this.InputPanelTop + 1;  

        //主窗體滑鼠資訊  

        public override void OnMouseClick(object sender, MouseEventArgs e)  

            text_Leave(null, null); //隐藏輸入面闆  

            base.OnMouseClick(sender, e);  

}  

使用者程式是不是很簡單?再看看我實作的一個記事本程式

正在輸入界面

<a href="http://blog.51cto.com/attachment/201005/105046823.jpg" target="_blank"></a>

菜單功能支援

<a href="http://blog.51cto.com/attachment/201005/105056114.jpg" target="_blank"></a>

相關代碼如下:

//記事本  

    public class YFNote : YFDialog  

        YFText text;  

        public YFNote(string Title,int Left, int Top, int Width, int Height, YFWindowBase Parent)  

            : base(Title, Width, Height, Parent)  

            text = new YFText("", ClientRect.Left, ClientRect.Top, ClientRect.Width, ClientRect.Height);  

            text.BorderStyle = BorderStyle.None;  

            text.Align = false;  

            text.Enter += new YFSoft.SPOT.Presentation.YFEventHandler(text_Enter);  

            text.Leave += new YFSoft.SPOT.Presentation.YFEventHandler(text_Leave);  

            Children.Add(text);  

            this.Left = Left;  

            this.Top = Top;  

            Menu.AddItem(new MenuItem("建立"));  

            Menu.AddItem(new MenuItem("儲存"));  

            Menu.AddItem(new MenuItem("-"));  

            Menu.AddItem(new MenuItem("退出"));                  

            this.Height = SystemMetrics.ScreenHeight;   

            text.Height = ClientRect.Height;  

            this.Height = this.InputPanelTop+1;  

        //菜單  

        public override void OnMenuClick(MenuEventArgs e)  

            switch (e.Text)  

                case "建立":  

                    text.Text = "";  

                    break;  

                case "儲存":  

                    MessageBox("不好意思,暫時沒有儲存功能","記事本", MessageBoxButtons.OK, MessageBoxIcon.Warning);   

                case "退出":  

                    Close();  

            base.OnMenuClick(e);  

 }  

程式也超簡單,但功能還是蠻強大的,我們下面看看虛拟鍵盤的相關代碼,實作思路和滑鼠功能一樣,也是直接借助基類的虛拟函數,向指定的窗體和控件發送按鍵消息。

核心代碼如下:

public void TransactKey(KeyState state, object sender, MouseEventArgs e)  

        //向控件發送按鍵消息  

        if (this.Parent != null)  

            Keys key = Keys.None;  

            int keyValue=0;  

            char _char = (char)0;  

            YFButton b = (YFButton)sender;  

            if (b.Text == "" || b.Text=="En" || b.Text=="Cn") return;  

            Button btn = Button.None;  

            switch (b.Text)  

                case "Tab":  

                    key = Keys.Tab;  

                case "Caps":  

                    key = Keys.CapsLock;  

                case "Shift":  

                    key = Keys.Select;  

                case "Ent":  

                    key = Keys.Enter;  

                    btn = Button.Select;  

                case "Esc":  

                    key = Keys.Escape;  

                case "Ins":  

                    key = Keys.Insert;  

                case "Del":  

                    key = Keys.Delete;  

                case "Menu":  

                    key = Keys.Menu;  

                    btn = Button.Menu;  

                case "↑":  

                    key = Keys.Up;  

                    btn = Button.Up;  

                case "←":  

                    key = Keys.Left;  

                    btn = Button.Left;  

                case "↓":  

                    key = Keys.Down;  

                    btn = Button.Down;  

                case "→":  

                    key = Keys.Right;  

                    btn = Button.Right;  

                case "&lt;-":  

                    key = Keys.Back;  

                    btn = Button.Back;  

                default:  

                    _char = b.Text[0];  

                    key = (Keys)b.Name[0];  

            keyValue = (int)key;  

            //向目前有輸入焦點的視窗發送系統按鍵消息  

            if (btn!= Button.None)  

                if ((state &amp; KeyState.Down) &gt; 0) Parent.GetFocus().OnButtonDownEx(new ButtonEventArgs(null, null, new TimeSpan(), btn));  

                if ((state &amp; KeyState.Up) &gt; 0) Parent.GetFocus().OnButtonUpEx(new ButtonEventArgs(null, null, new TimeSpan(), btn));                      

            //獲得輸入焦點的控件  

            YFControl c = this.Parent.Children.GetFocus();  

            if (c != null)  

                if ((state &amp; KeyState.Down) &gt; 0) c.OnKeyDown(sender, new KeyEventArgs(key, keyValue, button[41].Checked, button[28].Checked, button[55].Checked));  

                if ((state &amp; KeyState.Press) &gt; 0 &amp;&amp; _char != (char)0) c.OnKeyPress(sender, new KeyPressEventArgs(_char));  

                if ((state &amp; KeyState.Up) &gt; 0) c.OnKeyUp(sender, new KeyEventArgs(key, keyValue, button[41].Checked, button[28].Checked, button[55].Checked));  

            //父窗體要求接收按鍵消息  

            if (Parent.KeyPreview)  

                if ((state &amp; KeyState.Down) &gt; 0) Parent.OnKeyDown(Parent, new KeyEventArgs(key, keyValue, button[41].Checked, button[28].Checked, button[55].Checked));  

                if ((state &amp; KeyState.Press) &gt; 0 &amp;&amp; _char != (char)0) Parent.OnKeyPress(Parent, new KeyPressEventArgs(_char));  

                if ((state &amp; KeyState.Up) &gt; 0) Parent.OnKeyUp(Parent, new KeyEventArgs(key, keyValue, button[41].Checked, button[28].Checked, button[55].Checked));  

   以上僅僅實作的是英文輸入,中文輸入怎麼做?似乎要困難的多,此外粘貼、複制功能要不要做?總之有很多很多的東西值得我們去探索去實作,這一切,似乎我們在走Microsoft的老路,要在MF平台上實作一個Micro Windows!說到這我想到一個笑話,有一個人給上帝進行打賭說他也能造人。上帝問他,你怎麼做,他說,我先用泥土捏一個…,“等等,”上帝打斷了他,“你要用你自己的泥土”。

本文轉自yefanqiu51CTO部落格,原文連結:http://blog.51cto.com/yfsoft/322894,如需轉載請自行聯系原作者

繼續閱讀