最近要做車牌識別的,不同地區收費標准不一,所以想做個可以移動控件來給客戶選擇停車場收費條件的。
首先因為要自動排序控件選FlowLayoutPanel做容器,加若干Panel和FlowLayoutPanel。
以下教程需一定 C# 基礎才能理解
引用文章有:
2.C#運行時鼠標移動控件 - 調用Windows API(ReleaseCapture)
3.http://www.it1352.com/19187.html (這個暫未引用)
按照引用1拖動控件時只有鼠標明顯提示,但控件沒有跟着鼠標走。
引用2的話只能拖動控件,不能拖到對應容器里面..
雖然2可以判斷是否在別的容器上面以添加進去,但直接結合1的方法也行。

圖為手稿
由於部分優化代碼涉及商業內容,不予公示。
手稿圖內左邊為 flowLayoutPanel14,用於移動控件如果放進來就添加並自動排列
廢話不多少,看代碼
1 //調用系統Api 2 [DllImport("user32.dll", EntryPoint = "ReleaseCapture")] 3 public static extern void ReleaseCapture(); 4 [DllImport("user32.dll", EntryPoint = "SendMessage")] 5 public static extern void SendMessage(int hwnd, int wMsg, int wParam, int lParam); 6 7 //在程序啟動時將要移動的控件設計時的左上角位置位置保存到 Tag ,這里面的容器都綁定了 8 private void MainForm_Load(object sender, EventArgs e) 9 { 10 panel67.Tag = panel67.Location; 11 flowLayoutPanel19.Tag = flowLayoutPanel19.Location; 12 flowLayoutPanel17.Tag = flowLayoutPanel17.Location; 13 panel68.Tag = panel68.Location; 14 panel53.Tag = panel53.Location; 15 } 16 //移動中的控件(DragDrop事件獲取的控件部分為空) 17 Control contEven; 18 19 /// <summary> 20 /// 頂級容器 21 /// tabPage27 22 /// </summary> 23 private Control TopParent => tabPage27; 24 25 //作為可放置容器必須實現事件,多個綁定項 26 private void flowLayoutPanel14_DragEnter(object sender, DragEventArgs e) => e.Effect = DragDropEffects.Move; 27 28 //作為容器拖放完成時 29 private void FlowLayoutPanel14_DragDrop(object sender, DragEventArgs e) 30 { 31 //以下將需要移動的button控件放到目標位置,不同容器實現方法不同,這里以FlowLayoutPanel容器舉例 32 FlowLayoutPanel flowPanel = sender as FlowLayoutPanel; 33 //移動控件於接收容器相同說明在同一容器內,忽略(因為綁定的相同事件,所以會觸發到不應該獲取的控件) 34 if (flowPanel == contEven) 35 return; 36 37 if (!flowPanel.Controls.Contains(contEven)) 38 { 39 flowPanel.Controls.Add(contEven); 40 flowPanel.Invalidate(); 41 } 42 } 43 44 //按住鼠標事件觸發移動 45 //僅能作為容器移動,label無法調用系統api 46 private void TextBox81_MouseDown(object sender, MouseEventArgs e) 47 { 48 var panel = sender as Control; 49 contEven = panel; 50 51 //如果父容器不為最頂層容器 52 if (panel.Parent != TopParent) 53 { 54 //這里還有從容器里拿出來判斷的代碼未寫,請自己思考 55 } 56 57 //置於頂層方便查看防止被擋 58 panel.BringToFront(); 59 60 #region 調用系統 Api 移動控件 61 ReleaseCapture(); 62 SendMessage((int)panel.Handle, 0xA1, 2, 0); 63 #endregion 64 //必須置於底層,否則無法移動到對應容器 65 panel.SendToBack(); 66 67 #region 松開鼠標時調用 DoDragDrop拖放 用於定位放在哪個容器內 68 panel.DoDragDrop(panel, DragDropEffects.All);//進入移動模式 69 #endregion 70 //拖放完成時,如果父容器是頂層容器則要返回原來的位置 71 if (panel.Parent == TopParent && panel.Tag != null) 72 { 73 panel.Location = (Point)panel.Tag; 74 } 75 }
還有諸多問題,比如容器移動的話必須點容器,點到容器里面的控件就移動不了。
況且這只是代碼的部分,思路寫出來而已。
來上演示

最后,其實由於公司原因,被刷掉了,老板要求安裝別人的軟件完全照抄,他說就不用思考。
看着他拿着別人六十多頁的軟件說明書叫我按着這個來做,我真是
