日期:2014-05-17 浏览次数:21287 次
关于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