找回密码
 立即注册

QQ登录

只需一步,快速开始

leadcom

论坛元老

24

主题

96

帖子

2万

积分

论坛元老

积分
27812

活字格认证

leadcom
论坛元老   /  发表于:2015-8-6 15:21  /   查看:9109  /  回复:10
实现如图:选中第二2页按住鼠标不动,将这页使其成为第一页。实现拖动排序功能。


通过观察rasterimagelist所提供的事件及方法,只实现了drogdrop,drogenter..等拖动事件,并没有实现对项目拖动的事件,如treeview中的ItemDrag事件。


希望能够提供对项目拖动的事件或提供相应的实现代码。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

10 个回复

倒序浏览
iceman
社区贡献组   /  发表于:2015-8-6 17:06:00
沙发
回复 1楼leadcom的帖子

请参考附件Demo:


效果图:



关键代码:


  1. private void imageList_MouseDown(object sender, MouseEventArgs e)
  2.         {
  3.             try
  4.             {
  5.                 if (imageList.HitTest(e.X, e.Y) != null)
  6.                 {
  7.                     bMouseDown = true;
  8.                 }
  9.             }
  10.             catch (Exception ex)
  11.             {
  12.                 MessageBox.Show(ex.ToString());
  13.             }
  14.             base.OnMouseDown(e);
  15.         }

  16.         private void imageList_MouseUp(object sender, MouseEventArgs e)
  17.         {
  18.             if (bDragging)
  19.             {
  20.                 try
  21.                 {
  22.                     RasterImageListItem HitTestListItem = imageList.HitTest(e.X, e.Y);
  23.                     if (HitTestListItem != null)
  24.                     {
  25.                         Rectangle itemRect = imageList.GetItemRectangle(HitTestListItem);
  26.                         int insertIndex = imageList.Items.IndexOf(HitTestListItem);
  27.                         if (e.X > (itemRect.Left + itemRect.Width / 2))
  28.                         {
  29.                             insertIndex++;
  30.                         }

  31.                         // 禁掉一些事件
  32.                         imageList.BeginUpdate();

  33.                         // 创建三个Item用来保存拖拽前后的项目
  34.                         RasterImageListItemCollection NonSelectedItemsBefore = new RasterImageListItemCollection(null);
  35.                         RasterImageListItemCollection SelectedItems = new RasterImageListItemCollection(null);
  36.                         RasterImageListItemCollection NonSelectedItemsAfter = new RasterImageListItemCollection(null);
  37.                         int counter = 0;
  38.                         RasterImageListItem[] tempItems = new RasterImageListItem[imageList.Items.Count];
  39.                         imageList.AutoDisposeImages = false;
  40.                         while (imageList.Items.Count > 0)
  41.                         {
  42.                             if (imageList.Items[0].Selected)
  43.                             {
  44.                                 SelectedItems.Add(imageList.Items[0]);
  45.                             }
  46.                             else
  47.                             {
  48.                                 if (counter < insertIndex)
  49.                                     NonSelectedItemsBefore.Add(imageList.Items[0]);
  50.                                 else
  51.                                     NonSelectedItemsAfter.Add(imageList.Items[0]);
  52.                             }
  53.                             imageList.Items.RemoveAt(0);
  54.                             counter++;
  55.                         }

  56.                         // 重新添加
  57.                         imageList.Items.AddRange(NonSelectedItemsBefore);
  58.                         imageList.Items.AddRange(SelectedItems);
  59.                         imageList.Items.AddRange(NonSelectedItemsAfter);


  60.                         // 绘制
  61.                         imageList.AutoDisposeImages = true;
  62.                         imageList.EndUpdate();
  63.                     }
  64.                 }
  65.                 catch (Exception ex)
  66.                 {
  67.                     MessageBox.Show(ex.ToString());
  68.                 }
  69.             }
  70.             bDragging = false;
  71.             bMouseDown = false;
  72.             base.OnMouseUp(e);
  73.         }

  74.         private void imageList_MouseMove(object sender, MouseEventArgs e)
  75.         {
  76.             if (bMouseDown)
  77.             {
  78.                 bDragging = true;
  79.             }
  80.             base.OnMouseMove(e);
  81.         }
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 使用道具 举报
leadcom
论坛元老   /  发表于:2015-8-6 17:19:00
板凳
谢谢。大虾。
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2015-8-6 17:29:00
地板
回复 3楼leadcom的帖子

