最近要做车牌识别的,不同地区收费标准不一,所以想做个可以移动控件来给客户选择停车场收费条件的。

    首先因为要自动排序控件选FlowLayoutPanel做容器,加若干Panel和FlowLayoutPanel。

   以下教程需一定 C# 基础才能理解

引用文章有:

1.WinForm实现控件项动态拖动效果

2.C#运行时鼠标移动控件 - 调用Windows API(ReleaseCapture)

3.http://www.it1352.com/19187.html  (这个暂未引用)

按照引用1拖动控件时只有鼠标明显提示,但控件没有跟着鼠标走。

引用2的话只能拖动控件,不能拖到对应容器里面..

虽然2可以判断是否在别的容器上面以添加进去,但直接结合1的方法也行。

图为手稿

由于部分优化代码涉及商业内容,不予公示。

手稿图内左边为 flowLayoutPanel14,用于移动控件如果放进来就添加并自动排列

废话不多少,看代码

         //调用系统Api
[DllImport("user32.dll", EntryPoint = "ReleaseCapture")]
public static extern void ReleaseCapture();
[DllImport("user32.dll", EntryPoint = "SendMessage")]
public static extern void SendMessage(int hwnd, int wMsg, int wParam, int lParam); //在程序启动时将要移动的控件设计时的左上角位置位置保存到 Tag ,这里面的容器都绑定了
private void MainForm_Load(object sender, EventArgs e)
{
panel67.Tag = panel67.Location;
flowLayoutPanel19.Tag = flowLayoutPanel19.Location;
flowLayoutPanel17.Tag = flowLayoutPanel17.Location;
panel68.Tag = panel68.Location;
panel53.Tag = panel53.Location;
}
//移动中的控件(DragDrop事件获取的控件部分为空)
Control contEven; /// <summary>
/// 顶级容器
/// tabPage27
/// </summary>
private Control TopParent => tabPage27; //作为可放置容器必须实现事件,多个绑定项
private void flowLayoutPanel14_DragEnter(object sender, DragEventArgs e) => e.Effect = DragDropEffects.Move; //作为容器拖放完成时
private void FlowLayoutPanel14_DragDrop(object sender, DragEventArgs e)
{
//以下将需要移动的button控件放到目标位置,不同容器实现方法不同,这里以FlowLayoutPanel容器举例
FlowLayoutPanel flowPanel = sender as FlowLayoutPanel;
//移动控件于接收容器相同说明在同一容器内,忽略(因为绑定的相同事件,所以会触发到不应该获取的控件)
if (flowPanel == contEven)
return; if (!flowPanel.Controls.Contains(contEven))
{
flowPanel.Controls.Add(contEven);
flowPanel.Invalidate();
}
} //按住鼠标事件触发移动
//仅能作为容器移动,label无法调用系统api
private void TextBox81_MouseDown(object sender, MouseEventArgs e)
{
var panel = sender as Control;
contEven = panel; //如果父容器不为最顶层容器
if (panel.Parent != TopParent)
{
//这里还有从容器里拿出来判断的代码未写,请自己思考
} //置于顶层方便查看防止被挡
panel.BringToFront(); #region 调用系统 Api 移动控件
ReleaseCapture();
SendMessage((int)panel.Handle, 0xA1, , );
#endregion
//必须置于底层,否则无法移动到对应容器
panel.SendToBack(); #region 松开鼠标时调用 DoDragDrop拖放 用于定位放在哪个容器内
panel.DoDragDrop(panel, DragDropEffects.All);//进入移动模式
#endregion
//拖放完成时,如果父容器是顶层容器则要返回原来的位置
if (panel.Parent == TopParent && panel.Tag != null)
{
panel.Location = (Point)panel.Tag;
}
}

    还有诸多问题,比如容器移动的话必须点容器,点到容器里面的控件就移动不了。

    况且这只是代码的部分,思路写出来而已。

来上演示

最后,其实由于公司原因,被刷掉了,老板要求安装别人的软件完全照抄,他说就不用思考。

看着他拿着别人六十多页的软件说明书叫我按着这个来做,我真是

