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 分页 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应用 多点触摸图片处理应用程序(1)-同时处理多张图片(2)

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

XAML  
 
<Window x:Class="MultitouchHOL.MainWindow" 
 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation
 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml
 
    Title="MultitouchHOL" Height="300" Width="300" WindowState="Maximized" 
 
    xmlns:mt="clr-namespace:MultitouchHOL"> 
 
    <Canvas Name="_canvas"> 
 
    </Canvas> 
 
</Window> 
 

注意:此窗口仅包含一个画布元素 (_canvas)。画布是包含 Picture 用户控件实例的面板。 
4.   现在打开 MainWindow.xaml.cs 。如果用户按住鼠标左键,_picture 成员将拥有当前跟踪的图片;否则,它将拥有空值。_prevLocation 是 Mouse Move 事件报告的上一个位置,用于计算偏移量。
5.   MainWindow 构造函数创建主窗口,注册各种事件处理函数。

 

public MainWindow()    
{  
 
     InitializeComponent();  
 
     //启用笔触事件和加载图片  
 
     this.Loaded += (s, e) => { LoadPictures(); };  
 
     //注册鼠标事件  
 
     MouseLeftButtonDown += ProcessDown;  
 
     MouseMove += ProcessMove;  
 
     MouseLeftButtonUp += ProcessUp;  
 
     MouseWheel += ProcessMouseWheel;  
 

 

6.    LoadPictures() 函数从用户的图片文件夹加载图片,并为所有图片创建一个 Picture 控件。它只在初始化画布之后才执行此操作。下面看一下 LoadPictures() 代码。
7.   现在看一下如何处理鼠标事件。

 

private void ProcessDown(object sender, MouseButtonEventArgs args)  
{  
 
     _prevLocation = args.GetPosition(_canvas);  
 
     _picture = FindPicture(_prevMouseLocation);  
 
     BringPictureToFront(_picture);  
 

按下鼠标左键将启动一个新的图片拖动会话。首先我们必须获得相对于画布的指针位置。我们将此信息保存在 _prevLocation 数据成员中。
8.  下一步是在该位置找到一张图片。FindPicture() 函数利用 WPF VisualTree 点击测试功能来找到最顶层的图片。如果鼠标所在位置没有图片,则返回空值。
9.    BringPictureToFront() 将所选图片的 Z 轴次序设置在其他图片的最顶层。
此处理程序的处理结果是 _picture 数据成员“记住”了所选的图片,_prevLocation 获取鼠标位置的代码片段。我们看一下当鼠标移动时会发生什么情况:

private void ProcessMove(object sender, MouseEventArgs args)    
{  
 
     if (args.LeftButton == MouseButtonState.Released || _picture == null)  
 
         return;  
 
     Point newLocation = args.GetPosition(_canvas);  
 
     _picture.X += newLocation.X - _prevMouseLocation.X;  
 
     _picture.Y += newLocation.Y - _prevMouseLocation.Y;  
 
     _prevLocation = newLocation;  
 

 

如果用户未按下鼠标左键或者未选择任何图片,该函数将不执行任何操作。否则,该函数将计算平移量并更新图片的 X 和 Y 属性。它还将更新 _prevLocation。
10.  我们需要注意的最后一个函数是 ProcessMouseWheel:

 

private void ProcessMouseWheel(object sender, MouseWheelEventArgs args)  
 
{  
 
    Point location = args.GetPosition(_canvas);  
 
    Picture picture = FindPicture(location);  
 
    if (picture == null)  
 
        return;  
 
    BringPictureToFront(picture);  
 
    double scalingFactor = 1 + args.Delta / 1000.0;  
 
    picture.ScaleX *= scalingFactor;  
 
    picture.ScaleY *= scalingFactor;  
 

 

 

将鼠标事件替换为触摸事件  
 
我们将删除鼠标事件并将其替换为触摸事件,以便使用我们的手指处理图片。
1. 将以下代码行添加到 MainWindow.xaml.cs 文件 (C#) 开头:

 

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

2.  我们想要在 WPF 3.5 SP1 中实现多点触摸事件。为此,必须告诉系统以触笔事件的形式发出触摸事件。Windows 7 Integration Library 的 WPF Factory 类拥有一个函数来实现此功能,那就是 EnableStylusEvent。在 MainWindow Loaded 事件处理程序中添加对此函数的调用:

public MainWindow()   
{  
 
    ...  
 
    //启用笔触事件和加载图片  
 
    this.Loaded += (s, e) => { Factory.EnableStylusEvents(this); LoadPictures(); };  
 
    ... 
 

3. 删除 ProcessMouseWheel 事件处理程序及相应的事件注册(我们将在稍后处理缩放)。
4. (仅适用于 C# 用户)删除 MouseLeftButtonDown、MouseMove 和 MouseLeftButtonUp 的事件注册代码。MainWindow 构造函数应该类似于以下代码:

 

public MainWindow()  
 
{  
 
    InitializeComponent();  
 
 
    if (!Windows7.Multitouch.TouchHandler.DigitizerCapabilities.IsMultiTouchReady)  
 
    {  
 
        MessageBox.Show("Multitouch is not availible");  
 
        Environment.Exit(1);  
 
    }  
 
 
    this.Loaded += (s, e) => { Factory.EnableStylusEvents(this); LoadPictures(); };  
 

 

(责任编辑:admin)

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