Asp.Net教程,WinForm教程,Asp.Net MVC,vs2008教程,vs2010教程,Silverlight技术,源码下载,Asp.Net视频教程
全站热门标签
vs2010 Silverlight 存储过程 水晶报表 ADO.NET JavaScript LINQ AjaxPro DataGridView 面向对象 Extjs GridView XML DevExpress HTML教程 Oracle jQuery 分页 Prototype教程 GDI+ Visual C++2010 MySQL Office2010 WPF MVC Dojo WCF4.0 VB.NET Sql2005 textbox cookie WCF WinForm Discuz!NT SQL经典语句 T-SQL checkbox ASPxGridView F# asp.net SQL VS2008新特性 DropDownList Access TreeView Ajax VS2008 页面执行时间 Flex 字符串 回调 VB2005 DataSet C#时间 ASP.NET性能优化 用户在线检测
当前位置: 主页 > 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)

Tags:图片处理 C#2010
责任编辑:admin
返回顶部
------分隔线----------------------------
推荐内容
骆驼户外男 真皮磨砂日常休闲鞋 低帮 2011秋冬新款 专柜正品特价 骆驼户外男 真皮磨砂日常休闲鞋 低帮 2011秋冬新款 专柜正品特价