C# 移动控件的更多相关文章

  1. mobileControls与移动控件适配

    此配置节的作用在于指定各种控件在不同类型的移动设备显示的适配器,以达到适应各种设备不同的展示形式.例子如下, <mobileControls sessionStateHistorySize=&q ...

  2. Android可移动控件

    可移动控件: 效果图: 获取屏幕的宽高: DisplayMetrics dm = getResources().getDisplayMetrics(); screenWidth = dm.widthP ...

  3. WPF拖到、移动控件

    只需2个事件和一个point变量即可: Point mouse_offset = , ); void TC_MouseLeftButtonDown(object sender, MouseButton ...

  4. C#运行时鼠标移动控件 - 调用Windows API(ReleaseCapture)

    [System.Runtime.InteropServices.DllImport("user32.dll")] public static extern bool SendMes ...

  5. mfc基于对话框的应用程序,如何设置初始对话框大小,移动控件位置

    void MmPLEntPropertyDlg::SetInitDialogSize() { CRect rectDlg; GetWindowRect(rectDlg);//x,y为对话框左上角的坐标 ...

  6. Qt坐标系以及自定义可移动控件

    1.效果 黑色这个控件是自定义的,可以在界面拖动 2.新建控件的Qt类,父类是QWidget,带ui的,Control.h #ifndef CONTROL_H #define CONTROL_H #i ...

  7. 解决ASP.NET上传文件大小限制

    第一种方法,主要适用于IIS6.0版本 一.修改配置Web.Config文件中的httpRuntime节点对于asp.net,默认只允许上传4M文件,增加如下配置,一般可以自定义最大文件大小.一.修改 ...

  8. .net项目中上传的图片或者文件太大 无法上传

    最近做项目的时候  用户提出要上传大图片  一张图片有可能十几兆  本来用的第三方的上传控件  有限制图片上传大小的设置 以前设置的是2M  按照用户的要求  以为直接将限制图片上传大小的设置改下就可 ...

  9. deviceFilters与设备过滤

    本主题是ASP.NET在移动设备上展示的方面的内容 起初看起来deviceFilters与前面的browserCaps类似.同样也会关联到HttpBrowserCapabilities,而在这里用到的 ...

随机推荐

  1. .NET 4.0 System.Threading.Tasks学习笔记

    由于工作上的需要,学习使用了System.Threading.Tasks的使用,特此笔记下来. System.Threading.Tasks的作用: Tasks命名空间下的类试图使用任务的概念来解决线 ...

  2. ASP.NET WebServce项目下添加Http服务,支持Get,Post请求方式;传输格式json/xml

    由于WEBServce老项目中需要增添新的接口,而且添加的接口不希望被其它项目以引用Servces方式使用. 那么得在现有Service项目中添加Http请求方式来实现系统间数据交互.只需要告知请求地 ...

  3. 2018.8.10Yukimai模拟Day1

    这的确是最惨的一次模拟了……不会再惨了(10pts除非爆零orz) 总结一下吧…… T1 .章鱼 众所周知,雪舞喵有许多猫.由于最近的天气十分炎热,雪舞城的大魔法师雪月月根本不想出门,只想宅在家里打隔 ...

  4. nodejs开发游戏服务器遇到的性能问题

    问题描述: 使用nodejs开发了一个游戏服务器,为了尽可能提高服务器的性能,服务器采用多进程的架构,前面处理玩家socket连接的是多个nodejs进程,使用 child_process 模块,服务 ...

  5. margin-负值

    总结:margin负值的影响: 当元素(块级元素)没有设置宽度时:margin负值会增加元素的宽度,当设置宽度时,margin负值只会影响元素的位置. 就是负的边距好像能减小元素在文档流中的尺寸一样, ...

  6. javascript ==等于与===恒等于

    ==判断是否等于,只判断数值 ===代表恒等于,不仅判断数值,而且判断类型 var a=5; var b="5"; (a b 只是数值上相等,但是类型并不相等) a==b //tr ...

  7. 转载:SharePoint:扩展DVWP - 第1部分:布局增强 – 在默认值模板和编辑模板中重新排列栏

    SharePoint:扩展DVWP - 第1部分:布局增强 – 在默认值模板和编辑模板中重新排列栏 当我们在数据视图中启用编辑,删除模式的链接时,SPD总是将链接添加到左边. 而我本来希望添加到右侧. ...

  8. Android App组件之ListFragment -- 说明和示例(转载)

    转自:http://www.cnblogs.com/skywang12345/p/3160260.html 1 ListFragement介绍 ListFragment继承于Fragment.因此它具 ...

  9. 洛谷 - P2657 - windy数 - 数位dp

    https://www.luogu.org/problemnew/show/P2657 不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. 这道题是个显然到不能再显然的数位dp了. 来个 ...

  10. 介绍一下Extern “C”,它的作用是什么?

    Extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数.这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren “ ...