.Net Micro Framework研究—让MF支持英文输入法

简介:

一旦支持了鼠标功能,MF可研究的领域,似乎变得无穷无尽,这也许是我近几天一直陷于此中不能自拔的原因了。
有了鼠标即使没有键盘,我们也可以通过虚拟键盘完成输入工作。这个工作很有意义,也很有挑战性,因为这不是windows平台,也不是Dos平台,这是“一穷二白”的MF平台,所有的工作都得从头做起(实现绘制键盘,向有输入焦点控件发送按键信息,删除,添加字符等等功能)。
目前字符串不仅无法转换为数字,并且没有字符插入功能,所以这个函数也必须自己来实现,此外输入焦点光标也需要自己绘制,好了,先不说难处了,先看看最终成果。
 


这是一个文本输入实例,当文本框有输入焦点时,自动弹出输入面板。

 

虚拟键盘上的“Shift”键也是有效的,切换后可以输入符号和大写字母。


 
当文本框失去输入焦点的时候,虚拟键盘消失。
 
以上应用实现的代码如下:
   

 
  1. //个人信息  
  2.     public class YFSelfInfo : YFDialog  
  3.     {  
  4.         YFLabel[] label=new YFLabel[3];  
  5.         YFText[] text=new YFText[3];  
  6.         string[] strLabelName = new string[] {"姓名:","单位:","博客:"};  
  7.         public YFSelfInfo(string Title, int Left, int Top, int Width, int Height, YFWindowBase Parent): base(Title, Width, Height, Parent)  
  8.         {  
  9.             //-------------  
  10.             for(int i=0;i<3;i++)  
  11.             {  
  12.                 label[i] = new YFLabel(strLabelName[i], 20, ClientRect.Top + 10+30*i,40, 20);  
  13.                 Children.Add(label[i]);  
  14.                 text[i] = new YFText("", 70, label[i].Top, 140, 20);  
  15.                 text[i].Enter += new YFSoft.SPOT.Presentation.YFEventHandler(text_Enter);  
  16.                 text[i].Leave += new YFSoft.SPOT.Presentation.YFEventHandler(text_Leave);  
  17.                 Children.Add(text[i]);  
  18.             }  
  19.         }  
  20.         //获得输入焦点时显示输入面板  
  21.         void text_Leave(object sender, EventArgs e)  
  22.         {  
  23.             HideInputPanel();  
  24.             this.Height = SystemMetrics.ScreenHeight;  
  25.         }  
  26.         //失去焦点时隐藏输入面板  
  27.         void text_Enter(object sender, EventArgs e)  
  28.         {  
  29.             ShowInputPanel();  
  30.             this.Height = this.InputPanelTop + 1;  
  31.         }  
  32.         //主窗体鼠标信息  
  33.         public override void OnMouseClick(object sender, MouseEventArgs e)  
  34.         {  
  35.             text_Leave(nullnull); //隐藏输入面板  
  36.             base.OnMouseClick(sender, e);  
  37.         }  
  38. }  

用户程序是不是很简单?再看看我实现的一个记事本程序

正在输入界面
 

菜单功能支持


 
相关代码如下:
   

 
  1. //记事本  
  2.     public class YFNote : YFDialog  
  3.     {  
  4.         YFText text;  
  5.         public YFNote(string Title,int Left, int Top, int Width, int Height, YFWindowBase Parent)  
  6.             : base(Title, Width, Height, Parent)  
  7.         {  
  8.             text = new YFText("", ClientRect.Left, ClientRect.Top, ClientRect.Width, ClientRect.Height);  
  9.             text.BorderStyle = BorderStyle.None;  
  10.             text.Align = false;  
  11.             text.Enter += new YFSoft.SPOT.Presentation.YFEventHandler(text_Enter);  
  12.             text.Leave += new YFSoft.SPOT.Presentation.YFEventHandler(text_Leave);  
  13.             Children.Add(text);  
  14.             this.Left = Left;  
  15.             this.Top = Top;  
  16.             Menu.AddItem(new MenuItem("新建"));  
  17.             Menu.AddItem(new MenuItem("保存"));  
  18.             Menu.AddItem(new MenuItem("-"));  
  19.             Menu.AddItem(new MenuItem("退出"));                  
  20.         }  
  21.         //获得输入焦点时显示输入面板  
  22.         void text_Leave(object sender, EventArgs e)  
  23.         {  
  24.             HideInputPanel();  
  25.             this.Height = SystemMetrics.ScreenHeight;   
  26.             text.Height = ClientRect.Height;  
  27.         }  
  28.         //失去焦点时隐藏输入面板  
  29.         void text_Enter(object sender, EventArgs e)  
  30.         {  
  31.             ShowInputPanel();  
  32.             this.Height = this.InputPanelTop+1;  
  33.             text.Height = ClientRect.Height;  
  34.         }  
  35.         //主窗体鼠标信息  
  36.         public override void OnMouseClick(object sender, MouseEventArgs e)  
  37.         {  
  38.             text_Leave(nullnull); //隐藏输入面板  
  39.             base.OnMouseClick(sender, e);  
  40.         }  
  41.         //菜单  
  42.         public override void OnMenuClick(MenuEventArgs e)  
  43.         {  
  44.             switch (e.Text)  
  45.             {  
  46.                 case "新建":  
  47.                     text.Text = "";  
  48.                     break;  
  49.                 case "保存":  
  50.                     MessageBox("不好意思,暂时没有保存功能","记事本", MessageBoxButtons.OK, MessageBoxIcon.Warning);   
  51.                     break;  
  52.                 case "退出":  
  53.                     Close();  
  54.                     break;  
  55.             }  
  56.             base.OnMenuClick(e);  
  57.         }  
  58.  }  

