DragDrop

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

namespace DrogDrop
{
 /// <summary>
 /// Form1 的摘要描述。
 /// </summary>
 public class Form1 : System.Windows.Forms.Form
 {
  private System.Windows.Forms.TreeView treeView1;
  private System.Windows.Forms.ImageList imageList1;
  private System.ComponentModel.IContainer components;
  private System.Windows.Forms.TreeNode oldNode;
  private System.Drawing.Color oldNodeForeColor;
  private System.Drawing.Color oldNodeBackColor;
  private System.Windows.Forms.Button button1;
  private System.Windows.Forms.Button button2;
  private System.Drawing.Bitmap bitmap;

  public Form1()
  {
   //
   // Windows Form 設計工具支援的必要項
   //
   InitializeComponent();

             oldNode = null;
   int bitmapwidth = this.ClientRectangle.Width;
   int bitmapheight = this.ClientRectangle.Height;
   //構造圖象的對象
   bitmap = new Bitmap(bitmapwidth+145,bitmapheight,this.CreateGraphics());
   //獲取繪圖的平面
   Graphics g = Graphics.FromImage(bitmap);
   //使用窗口顏色清除背景
   g.Clear(this.BackColor);
   //繪制圖形
   g.FillEllipse(new SolidBrush(Color.YellowGreen),149,5,bitmapwidth-10,bitmapheight-10);
   g.DrawRectangle(new Pen(Color.Red,10.0f),145,1,bitmapwidth,bitmapheight);
   //
   // TODO: 在 InitializeComponent 呼叫之後加入任何建構函式程式碼
   //

  }

  /// <summary>
  /// 清除任何使用中的資源。
  /// </summary>
  protected override void Dispose( bool disposing )
  {
   if( disposing )
   {
    if (components != null)
    {
     components.Dispose();
    }
   }
   base.Dispose( disposing );
  }

  #region Windows Form 設計工具產生的程式碼
  /// <summary>
  /// 此為設計工具支援所必須的方法 - 請勿使用程式碼編輯器修改
  /// 這個方法的內容。
  /// </summary>
  private void InitializeComponent()
  {
   this.components = new System.ComponentModel.Container();
   System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(Form1));
   this.treeView1 = new System.Windows.Forms.TreeView();
   this.imageList1 = new System.Windows.Forms.ImageList(this.components);
   this.button1 = new System.Windows.Forms.Button();
   this.button2 = new System.Windows.Forms.Button();
   this.SuspendLayout();
   //
   // treeView1
   //
   this.treeView1.AllowDrop = true;
   this.treeView1.BackColor = System.Drawing.Color.Silver;
   this.treeView1.BorderStyle = System.Windows.Forms.BorderStyle.None;
   this.treeView1.Dock = System.Windows.Forms.DockStyle.Left;
   this.treeView1.ImageList = this.imageList1;
   this.treeView1.Location = new System.Drawing.Point(0, 0);
   this.treeView1.Name = "treeView1";
   this.treeView1.Nodes.AddRange(new System.Windows.Forms.TreeNode[] {
                      new System.Windows.Forms.TreeNode("節點0", new System.Windows.Forms.TreeNode[] {
                                           new System.Windows.Forms.TreeNode("節點01", 1, 1, new System.Windows.Forms.TreeNode[] {
                                                                 new System.Windows.Forms.TreeNode("節點011", 2, 2, new System.Windows.Forms.TreeNode[] {
                                                                                     new System.Windows.Forms.TreeNode("節點0", 2, 2)})})}),
                      new System.Windows.Forms.TreeNode("節點2", new System.Windows.Forms.TreeNode[] {
                                           new System.Windows.Forms.TreeNode("節點21", 2, 2)}),
                      new System.Windows.Forms.TreeNode("節點3", new System.Windows.Forms.TreeNode[] {
                                           new System.Windows.Forms.TreeNode("節點31", 2, 2)}),
                      new System.Windows.Forms.TreeNode("節點1"),
                      new System.Windows.Forms.TreeNode("節點2")});
   this.treeView1.Size = new System.Drawing.Size(136, 469);
   this.treeView1.TabIndex = 0;
   this.treeView1.AfterExpand += new System.Windows.Forms.TreeViewEventHandler(this.treeView1_AfterExpand);
   this.treeView1.AfterCollapse += new System.Windows.Forms.TreeViewEventHandler(this.treeView1_AfterCollapse);
   this.treeView1.DragOver += new System.Windows.Forms.DragEventHandler(this.treeView1_DragOver);
   this.treeView1.DragEnter += new System.Windows.Forms.DragEventHandler(this.treeView1_DragEnter);
   this.treeView1.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.treeView1_ItemDrag);
   this.treeView1.DragDrop += new System.Windows.Forms.DragEventHandler(this.treeView1_DragDrop);
   //
   // imageList1
   //
   this.imageList1.ImageSize = new System.Drawing.Size(16, 15);
   this.imageList1.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageList1.ImageStream")));
   this.imageList1.TransparentColor = System.Drawing.Color.Transparent;
   //
   // button1
   //
   this.button1.Location = new System.Drawing.Point(160, 416);
   this.button1.Name = "button1";
   this.button1.Size = new System.Drawing.Size(96, 24);
   this.button1.TabIndex = 1;
   this.button1.Text = "拷貝至剪貼板";
   this.button1.Click += new System.EventHandler(this.button1_Click);
   //
   // button2
   //
   this.button2.Location = new System.Drawing.Point(352, 416);
   this.button2.Name = "button2";
   this.button2.Size = new System.Drawing.Size(75, 24);
   this.button2.TabIndex = 2;
   this.button2.Text = "粘貼";
   this.button2.Click += new System.EventHandler(this.button2_Click);
   //
   // Form1
   //
   this.AllowDrop = true;
   this.AutoScaleBaseSize = new System.Drawing.Size(5, 15);
   this.BackColor = System.Drawing.Color.Silver;
   this.ClientSize = new System.Drawing.Size(544, 469);
   this.Controls.Add(this.button2);
   this.Controls.Add(this.button1);
   this.Controls.Add(this.treeView1);
   this.ImeMode = System.Windows.Forms.ImeMode.HangulFull;
   this.Name = "Form1";
   this.Text = "Form1";
   this.WindowState = System.Windows.Forms.FormWindowState.Maximized;
   this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Form1_MouseDown);
   this.DragDrop += new System.Windows.Forms.DragEventHandler(this.Form1_DragDrop);
   this.Paint += new System.Windows.Forms.PaintEventHandler(this.Form1_Paint);
   this.DragEnter += new System.Windows.Forms.DragEventHandler(this.Form1_DragEnter);
   this.ResumeLayout(false);

  }
  #endregion

  /// <summary>
  /// 應用程式的主進入點。
  /// </summary>
  [STAThread]
  static void Main()
  {
   Application.Run(new Form1());
  }

  private void treeView1_AfterExpand(object sender, System.Windows.Forms.TreeViewEventArgs e)
  {
      e.Node.ImageIndex = 1;
   e.Node.SelectedImageIndex = 3;
  }

  private void treeView1_AfterCollapse(object sender, System.Windows.Forms.TreeViewEventArgs e)
  {
     e.Node.ImageIndex = 0;
   e.Node.SelectedImageIndex = 1;
  }

  private void treeView1_ItemDrag(object sender, System.Windows.Forms.ItemDragEventArgs e)
  {
   //啟動拖放操作
   DoDragDrop(e.Item,DragDropEffects.Move);
  }

  private void treeView1_DragEnter(object sender, System.Windows.Forms.DragEventArgs e)
  {
   //獲取TREENODE的數據格式
   object data = e.Data.GetData(typeof(TreeNode));
   
   //如果數據型為NODE
   if(data != null)
   {
    //把這個數據轉換成TREENODE型數據
    TreeNode dragNode = (TreeNode)data;
    //檢驗它是否屬於這個窗體內的TREEVIEW控件
    if(dragNode.TreeView.Equals(this.treeView1))
    {
     //如果相等
     e.Effect = DragDropEffects.Move;

    }
    else
    {
     //否則不接收這個數據
     e.Effect =DragDropEffects.None;
    }
   }
   else
   {
     e.Effect = DragDropEffects.None;
   }
  }

  private TreeNode FindTreeNode(int x,int y)
  {
   //把當前的鼠標換成控件內的坐標
     Point pt = treeView1.PointToClient(new Point(x,y));
   //獲取第一個結點如果窗口沒有滾動
   TreeNode node = treeView1.TopNode;
   
   while(node != null)
   {
    if(node.Bounds.Contains(pt))
    {
     return node;
    }
    else
    {
       node = node.NextVisibleNode;
    }
   }
   return null;
  }

  private void treeView1_DragOver(object sender, System.Windows.Forms.DragEventArgs e)
  {
     //如果允許移動,則可以肯定這是可以接受的數據
   if(e.Effect ==DragDropEffects.Move)
   {
      //獲取當前鼠標的結點
    TreeNode overNode = FindTreeNode(e.X,e.Y);
    //如果鼠標位置處的結果不為空且不是上次的鼠標的結點
    if(overNode != null && !overNode.Equals(oldNode))
    {
       //如果上一次鼠標有結點
     if(oldNode != null)
     {
        oldNode.BackColor = oldNodeBackColor;
                       oldNode.ForeColor = oldNodeForeColor;

     }
     oldNode = overNode;

     //保存當前鼠標 結點處的顏色
     oldNodeBackColor = overNode.BackColor;
     oldNodeForeColor = overNode.ForeColor;

     //獲取當前移動的結點
                    TreeNode movingNode =
               (TreeNode)(e.Data.GetData(typeof(TreeNode)));
                    //根據當前鼠標位置處的節點是否為正被拖動的節點分別設置顏色
      if( overNode.Equals(movingNode))
      {
       overNode.BackColor = Color.Red;
       overNode.ForeColor = Color.White;
      }
      else
      {
         overNode.BackColor = Color.Green;
                           overNode.ForeColor = Color.White;
      }

    }
   }
  }

  private void treeView1_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
  {
     //恢復上次鼠標位置處節點的顏色
   oldNode.BackColor = oldNodeBackColor;
   oldNode.ForeColor = oldNodeForeColor;

   //把這個結點改為null
   oldNode = null;

   //如果允許移動,則可以肯定 這是 我可以接收的數據
   if(e.Effect == DragDropEffects.Move)
   {
      //獲取鼠標處的結點
    TreeNode overNode = FindTreeNode(e.X,e.Y);
    //獲取當前移動的結點
    TreeNode movingNode = (TreeNode)(e.Data.GetData(typeof(TreeNode)));
                //如果鼠標位置處沒有結點
     if(overNode == null)
     {
      //如果被移動的結點不是根結點,則把被移動的結點當作根結點
      if(movingNode.Parent  != null)
      {
       //如果被移動的結點只有這個被移動的結點更改它的圖標
       if(movingNode.Parent.Nodes.Count == 1)
       {
        movingNode.Parent.ImageIndex = 2;
        movingNode.Parent.SelectedImageIndex = 2;
        
       }
       //刪除被移動的結點
       movingNode.Remove();

       //添加為根結點
       treeView1.Nodes.Add(movingNode);
                           
      }
     }
     else if(overNode.Parent == movingNode.Parent)
     {
      //如果這個結點有子結點
      if(overNode.Nodes.Count != 0)
      {
       if(movingNode.Parent != null)
       {
        if(movingNode.Parent.Nodes.Count == 1)
        {
         movingNode.Parent.ImageIndex = 2;
         movingNode.Parent.SelectedImageIndex = 2;
                                   
        }
       }
       movingNode.Remove();
       //把被 移動的這個 結點作為這個 結點的子結點
       overNode.Nodes.Add(movingNode);
       //展開這個 結點
       overNode.Expand();
       overNode.ImageIndex = 1;
      }
     }//否則,如果鼠標位置處的結點不包含子節點
     else if(overNode.Nodes.Count == 0)
     {
      if(movingNode.Parent != null)
      {
       if(movingNode.Parent.Nodes.Count ==1)
       {
        movingNode.Parent.ImageIndex = 2 ;
        movingNode.Parent.SelectedImageIndex = 2;

       }
      }
      movingNode.Remove();
      //把被移動的結點移到和這個節點相同的層次內
      //如果這個結點是根結點
      if(overNode.Parent == null)
      {
       treeView1.Nodes.Add (movingNode);
      }
       //否則
      else
      {
       overNode.Parent.Nodes.Add (movingNode);
      }

     }
      //否則,如果被 移動 的節點是根節點 ,或者鼠標 位置 處的結點不包含被移動的結點
     else if(movingNode.Parent == null || !movingNode.Parent.Equals(overNode))
     {
      if(movingNode.Parent != null)
      {
       if(movingNode.Parent.Nodes.Count == 1)
       {
         movingNode.ImageIndex = 2;
         movingNode.SelectedImageIndex = 2;
                               
       }
      }
      movingNode.Remove();
      //把被 移動的結點 從這個結點的節節點 刪除
      overNode.Nodes.Add(movingNode);
      overNode.Expand();
      overNode.ImageIndex = 1;
     }
   }
  }

  private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
  {
     Graphics g = e.Graphics;
   //顯示圖象
   g.DrawImage(bitmap,new Rectangle(140,0,bitmap.Width,bitmap.Height),10,0,bitmap.Width,bitmap.Height,GraphicsUnit.Pixel);

  }

  private void Form1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
  {
    //圖象在窗體內的矩開區域
   Rectangle rect = new Rectangle(145,0,bitmap.Width,bitmap.Height);
   //檢驗鼠標是否在區域內
   if(rect.Contains(new Point(e.X ,e.Y)))
   {
      //啟 動拖放操作
    DoDragDrop(bitmap,DragDropEffects.Copy);
   }
  }

  private void Form1_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
  {
     //獲取數據
   object data = e.Data.GetData(typeof(Bitmap));

   if(data != null)
   {
      bitmap = (Bitmap)data;
    this.Invalidate();

   }
  }

  private void Form1_DragEnter(object sender, System.Windows.Forms.DragEventArgs e)
  {
   //如果是BITMAP類型的數據
   if(e.Data.GetDataPresent(typeof(Bitmap)))
   {
    //允許拷貝
    e.Effect = DragDropEffects.Copy;
   }
   else
   {
     e.Effect = DragDropEffects.None;
   }

  }

  private void button1_Click(object sender, System.EventArgs e)
  {
   try
   {
      //獲取剪貼板的數據
      IDataObject dataObject = Clipboard.GetDataObject();
    //查詢其中Bitmap中的數據
    object data = dataObject.GetData(typeof(Bitmap));
    //如果剪貼板上有數據
    if(data != null)
    {
      bitmap = (Bitmap)data;
                  //刷新窗口
     this.Invalidate(this.ClientRectangle);
    }
   }
   catch(Exception excep)
   {
     MessageBox.Show(excep.Message,"Error",MessageBoxButtons.OK,MessageBoxIcon.Error);
   }
  }

  private void button2_Click(object sender, System.EventArgs e)
  {
   try
   {
      //往剪貼板上粘貼內容
    Clipboard.SetDataObject(bitmap,true);

   }
   catch(Exception excep)
   {
     MessageBox.Show(excep.Message,"Error",MessageBoxButtons.OK,MessageBoxIcon.Error);
   }
  }

 
 }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值