• WinForm支持拖拽效果


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

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

    1)确定被拖拽的对象:

    这里是Button(要使得Button被单击之后可以拖拽,那么必须处理其MouseDown事件,

    同时调用其DoDragDrop——该函数接受两个参数:

    i)要拖动的数据。

    ii)拖动的效果(该效果是2“目标位置”所能够接受的效果,是一个枚举值):

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

    2)目标位置:这里是Form窗体自身。

    为了使得和Windows资源管理器中实现的文件拖拽效果一样(即拖拽一个文件到目标位置的中途,鼠标出现“+”号的效果)。

    那么应当处理DragEnter事件——即拖拽控件途中进入Form体内把效果设置成Copy的效果。

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

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

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

    private void Form1_DragDrop(System.Object sender, System.Windows.Forms.DragEventArgs e)
    {
    //拖放完毕之后,自动生成新控件
    Button btn = new Button();
     btn.Size = ((Button)e.Data.GetData(typeof(Button))).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;
    }

    ================================================================

    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; }}
  • 相关阅读:
    axios取消请求
    echarts常用图表配置
    Vue指令限制输入框输入整数小数
    小程序商品飞入购物车组件
    webpack按测试和生产环境进行编译
    地图画线添加标签
    vue-element-admin 动态侧边栏
    html2canvas 和浏览器打印
    echarts 指定某段曲线颜色
    列出表结构
  • 原文地址:https://www.cnblogs.com/lsgsanxiao/p/4835609.html
Copyright © 2020-2023  润新知