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);
}
}
}
}