关于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.MultiPointMouseLeftButtonDownEvent +=
new RoutedEventHandler(PictureListingLMD);
public void PictureListingLMD(object sender, RoutedEventArgs e)
{
int ItemIndex = this.PictureListing.SelectedIndex;
ImagePreview i = (ImagePreview)this.PictureListing.Items[ItemIndex];
this.img.Source = new BitmapImage(new Uri(i.ImagePath, UriKind.Absolute));
}
以上是从ListBox控件PictureListing上得到被选择的图片的序号,然后在列表里得到相应序号的图片的信息ImagePreview。最后为XAML里面的控件Image(Name=img)更新图片。
i. ImagePath 图片的绝对路径
ii. UriKind.Absolute 图片的是否为绝对路径(此参数有三个,Relative为相对路径)
以上是我们此次程序的部分主要应用代码的分析,因为在开始学习到完成这次程序的开发,我们团队共经过了不到一周的时间。大家为了一个共同的目标聚到了一起,我们一起学习MulitPoint,WPF,Sliverlight等技术,虽然时间短,但我们学习到了很多东西,在学习的过程中请教了很多牛人,现在做一总结,感谢大家对我们帮助的同时也分享一下自己的经验与学习以上技术的朋友们。