• WinForm支持拖拽效果


    有一个MSDN客户提问在WinForm中如何实现拖拽效果——比如在WinForm中有一个Button,我要实现的效果是拖拽这个Button到目标位置后生成一个该控件的副本。

    其实这个操作主要分成三步走:

    1)确定被拖拽的对象:这里是Button(要使得Button被单击之后可以拖拽,那么必须处理其MouseDown事件,同时调用其DoDragDrop——该函数接受两个参数:i)要拖动的数据。ii)拖动的效果(该效果是2“目标位置”所能够接受的效果,是一个枚举值):

    [C#]

    Button1.DoDragDrop(Button1, DragDropEffects.Copy || DragDropEffects.Move); //形成拖拽效果,移动+拷贝的组合效果

    [VB.NET]

    Button1.DoDragDrop(Button1, DragDropEffects.Copy Or DragDropEffects.Move)   '形成拖拽效果,移动+拷贝的组合效果

    2)目标位置:这里是Form窗体自身。为了使得和Windows资源管理器中实现的文件拖拽效果一样(即拖拽一个文件到目标位置的中途,鼠标出现“+”号的效果)。那么应当处理DragEnter事件——即拖拽控件途中进入Form体内把效果设置成Copy的效果。

    [C#]

    private void Form1_DragEnter(System.Object sender, System.Windows.Forms.DragEventArgs e)
    {
        //当Button被拖拽到WinForm上时候,鼠标效果出现
        if ((e.Data.GetDataPresent(typeof(Button)))) {
            e.Effect = DragDropEffects.Copy;
        }
    }

    [VB.NET]

    Private Sub Form1_DragEnter(sender As System.Object, e As System.Windows.Forms.DragEventArgs) Handles MyBase.DragEnter
            If (e.Data.GetDataPresent(GetType(Button))) Then    '当Button被拖拽到WinForm上时候,鼠标效果出现
                e.Effect = DragDropEffects.Copy
            End If
        End Sub

    同时,为了使得Form自身支持接受拖拽传来的控件,必须设置其AllowDrag=True:

    另外,一旦松开鼠标,那么拖拽过程结束。此时应当处理DragDrop事件,复制一个按钮:

    [C#]

    private void Form1_DragDrop(System.Object sender, System.Windows.Forms.DragEventArgs e)
    {
        //拖放完毕之后,自动生成新控件
        Button btn = new Button();
        btn.Size = Button1.Size;
        btn.Location = this.PointToClient(new Point(e.X, e.Y));
        //用这个方法计算出客户端容器界面的X,Y坐标。否则直接使用X,Y是屏幕坐标
        this.Controls.Add(btn);
        btn.Text = "按钮" + count.ToString;
        count = count + 1;
    }

    [VB.NET]

     Private Sub Form1_DragDrop(sender As System.Object, e As System.Windows.Forms.DragEventArgs) Handles MyBase.DragDrop
            '拖放完毕之后,自动生成新控件
            Dim btn As New Button
            btn.Size = Button1.Size
            btn.Location = Me.PointToClient(New Point(e.X, e.Y))    '用这个方法计算出客户端容器界面的X,Y坐标。否则直接使用X,Y是屏幕坐标
            Me.Controls.Add(btn)
            btn.Text = "按钮" + count.ToString
            count = count + 1
        End Sub

    这里需要注意点:Location属性(指定控件放置位置的起始点)不能直接用e.X或e.Y——因为这是屏幕坐标,要根据实际的控件界面坐标进行适度转换,最简单方法是——PointToClient方法。

    好了,以下给出完整代码:

    【界面】

    [C#]

    using Microsoft.VisualBasic;
    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Data;
    using System.Diagnostics;
    public class Form1
    {
    
        //计数变量,说明输出了第N个Button
    
        private int count = 1;
        private void Form1_Load(System.Object sender, System.EventArgs e)
        {
            this.AllowDrop = true;
            //窗体自身支持接受拖拽来的控件
        }
    
        private void Button1_MouseDown(System.Object sender, System.Windows.Forms.MouseEventArgs e)
        {
            //左键的话,标志位为true(表示拖拽开始)
            if ((e.Button == System.Windows.Forms.MouseButtons.Left)) {
                Button1.DoDragDrop(Button1, DragDropEffects.Copy | DragDropEffects.Move);
                //形成拖拽效果,移动+拷贝的组合效果
            }
        }
    
        private void Form1_DragEnter(System.Object sender, System.Windows.Forms.DragEventArgs e)
        {
            //当Button被拖拽到WinForm上时候,鼠标效果出现
            if ((e.Data.GetDataPresent(typeof(Button)))) {
                e.Effect = DragDropEffects.Copy;
            }
        }
    
        private void Form1_DragDrop(System.Object sender, System.Windows.Forms.DragEventArgs e)
        {
            //拖放完毕之后,自动生成新控件
            Button btn = new Button();
            btn.Size = Button1.Size;
            btn.Location = this.PointToClient(new Point(e.X, e.Y));
            //用这个方法计算出客户端容器界面的X,Y坐标。否则直接使用X,Y是屏幕坐标
            this.Controls.Add(btn);
            btn.Text = "按钮" + count.ToString();
            count = count + 1;
        }
        public Form1()
        {
            DragDrop += Form1_DragDrop;
            DragEnter += Form1_DragEnter;
            Load += Form1_Load;
        }
    }

    [VB.NET]

    Public Class Form1
    
        '计数变量,说明输出了第N个Button
        Private count As Integer = 1
    
        Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            Me.AllowDrop = True     '窗体自身支持接受拖拽来的控件
        End Sub
     
        Private Sub Button1_MouseDown(sender As System.Object, e As System.Windows.Forms.MouseEventArgs) Handles Button1.MouseDown
            '左键的话,标志位为true(表示拖拽开始)
            If (e.Button = Windows.Forms.MouseButtons.Left) Then
                Button1.DoDragDrop(Button1, DragDropEffects.Copy Or DragDropEffects.Move)   '形成拖拽效果,移动+拷贝的组合效果
            End If
        End Sub
    
        Private Sub Form1_DragEnter(sender As System.Object, e As System.Windows.Forms.DragEventArgs) Handles MyBase.DragEnter
            If (e.Data.GetDataPresent(GetType(Button))) Then    '当Button被拖拽到WinForm上时候,鼠标效果出现
                e.Effect = DragDropEffects.Copy
            End If
        End Sub
    
        Private Sub Form1_DragDrop(sender As System.Object, e As System.Windows.Forms.DragEventArgs) Handles MyBase.DragDrop
            '拖放完毕之后,自动生成新控件
            Dim btn As New Button
            btn.Size = Button1.Size
            btn.Location = Me.PointToClient(New Point(e.X, e.Y))    '用这个方法计算出客户端容器界面的X,Y坐标。否则直接使用X,Y是屏幕坐标
            Me.Controls.Add(btn)
            btn.Text = "按钮" + count.ToString
            count = count + 1
        End Sub
    End Class
  • 相关阅读:
    [转载] set IDENTITY_INSERT on 和 off 的设置
    固定GridView的表头和某几列
    图形文件格式小常识
    MVP——ModelViewerPresenter [ZT]
    VB.NET 中图形旋转任意角度 [ZT]
    工厂方法模式和抽象工厂模式之比较 [Z]
    Visual C# 语言概念数据类型(C# 与 Java)
    LINQ 中使用 Distinct 的 Compare过滤重复的字段
    How to load AJAX content into current Colorbox window?
    解决FTP服务器FileZilla server中文乱码问题
  • 原文地址:https://www.cnblogs.com/ServiceboyNew/p/2476154.html
Copyright © 2020-2023  润新知