返回首页
当前位置: 主页 > VS2010 >

基于Visual C#2010开发Windows7应用 多点触摸图片处理应用程序(2)-使用多点触摸操作处理图片

时间:2010-07-28 12:47来源:blog.csdn.net/yincheng01 作者:admin 点击:

到目前为止,使用触摸事件处理图片与使用鼠标功能并没有太大区别。下面我们将:

•   添加使用多个手指操作图片的能力
•    同时平移、缩放和旋转图片
•    同时操作多张图片
我们已经知道如何将正确的事件分派给相应的 PictureTracker,但我们还不知道如何决定在发生多个事件之后需要采取的操作。这正是 Windows 7 多点触摸机制的用武之地。它拥有一个操作处理器来使用触摸 ID 事件并生成合适的操作事件。您只需实例化一个操作处理器,注册其事件,并为它提供触摸 ID + 位置事件对。 
操作处理器是一个 COM 对象。要在 .NET 中使用它,可以使用 Windows 7 Integration Library 示例。ManipulationProcessor .NET 包装器类构造函数获得一个枚举值,该值告诉它要报告哪些操作。在我们的示例中,我们希望报告所有操作。该处理器有 3 个事件:ManipulationStarted、ManipulationCompleted 和 ManipulationDelta。ManipulationDelta 是我们所关注的事件。它提供了平移、旋转和缩放的偏移量。
1. 更改整个 PictureTracker 类。

class PictureTracker  
 
{  
 
    private readonly ManipulationProcessor _processor =  
 
        new ManipulationProcessor(ProcessorManipulations.ALL);  
 
    public PictureTracker()  
 
    {  
 
        _processor.ManipulationStarted += (s, e) =>  
 
        {  
 
            System.Diagnostics.Trace.WriteLine("Manipulation has started: " + Picture.ImagePath);  
 
        };  
 
        _processor.ManipulationCompleted += (s, e) =>   
 
        {  
 
            System.Diagnostics.Trace.WriteLine("Manipulation has completed: " + Picture.ImagePath);  
 
        };  
 
        _processor.ManipulationDelta += ProcessManipulationDelta;  
 
    }  
 
    public Picture Picture { get; set; }  
 
    public void ProcessDown(int id, Point location)  
 
    {  
 
        _processor.ProcessDown((uint)id, location.ToDrawingPointF());  
 
    }  
 
    public void ProcessMove(int id, Point location)  
 
    {  
 
        _processor.ProcessMove((uint)id, location.ToDrawingPointF());  
 
    }  
 
    public void ProcessUp(int id, Point location)  
 
    {  
 
        _processor.ProcessUp((uint)id, location.ToDrawingPointF());  
 
    }  
 
    //Update picture state  
 
    private void ProcessManipulationDelta(object sender, ManipulationDeltaEventArgs e)  
 
    {  
 
        if (Picture == null)  
 
            return;  
 
        Picture.X += e.TranslationDelta.Width;  
 
        Picture.Y += e.TranslationDelta.Height;  
 
        Picture.Angle += e.RotationDelta * 180 / Math.PI;  
 
        Picture.ScaleX *= e.ScaleDelta;  
 
        Picture.ScaleY *= e.ScaleDelta;  
 
    }  
 

 

2. 将以下命名空间指令添加到 PictureTracker 类中:

using Windows7.Multitouch.Manipulation;  
 
using Windows7.Multitouch.WPF;  
 
Visual Basic  
 
Imports Windows7.Multitouch.Manipulation  
 
Imports Windows7.Multitouch.WPF 
 

注意: 通过添加此命名空间,可以使用 ManipulatorProcessor 类和 System.Windows.Point 扩展方法 ToDrawingPointF。

3. 我们实例化了一个新的 ManipulationProcessor,注册了事件处理器,而且最重要的是,通过更新图片用户控件处理了 ManipulationDelta 事件。现在我们需要对 PictureTrackerManager 事件处理代码稍作修改,并转发触摸 ID 和触摸位置。ManipulationProcessor 需要将触摸 ID 作为操作流程的输入。更改 PictureTrackerManager 中的以下代码:

public void ProcessDown(object sender, StylusEventArgs args)  
 
{  
 
    Point location = args.GetPosition(_canvas);  
 
    PictureTracker pictureTracker = GetPictureTracker(args.StylusDevice.Id, location);  
 
    if (pictureTracker == null)  
 
        return;  
 
    pictureTracker.ProcessDown(args.StylusDevice.Id, location);  
 
}  
 
public void ProcessUp(object sender, StylusEventArgs args)  
 
{  
 
    Point location = args.GetPosition(_canvas);  
 
    PictureTracker pictureTracker = GetPictureTracker(args.StylusDevice.Id);  
 
    if (pictureTracker == null)  
 
        return;  
 
    pictureTracker.ProcessUp(args.StylusDevice.Id, location);  
 
    _pictureTrackerMap.Remove(args.StylusDevice.Id);  
 
}  
 
public void ProcessMove(object sender, StylusEventArgs args)  
 
{  
 
    PictureTracker pictureTracker = GetPictureTracker(args.StylusDevice.Id);  
 
    if (pictureTracker == null)  
 
         return;  
 
     Point location = args.GetPosition(_canvas);  
 
     pictureTracker.ProcessMove(args.StylusDevice.Id, location);  
 

(责任编辑:admin)

[返回顶部]
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名:密码: 验证码:点击我更换图片
推荐内容