.Net Micro Framework研究—让MF支持鼠标

简介:

MF的标准模块仅支持按键,并不支持鼠标功能。但是对一些常见应用来说,如果没有鼠标(或触摸屏)用起来就太不习惯了。有什么办法可以让MF支持鼠标功能呢?第一,外部设备必须把鼠标信息传到MF应用程序,应用程序根据这些信息绘制鼠标及执行相应的动作。鼠标信息最少包含三种,鼠标按键状态(按下或放开),鼠标坐标(x,y)。

      目前,Spi通道可以非常方便地建立设备和用户程序之间的联系,所以就考虑用Spi来实现该功能。

      第一步,还是从我编写的模拟器入手,添加了一个Spi驱动类。

 
  1. //MouseDevice  
  2.     public class MouseComponent : SpiDevice  
  3.     {  
  4.         public static Int16 State = 0;  
  5.         public static Int16 X = 0;  
  6.         public static Int16 Y = 0;  
  7.    
  8.         protected override byte[] Write(byte[] data)  
  9.         {  
  10.             //------------  
  11.             //改写坐标值  
  12.             try 
  13.             {  
  14.                 //State = (Int16)((data[0] << 8) + data[1]);  
  15.                 //X = (Int16)((data[2] << 8) + data[3]);  
  16.                 //Y = (Int16)((data[4] << 8) + data[5]);  
  17.             }  
  18.             catch { }  
  19.             //------------  
  20.             //返回当前值  
  21.             byte[] bytes = new byte[6];  
  22.             bytes[0] = (byte)(State >> 8);  
  23.             bytes[1] = (byte)(State & 0xff);  
  24.             bytes[2] = (byte)(X >> 8);  
  25.             bytes[3] = (byte)(X & 0xff);  
  26.             bytes[4] = (byte)(Y >> 8);  
  27.             bytes[5] = (byte)(Y & 0xff);  
  28.             return bytes;  
  29.         }  
  30.         protected override ushort[] Write(ushort[] data)  
  31.         {  
  32.             //------------  
  33.             //改写坐标值  
  34.             try 
  35.             {  
  36.                 //State = (Int16)data[0];  
  37.                 //X = (Int16)data[1];  
  38.                 //Y = (Int16)data[2];  
  39.             }  
  40.             catch { }  
  41.             //------------  
  42.             //返回当前值  
  43.             ushort[] Int16s = new ushort[3];  
  44.             Int16s[0] = (ushort)State;  
  45.             Int16s[1] = (ushort)X;  
  46.             Int16s[2] = (ushort)Y;  
  47.             return Int16s;  
  48.         }  
  49. }  

