C# 移動控件


   最近要做車牌識別的,不同地區收費標准不一,所以想做個可以移動控件來給客戶選擇停車場收費條件的。

     首先因為要自動排序控件選FlowLayoutPanel做容器,加若干Panel和FlowLayoutPanel。

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

引用文章有:

1.WinForm實現控件項動態拖動效果

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         }

    還有諸多問題,比如容器移動的話必須點容器,點到容器里面的控件就移動不了。

    況且這只是代碼的部分,思路寫出來而已。

來上演示

 

 

 最后,其實由於公司原因,被刷掉了,老板要求安裝別人的軟件完全照抄,他說就不用思考。

看着他拿着別人六十多頁的軟件說明書叫我按着這個來做,我真是


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM