在同一treeview中拖放节点并实现动态图像跟随 (转)

在同一treeview中拖放节点并实现动态图像跟随 (转)[@more@]

  我在实现同一treeview中拖动节点时,希望鼠标在移动的时候,拖动的节点的图片以及文字都能够跟随鼠标移动,我上网查了一段时间,并且在论坛里发帖子,希望能得到这方面的例子,但都没有实现,最后,我只能自己却寻找一些特别的方法来实现这种效果。下面这些代码是我实现这种效果的简单代码,希望能给各位有所帮助,如果你有更好的方法,也希望你对我多多指教。

实现效果

public class Form1 : System.windows.Forms.Form
 {
 private System.Windows.Forms.TreeView treeView1;
 private System.Windows.Forms.ImageList imageList1;

 public Form1()
 {
 InitializeComponent();
 }


 #region Windows 窗体设计器生成的代码
 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.SuspendLayout();
 //
 // treeView1
 //
 this.treeView1.AllowDrop = true;
 this.treeView1.Font = new System.Drawing.Font("宋体", 12F);
 this.treeView1.ImageList = this.imageList1;
 this.treeView1.Location = new System.Drawing.Point(8, 8);
 this.treeView1.Name = "treeView1";
 this.treeView1.Nodes.AddRange(new System.Windows.Forms.TreeNode[] {
  new System.Windows.Forms.TreeNode("This is a very simple example", 1, 1),
  new System.Windows.Forms.TreeNode("but i dont know another way to do such", 2, 2),
  new System.Windows.Forms.TreeNode("so I think I can realise this a ticky way", 3, 3),
  new System.Windows.Forms.TreeNode("yes if this is helpful for you ,that is my glad ", 4, 4),
  new System.Windows.Forms.TreeNode("ok that is all,have a good day", 0, 0)});
 this.treeView1.Size = new System.Drawing.Size(360, 264);
 this.treeView1.TabIndex = 0;
 this.treeView1.DragOver += new System.Windows.Forms.DragEventHandler(this.treeView1_DragOver);
 this.treeView1.DragEnter += new System.Windows.Forms.DragEventHandler(this.treeView1_DragEnter);
 this.treeView1.MouseMove += new System.Windows.Forms.MouseEventHandler(this.treeView1_MouseMove);
 this.treeView1.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.treeView1_ItemDrag);
 this.treeView1.DragLeave += new System.EventHandler(this.treeView1_DragLeave);
 this.treeView1.DragDrop += new System.Windows.Forms.DragEventHandler(this.treeView1_DragDrop);
 //
 // imageList1
 //
 this.imageList1.ImageSize = new System.Drawing.Size(16, 16);
 this.imageList1.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.Getobject("imageList1.ImageStream")));
 this.imageList1.TransparentColor = System.Drawing.Color.Transparent;
 //
 // Form1
 //
 this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
 this.ClientSize = new System.Drawing.Size(376, 277);
 this.Controls.Add(this.treeView1);
 this.Name = "Form1";
 this.Text = "Form1";
 this.ResumeLayout(false);

 }
 #endregion

[STAThread]
 static void Main()
 {
 Application.Run(new Form1());
 }

 ImageFoRM form;
 private void treeView1_ItemDrag(object sender, System.Windows.Forms.ItemDragEventArgs e)
 {
 TreeNode dragNode = (TreeNode)e.Item;
 form = new ImageForm((Bitmap)imageList1.Images[dragNode.ImageIndex],dragNode.Text);
 form.Load +=new EventHandler(form_Load);
 form.TopLevel = false;
 form.Visible = true;
 this.Controls.Add(form);
 form.BringToFront();

 treeView1.DoDragDrop(e.Item,DragDropEffects.Move);
 }

 private void treeView1_DragEnter(object sender, System.Windows.Forms.DragEventArgs e)
 {
 if(e.Data.GetDataPresent(typeof(TreeNode)))
 {
 e.Effect = DragDropEffects.Move;
 }
 }

 private void treeView1_DragOver(object sender, System.Windows.Forms.DragEventArgs e)
 {
 TreeView tv = sender as TreeView;
 TreeNode dragNode = (TreeNode)e.Data.GetData(typeof(TreeNode));
 Point pt = ((TreeView)sender).PointToClient(new Point(e.X, e.Y));
 form.Visible = true;
 form.Location = new Point(pt.X + 18,pt.Y + 6);
 form.BringToFront();
 TreeNode overNode = ((TreeView)sender).GetNodeAt(pt);
 treeView1.selectedNode = overNode;
 if(overNode == null || dragNode.Equals(overNode))
 {
 e.Effect = DragDropEffects.None;
 }
 else
 {
 e.Effect = DragDropEffects.Move;
 
 }
 }

 private void treeView1_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
 {
 if(e.Effect == DragDropEffects.Move)
 {
 TreeView tv = sender as TreeView;
 TreeNode dragNode = (TreeNode)e.Data.GetData(typeof(TreeNode));
 Point pt = ((TreeView)sender).PointToClient(new Point(e.X, e.Y));
 TreeNode destinationNode = ((TreeView)sender).GetNodeAt(pt);
 if(destinationNode.Parent == null)
 {
 treeView1.Nodes.Insert(destinationNode.Index,(TreeNode)dragNode.Clone());
 
 }
 else
 {
 destinationNode.Parent.Nodes.Insert(destinationNode.Index,(TreeNode)dragNode.Clone());
 }
 if(dragNode.Parent == null)
 {
 treeView1.Nodes.Remove(dragNode);
 }
 else
 {
 dragNode.Parent.Nodes.Remove(dragNode);
 }
 }
 }
 
 private void treeView1_DragLeave(object sender, System.EventArgs e)
 {
 form.Visible = false;
 }

 private void treeView1_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
 {
 if(form != null)
 {
 this.Controls.Remove(form);
 form = null;
 }
 }

 }

下面是我实现的动态加载的窗体的源码

public class ImageForm : System.Windows.Forms.Form
 {
 private string text = "";
 private Bitmap bitmap;
 public ImageForm(Bitmap bitmap,string text)
 {
 this.text = text;
 this.bitmap = bitmap;
 InitializeComponent();
 }

 #region Windows 窗体设计器生成的代码
 private void InitializeComponent()
 {
 this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
 this.ClientSize = new System.Drawing.Size(368, 56);
 this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
 this.Name = "Form2";
 this.Text = "Form2";
 this.Load += new System.EventHandler(this.Form2_Load);

 }
 #endregion

 private void Form2_Load(object sender, System.EventArgs e)
 {
 Rectangle rect = this.ClientRectangle;
 Bitmap b = new Bitmap(this.Width,this.Height);
 using(Graphics g = Graphics.FromImage(b))
 {
 g.FillRectangle(SystemBrushes.Window,rect);
 Rectangle bmpRect = new Rectangle(0,0,bitmap.Width,bitmap.Height);
 g.DrawImage(bitmap,bmpRect);
 Rectangle textRect = new Rectangle(bitmap.Width + 4,0,rect.Width - bitmap.Width - 4,rect.Height);
 g.DrawString(text,this.Font,SystemBrushes.ControlDarkDark,textRect);
 Region r = GetRegion(b,SystemColors.Window);
 this.BackgroundImage = b;
 this.Region = r;
 }
 }
 #region get the region about a image
 private Region GetRegion(Bitmap _img, Color color)
 {

 Color _matchColor=Color.FromArgb(color.R,color.G,color.B);

 System.Drawing.Region rgn= new Region();

 rgn.MakeEmpty();

 Rectangle rc=new Rectangle(0,0,0,0);

 bool inimage=false;

 for(int y=0; y<_img.height> {
 for(int x=0;x<_img.width> {
 if(!inimage)
 {
 if(_img.GetPixel(x,y)!=_matchColor)
 {
 inimage=true;
 rc.X=x;
 rc.Y=y;
 rc.Height=1;
 }
 }
 else
 {
 if(_img.GetPixel(x,y)==_matchColor)
 {
 inimage=false;
 rc.Width=x-rc.X;
 rgn.Union(rc); 
 }
 }
 }
 if(inimage)
 {
 inimage=false;
 rc.Width=_img.Width-rc.X;
 rgn.Union(rc); 
 }
 }
 return rgn;
 }
 #endregion
 }

 

感谢bobpowell,我在他的网站上发现了getregion这个方法,解决了我的难题,你可以从

.NET/region_from_bitmap.htm">http://www.bobpowell.net/region_from_bitmap.htm看到有关这一方法的文章。

 


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10752019/viewspace-963681/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10752019/viewspace-963681/

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值