第二步:编写鼠标应用程序
为了通用,我封装了一个windowbase基类
 

 
  1. //鼠标事件  
  2.         public class MouseEventArgs : EventArgs  
  3.         {  
  4.             public int X;  
  5.             public int Y;  
  6.             public int Button;  
  7.             public MouseEventArgs()  
  8.             {  
  9.                 X = 0;  
  10.                 Y = 0;  
  11.                 Button = 0;  
  12.                 State = MouseState.None;  
  13.             }  
  14.             public MouseEventArgs(int x, int y)  
  15.             {  
  16.                 X = x;  
  17.                 Y = y;  
  18.                 Button = 0;  
  19.                 State = MouseState.None;  
  20.             }  
  21.             public MouseEventArgs(int x, int y, int button)  
  22.             {  
  23.                 X = x;  
  24.                 Y = y;  
  25.                 Button = button;  
  26.                 State = MouseState.None;  
  27.             }   
  28.         }  
  29.           
  30.         //窗体基类  
  31.         internal class WindowBase : Window  
  32.         {  
  33.             protected YFWinApp m_app;  
  34.             Thread MouseThread;             
  35.             private ushort state=0, x = 0, y = 0;  
  36.             SPI _spi=null;  
  37.    
  38.             protected WindowBase(YFWinApp app)  
  39.             {  
  40.                 m_app = app;  
  41.                 this.Visibility = Visibility.Visible;  
  42.                 this.Width = SystemMetrics.ScreenWidth;  
  43.                 this.Height = SystemMetrics.ScreenHeight;  
  44.                 Buttons.Focus(this);  
  45.    
  46.                 //SPI的pin定义  
  47.                 _spi = new SPI(new SPI.Configuration((Cpu.Pin)127, true, 0, 0, falsefalse, 4000, SPI.SPI_module.SPI1));  
  48.                 x =(ushort)( this.Width/2);  
  49.                 y =(ushort)( this.Height/2);  
  50.                 MouseThread = new Thread(new ThreadStart(MouseInfo));  
  51.                 MouseThread.Start();  
  52.             }  
  53.               
  54.             protected override void OnButtonDown(ButtonEventArgs e)  
  55.             {  
  56.                 this.Close();  
  57.                 m_app.GoHome();  
  58.             }  
  59.              
  60.             //获得鼠标信息  
  61.             private void MouseInfo()  
  62.             {  
  63.                 ushort[] bout = new ushort[3];  
  64.                 ushort[] bin = new ushort[3];  
  65.                 ushort mX, mY, mState;  
  66.                 while (true)  
  67.                 {  
  68.                     //----------------------------------  
  69.                     //通过spi通道获取鼠标信息 这部分信息解析和模拟器相对应                      
  70.                     _spi.WriteRead(bout, bin);   
  71.                     mState = bin[0];       //鼠标的状态 1- 按下 0 - 放开  
  72.                     mX = bin[1];           //鼠标X坐标  
  73.                     mY = bin[2];           //鼠标Y坐标  
  74.                     //----------------------------------  
  75.    
  76.                     if (x != mX|| y != mY)  
  77.                     {  
  78.                         x = mX; y = mY;  
  79.                         OnMouseMove(new MouseEventArgs(mX, mY, mState));  
  80.                     }  
  81.                     if (state != mState)  
  82.                     {  
  83.                         state = mState;  
  84.                         if (state == 1)  
  85.                         {  
  86.                             OnMouseDown(new MouseEventArgs(mX, mY, mState));  
  87.                         }  
  88.                         else if(state==0)  
  89.                         {  
  90.                             OnMouseUp(new MouseEventArgs(mX, mY, mState));  
  91.                             OnMouseClick(new MouseEventArgs(mX, mY, mState));                             
  92.                         }  
  93.                     }  
  94.                 }  
  95.             }  
  96.              
  97.             //鼠标移动  
  98.             protected virtual void OnMouseMove(MouseEventArgs e)  
  99.             {  
  100.                 Debug.Print("MouseMove:" + e.X.ToString() + "," + e.Y.ToString() + "," + e.Button.ToString());  
  101.             }  
  102.    
  103.             //鼠标单击  
  104.             protected virtual void OnMouseClick(MouseEventArgs e)  
  105.             {  
  106.                 Debug.Print("MouseClick:" + e.X.ToString() + "," + e.Y.ToString() + "," + e.Button.ToString());  
  107.             }  
  108.    
  109.             //按下  
  110.             protected virtual void OnMouseDown(MouseEventArgs e)  
  111.             {  
  112.                 Debug.Print("MouseDown:" + e.X.ToString() + "," + e.Y.ToString() + "," + e.Button.ToString());  
  113.             }  
  114.    
  115.             //抬起  
  116.             protected virtual void OnMouseUp(MouseEventArgs e)  
  117.             {  
  118.                 Debug.Print("MouseUp:" + e.X.ToString() + "," + e.Y.ToString() + "," + e.Button.ToString());  
  119.             }  
  120.             //绘制鼠标  
  121.             public override void OnRender(DrawingContext dc)  
  122.             {  
  123.                 if (state == 1)  
  124.                 {  
  125.                     Pen pp=new Pen(ColorUtility.ColorFromRGB(255,255,0));  
  126.                     dc.DrawLine(pp, x, y - 5, x, y + 5);  
  127.                     dc.DrawLine(pp, x-5, y, x+5, y);   
  128.                 }  
  129.                 int[] points = { x, y, x+10, y+4, x+5,y+5, x+4,y+10};  
  130.                 Pen p = new Pen(Color.White, 1);  
  131.                 dc.DrawPolygon(null, p, points);  
  132.             }  
  133.             //窗体刷新  
  134.             protected void Refresh()  
  135.             {  
  136.                 this.Left = this.Left;  
  137.                 this.UpdateLayout();     
  138.             }  
  139.      }  

下面是我们实际运行的效果图,已经非常完美的支持鼠标了(并且模拟器可两种方式提供鼠标信息,一种是鼠标直接在LCD屏上操作,一种是通过扩展面板上的滑块进行移动)。

 

直接用外部鼠标操作。

 

 通过滑块进行鼠标操作。


 



















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

相关文章
.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