客气了,有其他问题欢迎继续交流。

为了给你提供更优质的服务,请对本次服务进行评分。我们会认真对待你提出的宝贵意见,谢谢   
回复 使用道具 举报
leadcom
论坛元老   /  发表于:2015-8-11 15:46:00
5#
该问题已部分解决,我们还需要做的更完善一些。比如:当第2页拖动到第1页时,能否高亮显示第1页,这样就知道我要从哪一页移动到哪一页。
回复 使用道具 举报
AvoCaDolol活字格认证 Wyn认证
社区贡献组   /  发表于:2015-8-11 17:46:00
6#
回复 5楼leadcom的帖子

您好,

根据您的需求,我完善了上面的Demo,添加了如下图的效果:



具体添加的功能是:
1、拖拽时有浮动缩略图
2、拖拽时有动态索引线,红色索引线表明图片松开之后会放置在哪里。

您可以参考我的代码,代码漏洞很多,只是大致满足了您的需求。
其中索引线我写成了红色,您可以根据你自己的需求进行修改,包括线的样式、颜色、粗细、位置。
图片浮动的原理是在ImageList上放了一个隐藏的PictureBox,当开始拖拽时加载当前拖拽的图片并显示出来,鼠标松开时再次隐藏。
你可以将PictureBox替换为Form,Form中再放一个PictureBox,这样可以将Form的透明度设置为50%就变为了半透明,效果看起来更好。
方法有很多,您都可以尝试。

这个代码中没有用到LEADTOOLS的任何功能,全是.Net自带的。



以上,谢谢。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 使用道具 举报
AvoCaDolol活字格认证 Wyn认证
社区贡献组   /  发表于:2015-8-11 17:51:00
7#
回复 5楼leadcom的帖子

您好,

关于您提到的高亮的问题,可以参考我上面的例子来做,就是在鼠标MouseMove时绘画即可。
原理都是一样的,实现的效果各不相同。

以上,谢谢。
回复 使用道具 举报
leadcom
论坛元老   /  发表于:2015-8-28 11:28:00
8#
我想在拖动的时候不用picturebox或者form来做图片的浮动效果。因为在拖动的过程中会感觉好卡的。控件一直在刷。
只需要画出需要拖动到的位置的线就可以了。
但我调整了一下你的代码,把Picture删除掉。这画就出感觉画不出来的样子。有时候又有,有时候有没有。停不住。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 使用道具 举报
AvoCaDolol活字格认证 Wyn认证
社区贡献组   /  发表于:2015-8-28 11:34:00
9#
回复 8楼leadcom的帖子

您好,您的需求我收到了。
我这边试着修改一下Demo程序,改好后发送给您。
回复 使用道具 举报
AvoCaDolol活字格认证 Wyn认证
社区贡献组   /  发表于:2015-9-8 12:20:00
10#
回复 8楼leadcom的帖子

您好,
下面回答您的问题,
1.当选中图片的时候能否改变箭头所指区域的颜色。
答:完全可以,您需要修改示例代码中的DrawDashLine方法,这个方法中我绘制了一条虚线,您可以修改为一个区域并画上颜色。但我需要说明的是,您目前的图片跟边框之所以有一个区域,是因为您的图片跟ImageListItem的大小不同的缘故,如果您加载的图片正好是ImageListItem的大小,那么图片会占满整个蓝色框,所以画颜色的话会导致画在图片上,这一点请您考虑。
2.白色框线能否去掉。
答:这个蓝色框线和白色内衬线是由两个属性决定的:ItemSelectedBackColor、ItemSelectedForeColor。其中背景色为蓝色,前景色为白色。这就是选中后看到的效果,我试着修改了前景色也为蓝色之后发现项目的文字也变为了蓝色,就是您图片上显示的“第1页”也变为蓝色了,这样会导致看不清。如果您想去掉这个白色线的话,只能将ViewStyle由现在的Explorer改为OwnerDraw,然后在ImageList_DrawItem事件中自行绘制您需要的任何样式。
关于如何自行绘制样式可以参考这个链接:RasterImageListViewStyle
和这个链接:RasterImageList.DrawItem
这两个链接中都有例子,您可以参考。
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部