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

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

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

直接用外部鼠标操作。

通过滑块进行鼠标操作。

.Net Micro Framework研究—让MF支持鼠标相关推荐

  1. .Net Micro Framework研究—实现SideShow窗体界面

    基于MF系统的Windows SideShow界面是非常炫的(如下图).既然微软能用.Net Micro Framework实现这么棒的界面效果,我想我们也能做到. (SideShow模拟器界面和游戏 ...

  2. .Net Micro Framework研究—串口操作

    .Net Micro Framework研究-串口操作 试验平台:Digi MF开发板 Digi提供的示例中包含了串口的示例程序,主要代码如下: public bool EchoByte() { Se ...

  3. .Net Micro Framework研究—绘图

    试验平台:.Net Micro Framework 模拟器 目前在VS2005的环境里,还不支持.Net Micro Framework界面的所见即所得绘制,界面制作有三种方式,一是窗体直接绘图,二是 ...

  4. .Net Micro Framework研究—串口部署释疑

    前几天我用串口方式部署MF程序总是无法成功,但是用其自带的串口调试程序通信成功.用串口监控程序一查看发现串口参数之校验有问题,应该是无校验,但是微软的调试程序打开的却是偶校验(请参见:http://b ...

  5. .Net Micro Framework研究—TCP/IP通信

    试验平台:Digi MF开发板 关于网络通信方面,Digi提供了两个程序,一个是TCP Server运行在Digi的开发板上,一个是TCP Client程序,运行在PC上,通过网络,上位机很容易控制D ...

  6. .Net Micro Framework研究—带I2C总线的模拟器

    I2C以前没有怎么接触过,所以做它的模拟功能,只能靠着感觉走,有不妥之处,还望方家指正.做出了spi相关的模拟功能,做I2C相对也就不难了,只不过用户操作I2C总线读写数据的时候要稍微麻烦一点. 测试 ...

  7. .Net Micro Framework 快速入门

    一.简介 Microsoft .NET Micro Framework 2001年由微软研究院开始研发,并随后在其MSN Direct项目中使用该技术,2007年9月微软对外发布2.0,2008年10 ...

  8. .Net Micro Framework 嵌入式开发

    原文: http://www.cnblogs.com/yefanqiu/archive/2010/03/02/1676844.html ; .Net Micro Framework 快速入门 一.简介 ...

  9. Micro Framework 3 0模拟器改造

    Micro Framework 3.0的SDK去年十月份就已经发布了,本打算在该SDK发布之后就把我以前开发的,可支持GPIO.I2C.SPI测试的模拟器同步升级为3.0版,以便早点支持VS2008( ...

最新文章

  1. 深圳.NET俱乐部7月活动小结及照片
  2. vsftpd + mysql + virtual users
  3. python扫雷游戏课程设计小组任务计划与分配表_Python开源扫雷游戏由网瘾少年制作,转手后月入18K,附赠所有源文件...
  4. BZOJ.4832.[Lydsy1704月赛]抵制克苏恩(期望DP)
  5. java多线程总结二(转)
  6. 数据库备份与还原c#.net实现
  7. 2022年最新的西安Java培训机构十大排名榜单
  8. Matlab画平滑曲线的两种方法( 拟合或插值后再用plot即可)
  9. 凹多边形三角剖分算法实现---基于Unity3D
  10. IE报证书错误提示页面,如何屏蔽?
  11. 雪豹10.6升级10.8
  12. 计算机开机进不了bios,开机进不了bios,教您怎么解决win8开机进不了bios
  13. [艾兰岛]制作传送门之传送技能——kura酱长期更新
  14. AutoCAD如何方便截图放到Word文档,改成白底黑字
  15. APISpace 号码实时查询API接口 免费好用
  16. jQuery中ajax获取数据赋值给页面
  17. 利用7-zip软件压缩并加密自己的保密文件
  18. 黑客:iPhone的这些脑残功能逼我去越狱 苹果:乖,招安是我强项!
  19. 消防工程师 2.1 自动喷水灭火系统-湿式
  20. paypal for php,PayPal网站付款标准版(for PHP),paypal标准版_PHP教程

热门文章

  1. 区块链: 编译发布智能合约
  2. CSS代码重构与优化之路(转)
  3. Docker-CE 入门
  4. 谁说固态硬盘没容量?4TB诞生、明年8TB!
  5. 两轮小车相关记录(重点)
  6. WinForm小程序系列:注册表阅读器
  7. eclipse图标含义
  8. 10分钟10行代码开发APP(delphi 应用案例)
  9. 左连接、右连接、交叉连接、全外连接
  10. ubuntu14操作系统chrome标签和书签乱码解决