程序也超简单,但功能还是蛮强大的,我们下面看看虚拟键盘的相关代码,实现思路和鼠标功能一样,也是直接借助基类的虚拟函数,向指定的窗体和控件发送按键消息。
核心代码如下:
 

 
  1. public void TransactKey(KeyState state, object sender, MouseEventArgs e)  
  2.     {  
  3.         //向控件发送按键消息  
  4.         if (this.Parent != null)  
  5.         {  
  6.             Keys key = Keys.None;  
  7.             int keyValue=0;  
  8.             char _char = (char)0;  
  9.    
  10.             YFButton b = (YFButton)sender;  
  11.             if (b.Text == "" || b.Text=="En" || b.Text=="Cn"return;  
  12.    
  13.             Button btn = Button.None;  
  14.             switch (b.Text)  
  15.             {  
  16.                 case "Tab":  
  17.                     key = Keys.Tab;  
  18.                     break;  
  19.                 case "Caps":  
  20.                     key = Keys.CapsLock;  
  21.                     break;  
  22.                 case "Shift":  
  23.                     key = Keys.Select;  
  24.                     break;  
  25.                 case "Ent":  
  26.                     key = Keys.Enter;  
  27.                     btn = Button.Select;  
  28.                     break;  
  29.                 case "Esc":  
  30.                     key = Keys.Escape;  
  31.                     break;  
  32.                 case "Ins":  
  33.                     key = Keys.Insert;  
  34.                     break;  
  35.                 case "Del":  
  36.                     key = Keys.Delete;  
  37.                     break;  
  38.                 case "Menu":  
  39.                     key = Keys.Menu;  
  40.                     btn = Button.Menu;  
  41.                     break;  
  42.                 case "↑":  
  43.                     key = Keys.Up;  
  44.                     btn = Button.Up;  
  45.                     break;  
  46.                 case "←":  
  47.                     key = Keys.Left;  
  48.                     btn = Button.Left;  
  49.                     break;  
  50.                 case "↓":  
  51.                     key = Keys.Down;  
  52.                     btn = Button.Down;  
  53.                     break;  
  54.                 case "→":  
  55.                     key = Keys.Right;  
  56.                     btn = Button.Right;  
  57.                     break;  
  58.                 case "<-":  
  59.                     key = Keys.Back;  
  60.                     btn = Button.Back;  
  61.                     break;  
  62.                 default:  
  63.                     _char = b.Text[0];  
  64.                     key = (Keys)b.Name[0];  
  65.                     break;  
  66.             }  
  67.             keyValue = (int)key;  
  68.    
  69.             //向当前有输入焦点的窗口发送系统按键消息  
  70.             if (btn!= Button.None)  
  71.             {  
  72.                 if ((state & KeyState.Down) > 0) Parent.GetFocus().OnButtonDownEx(new ButtonEventArgs(nullnullnew TimeSpan(), btn));  
  73.                 if ((state & KeyState.Up) > 0) Parent.GetFocus().OnButtonUpEx(new ButtonEventArgs(nullnullnew TimeSpan(), btn));                      
  74.             }  
  75.    
  76.             //获得输入焦点的控件  
  77.             YFControl c = this.Parent.Children.GetFocus();  
  78.             if (c != null)  
  79.             {  
  80.                 if ((state & KeyState.Down) > 0) c.OnKeyDown(sender, new KeyEventArgs(key, keyValue, button[41].Checked, button[28].Checked, button[55].Checked));  
  81.                 if ((state & KeyState.Press) > 0 && _char != (char)0) c.OnKeyPress(sender, new KeyPressEventArgs(_char));  
  82.                 if ((state & KeyState.Up) > 0) c.OnKeyUp(sender, new KeyEventArgs(key, keyValue, button[41].Checked, button[28].Checked, button[55].Checked));  
  83.             }  
  84.    
  85.             //父窗体要求接收按键消息  
  86.             if (Parent.KeyPreview)  
  87.             {  
  88.                 if ((state & KeyState.Down) > 0) Parent.OnKeyDown(Parent, new KeyEventArgs(key, keyValue, button[41].Checked, button[28].Checked, button[55].Checked));  
  89.                 if ((state & KeyState.Press) > 0 && _char != (char)0) Parent.OnKeyPress(Parent, new KeyPressEventArgs(_char));  
  90.                 if ((state & KeyState.Up) > 0) Parent.OnKeyUp(Parent, new KeyEventArgs(key, keyValue, button[41].Checked, button[28].Checked, button[55].Checked));  
  91.             }  
  92.         }  
  93. }  

   以上仅仅实现的是英文输入,中文输入怎么做?似乎要困难的多,此外粘贴、复制功能要不要做?总之有很多很多的东西值得我们去探索去实现,这一切,似乎我们在走Microsoft的老路,要在MF平台上实现一个Micro Windows!说到这我想到一个笑话,有一个人给上帝进行打赌说他也能造人。上帝问他,你怎么做,他说,我先用泥土捏一个…,“等等,”上帝打断了他,“你要用你自己的泥土”。









本文转自yefanqiu51CTO博客,原文链接:http://blog.51cto.com/yfsoft/322894,如需转载请自行联系原作者

相关文章
.Net Micro Framework研究—Digi开发板初探
写的比较基础全面,由于我们北航的研发团队先研究了Digi的开发板,所以直到今天Digi开发板才到我的手上,我的《Micro Framework研究》系列文章以后也会陆续推出
704 0
.Net Micro Framework研究—IO读写
试验平台:Digi MF开发板
438 0
.Net Micro Framework研究—串口操作
试验平台:Digi MF开发板,Digi提供的示例中包含了串口的示例程序
557 0
|
网络协议
.Net Micro Framework研究—TCP/IP通信
关于网络通信方面,Digi提供了两个程序,一个是TCP Server运行在Digi的开发板上,一个是TCP Client程序,运行在PC上,通过网络,上位机很容易控制Digi开发的IO信号
621 0
.Net Micro Framework研究—模拟器改造
由于Digi提供的开发板没有LCD显示屏,所以有关绘图方面的操作,只好在模拟器上进行了。
541 0
|
Windows
.Net Micro Framework研究—中文显示
微软示例程序中,仅支持两种字体(small.tinyfnt和NinaB.tinyfnt),并不支持中文。
581 0
.Net Micro Framework研究—绘图
目前在VS2005的环境里,还不支持.Net Micro Framework界面的所见即所得绘制,界面制作有三种方式,一是窗体直接绘图,二是Panel+形状对象、三是窗体+控件。第一种做法让人觉得又回到了DOS时代,回到了SCREEN 12的16色的世界里。
483 0
.Net Micro Framework研究—Shapes命名空间
在Microsoft.SPOT.Presentation.Shapes命名空间下,包含几个形状对象,主要有Ellipse、Line、Polygon、Rectangle,同样也只有Rectangle实现的最好,其他形状都不支持填充色,虽然每个对象都有Fill属性。
621 0
.Net Micro Framework研究—窗体控件
目前版本的MF对TCP协议栈支持也并不完善(对串口也谈不上完善,毕竟不支持奇偶校验、停止位设置),Digi的以太网口是加入了自己的处理方案,明年二月份微软将要发布的MF V3.0版,就已经完全支持TCP了,到时候MF最理想的应用也许就是通信转换了。
494 0
.Net Micro Framework研究—应用实例
在前几篇关于.Net Micro Framework的研究文章中,我对它的绘图功能实不敢恭维,不过微软的MF开发人员很聪明,对位图方面的功能实现的就比较完善,这样做起图形应用来就不至于捉襟见肘了。前段时间用.Net Compact Framework实现了一个奥运场馆查询
527 0