您的位置:首页 > 其它

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

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



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



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



当文本框失去输入焦点的时候,虚拟键盘消失。

以上应用实现的代码如下:
[align=left] //个人信息[/align]
[align=left] public class YFSelfInfo : YFDialog[/align]
[align=left] {[/align]
[align=left] YFLabel[] label=new YFLabel[3];[/align]
[align=left] YFText[] text=new YFText[3];[/align]
[align=left] string[] strLabelName = new string[] {"姓名:","单位:","博客:"};[/align]
[align=left] public YFSelfInfo(string Title, int Left, int Top, int Width, int Height, YFWindowBase Parent): base(Title, Width, Height, Parent)[/align]
[align=left] {[/align]
[align=left] //-------------[/align]
[align=left] for(int i=0;i<3;i++)[/align]
[align=left] {[/align]
[align=left] label[i] = new YFLabel(strLabelName[i], 20, ClientRect.Top + 10+30*i,40, 20);[/align]
[align=left] Children.Add(label[i]);[/align]
[align=left] text[i] = new YFText("", 70, label[i].Top, 140, 20);[/align]
[align=left] text[i].Enter += new YFSoft.SPOT.Presentation.YFEventHandler(text_Enter);[/align]
[align=left] text[i].Leave += new YFSoft.SPOT.Presentation.YFEventHandler(text_Leave);[/align]
[align=left] Children.Add(text[i]);[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left] //获得输入焦点时显示输入面板[/align]
[align=left] void text_Leave(object sender, EventArgs e)[/align]
[align=left] {[/align]
[align=left] HideInputPanel();[/align]
[align=left] this.Height = SystemMetrics.ScreenHeight;[/align]
[align=left] }[/align]
[align=left] //失去焦点时隐藏输入面板[/align]
[align=left] void text_Enter(object sender, EventArgs e)[/align]
[align=left] {[/align]
[align=left] ShowInputPanel();[/align]
[align=left] this.Height = this.InputPanelTop + 1;[/align]
[align=left] }[/align]
[align=left] //主窗体鼠标信息[/align]
[align=left] public override void OnMouseClick(object sender, MouseEventArgs e)[/align]
[align=left] {[/align]
[align=left] text_Leave(null, null); //隐藏输入面板[/align]
[align=left] base.OnMouseClick(sender, e);[/align]
[align=left] }[/align]
[align=left]}[/align]
[align=left]用户程序是不是很简单?再看看我实现的一个记事本程序[/align]
[align=left] [/align]



[align=left] [/align]
[align=left]正在输入界面[/align]



[align=left] [/align]
菜单功能支持



相关代码如下:
[align=left] //记事本[/align]
[align=left] public class YFNote : YFDialog[/align]
[align=left] {[/align]
[align=left] YFText text;[/align]
[align=left] public YFNote(string Title,int Left, int Top, int Width, int Height, YFWindowBase Parent)[/align]
[align=left] : base(Title, Width, Height, Parent)[/align]
[align=left] {[/align]
[align=left] text = new YFText("", ClientRect.Left, ClientRect.Top, ClientRect.Width, ClientRect.Height);[/align]
[align=left] text.BorderStyle = BorderStyle.None;[/align]
[align=left] text.Align = false;[/align]
[align=left] text.Enter += new YFSoft.SPOT.Presentation.YFEventHandler(text_Enter);[/align]
[align=left] text.Leave += new YFSoft.SPOT.Presentation.YFEventHandler(text_Leave);[/align]
[align=left] Children.Add(text);[/align]
[align=left] this.Left = Left;[/align]
[align=left] this.Top = Top;[/align]
[align=left] Menu.AddItem(new MenuItem("新建"));[/align]
[align=left] Menu.AddItem(new MenuItem("保存"));[/align]
[align=left] Menu.AddItem(new MenuItem("-"));[/align]
[align=left] Menu.AddItem(new MenuItem("退出")); [/align]
[align=left] }[/align]
[align=left] //获得输入焦点时显示输入面板[/align]
[align=left] void text_Leave(object sender, EventArgs e)[/align]
[align=left] {[/align]
[align=left] HideInputPanel();[/align]
[align=left] this.Height = SystemMetrics.ScreenHeight; [/align]
[align=left] text.Height = ClientRect.Height;[/align]
[align=left] }[/align]
[align=left] //失去焦点时隐藏输入面板[/align]
[align=left] void text_Enter(object sender, EventArgs e)[/align]
[align=left] {[/align]
[align=left] ShowInputPanel();[/align]
[align=left] this.Height = this.InputPanelTop+1;[/align]
[align=left] text.Height = ClientRect.Height;[/align]
[align=left] }[/align]
[align=left] //主窗体鼠标信息[/align]
[align=left] public override void OnMouseClick(object sender, MouseEventArgs e)[/align]
[align=left] {[/align]
[align=left] text_Leave(null, null); //隐藏输入面板[/align]
[align=left] base.OnMouseClick(sender, e);[/align]
[align=left] }[/align]
[align=left] //菜单[/align]
[align=left] public override void OnMenuClick(MenuEventArgs e)[/align]
[align=left] {[/align]
[align=left] switch (e.Text)[/align]
[align=left] {[/align]
[align=left] case "新建":[/align]
[align=left] text.Text = "";[/align]
[align=left] break;[/align]
[align=left] case "保存":[/align]
[align=left] MessageBox("不好意思,暂时没有保存功能","记事本", MessageBoxButtons.OK, MessageBoxIcon.Warning); [/align]
[align=left] break;[/align]
[align=left] case "退出":[/align]
[align=left] Close();[/align]
[align=left] break;[/align]
[align=left] }[/align]
[align=left] base.OnMenuClick(e);[/align]
[align=left] }[/align]
}
程序也超简单,但功能还是蛮强大的,我们下面看看虚拟键盘的相关代码,实现思路和鼠标功能一样,也是直接借助基类的虚拟函数,向指定的窗体和控件发送按键消息。
核心代码如下:
[align=left]public void TransactKey(KeyState state, object sender, MouseEventArgs e)[/align]
[align=left] {[/align]
[align=left] //向控件发送按键消息[/align]
[align=left] if (this.Parent != null)[/align]
[align=left] {[/align]
[align=left] Keys key = Keys.None;[/align]
[align=left] int keyValue=0;[/align]
[align=left] char _char = (char)0;[/align]
[align=left] [/align]
[align=left] YFButton b = (YFButton)sender;[/align]
[align=left] if (b.Text == "" || b.Text=="En" || b.Text=="Cn") return;[/align]
[align=left] [/align]
[align=left] Button btn = Button.None;[/align]
[align=left] switch (b.Text)[/align]
[align=left] {[/align]
[align=left] case "Tab":[/align]
[align=left] key = Keys.Tab;[/align]
[align=left] break;[/align]
[align=left] case "Caps":[/align]
[align=left] key = Keys.CapsLock;[/align]
[align=left] break;[/align]
[align=left] case "Shift":[/align]
[align=left] key = Keys.Select;[/align]
[align=left] break;[/align]
[align=left] case "Ent":[/align]
[align=left] key = Keys.Enter;[/align]
[align=left] btn = Button.Select;[/align]
[align=left] break;[/align]
[align=left] case "Esc":[/align]
[align=left] key = Keys.Escape;[/align]
[align=left] break;[/align]
[align=left] case "Ins":[/align]
[align=left] key = Keys.Insert;[/align]
[align=left] break;[/align]
[align=left] case "Del":[/align]
[align=left] key = Keys.Delete;[/align]
[align=left] break;[/align]
[align=left] case "Menu":[/align]
[align=left] key = Keys.Menu;[/align]
[align=left] btn = Button.Menu;[/align]
[align=left] break;[/align]
[align=left] case "↑":[/align]
[align=left] key = Keys.Up;[/align]
[align=left] btn = Button.Up;[/align]
[align=left] break;[/align]
[align=left] case "←":[/align]
[align=left] key = Keys.Left;[/align]
[align=left] btn = Button.Left;[/align]
[align=left] break;[/align]
[align=left] case "↓":[/align]
[align=left] key = Keys.Down;[/align]
[align=left] btn = Button.Down;[/align]
[align=left] break;[/align]
[align=left] case "→":[/align]
[align=left] key = Keys.Right;[/align]
[align=left] btn = Button.Right;[/align]
[align=left] break;[/align]
[align=left] case "<-":[/align]
[align=left] key = Keys.Back;[/align]
[align=left] btn = Button.Back;[/align]
[align=left] break;[/align]
[align=left] default:[/align]
[align=left] _char = b.Text[0];[/align]
[align=left] key = (Keys)b.Name[0];[/align]
[align=left] break;[/align]
[align=left] }[/align]
[align=left] keyValue = (int)key;[/align]
[align=left] [/align]
[align=left] //向当前有输入焦点的窗口发送系统按键消息[/align]
[align=left] if (btn!= Button.None)[/align]
[align=left] {[/align]
[align=left] if ((state & KeyState.Down) > 0) Parent.GetFocus().OnButtonDownEx(new ButtonEventArgs(null, null, new TimeSpan(), btn));[/align]
[align=left] if ((state & KeyState.Up) > 0) Parent.GetFocus().OnButtonUpEx(new ButtonEventArgs(null, null, new TimeSpan(), btn)); [/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] //获得输入焦点的控件[/align]
[align=left] YFControl c = this.Parent.Children.GetFocus();[/align]
[align=left] if (c != null)[/align]
[align=left] {[/align]
[align=left] if ((state & KeyState.Down) > 0) c.OnKeyDown(sender, new KeyEventArgs(key, keyValue, button[41].Checked, button[28].Checked, button[55].Checked));[/align]
[align=left] if ((state & KeyState.Press) > 0 && _char != (char)0) c.OnKeyPress(sender, new KeyPressEventArgs(_char));[/align]
[align=left] if ((state & KeyState.Up) > 0) c.OnKeyUp(sender, new KeyEventArgs(key, keyValue, button[41].Checked, button[28].Checked, button[55].Checked));[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] //父窗体要求接收按键消息[/align]
[align=left] if (Parent.KeyPreview)[/align]
[align=left] {[/align]
[align=left] if ((state & KeyState.Down) > 0) Parent.OnKeyDown(Parent, new KeyEventArgs(key, keyValue, button[41].Checked, button[28].Checked, button[55].Checked));[/align]
[align=left] if ((state & KeyState.Press) > 0 && _char != (char)0) Parent.OnKeyPress(Parent, new KeyPressEventArgs(_char));[/align]
[align=left] if ((state & KeyState.Up) > 0) Parent.OnKeyUp(Parent, new KeyEventArgs(key, keyValue, button[41].Checked, button[28].Checked, button[55].Checked));[/align]
[align=left] }[/align]
[align=left] }[/align]
}
以上仅仅实现的是英文输入,中文输入怎么做?似乎要困难的多,此外粘贴、复制功能要不要做?总之有很多很多的东西值得我们去探索去实现,这一切,似乎我们在走Microsoft的老路,要在MF平台上实现一个Micro Windows!说到这我想到一个笑话,有一个人给上帝进行打赌说他也能造人。上帝问他,你怎么做,他说,我先用泥土捏一个…,“等等,”上帝打断了他,“你要用你自己的泥土”。

[CSDN Blog 链接]http://blog.csdn.net/yefanqiu/archive/2008/01/27/2068358.aspx
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: