MF的标准模块仅支持按键,并不支持鼠标功能。但是对一些常见应用来说,如果没有鼠标(或触摸屏)用起来就太不习惯了。有什么办法可以让MF支持鼠标功能呢?第一,外部设备必须把鼠标信息传到MF应用程序,应用程序根据这些信息绘制鼠标及执行相应的动作。鼠标信息最少包含三种,鼠标按键状态(按下或放开),鼠标坐标(x,y)。
目前,Spi通道可以非常方便地建立设备和用户程序之间的联系,所以就考虑用Spi来实现该功能。
第一步,还是从我编写的模拟器入手,添加了一个Spi驱动类。
//MouseDevice
public class MouseComponent : SpiDevice
{
public static Int16 State = 0;
public static Int16 X = 0;
public static Int16 Y = 0;
protected override byte[] Write(byte[] data)
{
//------------
//改写坐标值
try
{
//State = (Int16)((data[0] << 8) + data[1]);
//X = (Int16)((data[2] << 8) + data[3]);
//Y = (Int16)((data[4] << 8) + data[5]);
}
catch { }
//------------
//返回当前值
byte[] bytes = new byte[6];
bytes[0] = (byte)(State >> 8);
bytes[1] = (byte)(State & 0xff);
bytes[2] = (byte)(X >> 8);
bytes[3] = (byte)(X & 0xff);
bytes[4] = (byte)(Y >> 8);
bytes[5] = (byte)(Y & 0xff);
return bytes;
}
protected override ushort[] Write(ushort[] data)
{
//------------
//改写坐标值
try
{
//State = (Int16)data[0];
//X = (Int16)data[1];
//Y = (Int16)data[2];
}
catch { }
//------------
//返回当前值
ushort[] Int16s = new ushort[3];
Int16s[0] = (ushort)State;
Int16s[1] = (ushort)X;
Int16s[2] = (ushort)Y;
return Int16s;
}
}
第二步:编写鼠标应用程序
为了通用,我封装了一个windowbase基类
//鼠标事件
public class MouseEventArgs : EventArgs
{
public int X;
public int Y;
public int Button;
public MouseEventArgs()
{
X = 0;
Y = 0;
Button = 0;
State = MouseState.None;
}
public MouseEventArgs(int x, int y)
{
X = x;
Y = y;
Button = 0;
State = MouseState.None;
}
public MouseEventArgs(int x, int y, int button)
{
X = x;
Y = y;
Button = button;
State = MouseState.None;
}
}
//窗体基类
internal class WindowBase : Window
{
protected YFWinApp m_app;
Thread MouseThread;
private ushort state=0, x = 0, y = 0;
SPI _spi=null;
protected WindowBase(YFWinApp app)
{
m_app = app;
this.Visibility = Visibility.Visible;
this.Width = SystemMetrics.ScreenWidth;
this.Height = SystemMetrics.ScreenHeight;
Buttons.Focus(this);
//SPI的pin定义
_spi = new SPI(new SPI.Configuration((Cpu.Pin)127, true, 0, 0, false, false, 4000, SPI.SPI_module.SPI1));
x =(ushort)( this.Width/2);
y =(ushort)( this.Height/2);
MouseThread = new Thread(new ThreadStart(MouseInfo));
MouseThread.Start();
}
protected override void OnButtonDown(ButtonEventArgs e)
{
this.Close();
m_app.GoHome();
}
//获得鼠标信息
private void MouseInfo()
{
ushort[] bout = new ushort[3];
ushort[] bin = new ushort[3];
ushort mX, mY, mState;
while (true)
{
//----------------------------------
//通过spi通道获取鼠标信息这部分信息解析和模拟器相对应
_spi.WriteRead(bout, bin);
mState = bin[0]; //鼠标的状态1- 按下 0 - 放开
mX = bin[1]; //鼠标X坐标
mY = bin[2]; //鼠标Y坐标
//----------------------------------
if (x != mX|| y != mY)
{
x = mX; y = mY;
OnMouseMove(new MouseEventArgs(mX, mY, mState));
}
if (state != mState)
{
state = mState;
if (state == 1)
{
OnMouseDown(new MouseEventArgs(mX, mY, mState));
}
else if(state==0)
{
OnMouseUp(new MouseEventArgs(mX, mY, mState));
OnMouseClick(new MouseEventArgs(mX, mY, mState));
}
}
}
}
//鼠标移动
protected virtual void OnMouseMove(MouseEventArgs e)
{
Debug.Print("MouseMove:" + e.X.ToString() + "," + e.Y.ToString() + "," + e.Button.ToString());
}
//鼠标单击
protected virtual void OnMouseClick(MouseEventArgs e)
{
Debug.Print("MouseClick:" + e.X.ToString() + "," + e.Y.ToString() + "," + e.Button.ToString());
}
//按下
protected virtual void OnMouseDown(MouseEventArgs e)
{
Debug.Print("MouseDown:" + e.X.ToString() + "," + e.Y.ToString() + "," + e.Button.ToString());
}
//抬起
protected virtual void OnMouseUp(MouseEventArgs e)
{
Debug.Print("MouseUp:" + e.X.ToString() + "," + e.Y.ToString() + "," + e.Button.ToString());
}
//绘制鼠标
public override void OnRender(DrawingContext dc)
{
if (state == 1)
{
Pen pp=new Pen(ColorUtility.ColorFromRGB(255,255,0));
dc.DrawLine(pp, x, y - 5, x, y + 5);
dc.DrawLine(pp, x-5, y, x+5, y);
}
int[] points = { x, y, x+10, y+4, x+5,y+5, x+4,y+10};
Pen p = new Pen(Color.White, 1);
dc.DrawPolygon(null, p, points);
}
//窗体刷新
protected void Refresh()
{
this.Left = this.Left;
this.UpdateLayout();
}
}
下面是我们实际运行的效果图,已经非常完美的支持鼠标了(并且模拟器可两种方式提供鼠标信息,一种是鼠标直接在LCD屏上操作,一种是通过扩展面板上的滑块进行移动)。
直接用外部鼠标操作。
通过滑块进行鼠标操作。
分享到:
相关推荐
The Microsoft .NET Micro Framework is a small and efficient .NET runtime environment used to run managed code on devices that are too small and resource constrained for Windows CE and the Compact ...
《玩转.NET Micro Framework移植-基于STM32F10x处理器》源程序
.NET Micro Framework 电子书
.net micro framework关于文件操作的例子,非常详细。还包括了点击等东西
expert .net micro frameworkexpert .net micro frameworkexpert .net micro framework
.NET Micro Framework自动化测试工具,需.NET Micro Framework3.0和.NET Micro Framework Test Kit支持...
Microsoft .NET Micro Framework 2.5 SDK。 这个我暂时没用,权当放在这里存放,需要的,自己动手。
近来有些刚入门的用户,不太了解.NET Micro Framework开发板的使用,所以写了这篇文档,以期缩短用户对开发板的熟悉时间。
micro framework 4.0 SDK,最新开发工具包
注:比上一个模拟器多了支持方向键控制 这是我自己改造的.Net Micro Framework模拟器,比windows自带的漂亮多了。 覆盖该目录下的同名文件(路径以实际开发包安装位置为准)即可。 C:\Program Files\...
这是我自己改造的.Net Micro Framework模拟器,比windows自带的漂亮多了。 覆盖该目录下的同名文件(路径以实际开发包安装位置为准)即可。 C:\Program Files\Microsoft .NET Micro Framework\v2.0.3036\Tools 支持...
.NET Micro Framework 电子书
http://item.taobao.com/item.htm?id=7117999726 .NET Micro Framework开发板的Key文件的部署说明。
.NET Micro Framework开发板原理图(红牛开发板)
.NET Micro Framework开发板使用手册(红牛开发板)
如何顺利编译.Net Micro Framework Porting Kit 4.1 安装路径不能有空格
《玩转.NET Micro Framework 移植-基于STM32F10x处理器》一书所有的源代码。其它更多的资源可以访问我的blog:http://blog.csdn.net/norains 谢谢!
.NET Micro Framework for Windows 7(X64) USB驱动安装说明,包含相应的驱动程序
GHI .NET Micro Framework培训教材