日期:2014-05-17  浏览次数:21287 次

关于Windows Multipoint Mouse SDK的学习和使用

关于MultiPint的项目的总结

前一周刚学习编写了一个程序。我们利用微软所提供的MultioPoint的SDK,可以在一台电脑上利用多个鼠标进行同时操作(但必须是USB口的鼠标才可以正常使用)。我们的应用程序在开始运行后加载了存放在图库的所有图片,然后客户们可以使用各自的鼠标进行选择不同的图片,然后选中的图片就会出现在界面中间的画板上。然后大家用自己的鼠标选择任意的颜色,便可同时在一个画板上同时画画。虽然功能比较少,但是它实现了多人在一台电脑上用各自的鼠标同步操作的功能,有别于多机互联实现同步操作,在同一电脑上操作更方便大家交流,团队意识也更强。

现在开始分析我们应用程序的结构。

1. 关于鼠标的插入事件的响应(并为每个鼠标设置各自的指针图片)

2. 关于控件响应鼠标点击后播放动画(此动画由Silverlight合成)

3. 关于每个控件的重载(由基本的控件派生出MultiPoint控件)

4. 关于图片选择的路径解决

以上是我们这次程序的主要过程,我下面会把每一步的设计与解决方案与大家分享。希望对大家在开发WPF或MulitPoint的时候有所帮助。

1、鼠标的插入与拔除事件的响应

---Windows对于USB口的鼠标只会在屏幕上显示一个鼠标,而对于MultiPoint来说每一个USB口的鼠标它都会在屏幕上虚拟一个鼠标出来,而真实的鼠标会被它隐藏在屏幕左上角。每当有鼠插入电脑的时候,我们就可捕捉到这个事件。如下

MultiPointSDK.Instance.DeviceArrivalEvent +=

new EventHandler<DeviceNotifyEventArgs>(DeviceArrivalEvent);

我们在DeviceArrivalEvent里面就可以为每个新插入的鼠标进行颜色和图标的设置

void msdk_DeviceArrivalEvent(object sender, DeviceNotifyEventArgs e)

{

if (e.DeviceInfo.DeviceType == DeviceType.Mouse)

{

DeviceInfo di = e.DeviceInfo;

SetMousePicAndCol(Convert.ToInt32(di.ID));

}

}

Void SetMousePicAndCol(int i)

{

DeviceInfo mouseObject = (DeviceInfo)MultiPointSDK.Instance.MouseDeviceList[i];

MultiPointMouseDevice mpMouseDevice =

(MultiPointMouseDevice)mouseObject.DeviceVisual;

mpMouseDevice.MouseSpeed = 2;//设置速度

mpMouseDevice.CursorColor = Colors.Red; //设置颜色

mpMouseDevice.CursorImage = //设置图标 ConvertBitmapToBitmapImage(Properties.Resources.a);

}

2. 控件响应鼠标点击后播放动画

首先我们需要给每个控件都编辑各自动画,这部分是在XALM中完成的。

<Storyboard x:Key="StoryboardCloseME">

<DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="image" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)">

<SplineDoubleKeyFrame KeyTime="00:00:00.3000000" Value="1.231"/>

</DoubleAnimationUsingKeyFrames>

</Storyboard>

//在image控件(Name= ClosePalette)上绑定了动作StoryboardCloseME

在后台C#中激活此动作

ClosePalette.MultiPointMouseEnterEvent +=new RoutedEventHandler(CloseME);

//事件触发

public void CloseME(object sender, RoutedEventArgs e)

{

Storyboard CloseME = this.FindResource("StoryboardCloseME") as Storyboard;

CloseME.Begin();

}

//动作激活

3、每个控件的重载

因为在MultiPoint中,我们所见到的其它程序界面有所不同,在MultiPoint中我们使用的控件都需要重载普通控件,这个虚拟鼠标就可以触发上面的事件了。

在工程中新加一个Page(WPF),从下载的SDK中的MultiPointButton中的复制一份

以下是重载系统的Image为MultiPointImage

public class MultiPointImage : System.Windows.Controls.Image, IMultiPointMouseEvents, IMultiPointGenericDeviceEvents

重载的主要实现的让此控件可以响应在MultiPoint下鼠标事件,其基本属性保持不变的情况下,增加了对虚拟鼠标的响应。其它内容可以参考MultiPointButton的重载。

ImageButton.MultiPointMouseEnterEvent +=new RoutedEventHandler(CloseME);

在后台为每个控件增加其事件触发。

4. 图片选择的路径解决

A.对于程序读取当前目录下文件的问题。在我们加载客户需要的图片时候,我们需要从程序的目录下SourceImages文件找到每个要加载的图片的路径,下面的代码实现了路径的确定和对每一张图片的加载。

public void GetImages()

{

this.PictureListing.Items.Clear();

string path = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);

path += "\\SourceImages";

if (Directory.Exists(path) == false)//如果不存在就创建file文件夹

{

Directory.CreateDirectory(path);

}

List<string> listOfImages = FileFolderChecker.GetImageFiles(path);

foreach (string imagePath in listOfImages)

{

AddImageToList(imagePath, new Point(0, 0));//把图片加载到控件List

}

}

B.关于MultiPointListBox控件上的图片响应鼠标事件后路径的确定。首先把响应事件与鼠标动作绑定。

PictureListing.MultiPointMouseLeft