一個用於繪製視頻佈局的控件,可在背景Panel上生成新的Panel並可以拖動改變位置以及調整大小。
QQ:2382596602(如有疑問可諮詢)
本控件是在https://download.csdn.net/download/a201220121991/9436984的基礎上進行改進而來的,改進點如下:
1.添加功能:
2.限制繪畫區域,只能在區域內拖動
3.添加鼠標框,拉動鼠標框選擇PANEL
4.深藍色爲目標Panel,淺藍色爲待操作Panel
按住鼠標左鍵拖拽Panel改變位置,將鼠標放至深藍色佈局塊右下角按住拉動可改變大小。
按住鼠標左鍵拉動可選擇待執行的Panel
這裏只演示了垂直平分,和水平平分。基本都是以深藍色爲基準,淺藍色做動作
垂直平分
9宮格
分割
用戶控件源碼:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using Newtonsoft.Json;
namespace PRCS_UserControl
{
public partial class ucLayoutDesign : UserControl
{
#region 定義變量
/// <summary>
/// 用於存放選中的panel
/// </summary>
List<PanelRectangle> m_SelectedPanleList = new List<PanelRectangle>();
private const uint WM_SYSCOMMAND = 0x0112;
private const uint SC_MOVE = 0xF010;
private const uint HTCAPTION = 0x0002;
[DllImport("user32.dll", EntryPoint = "SendMessageA")]
private static extern int SendMessage(IntPtr hwnd, uint wMsg, uint wParam, uint lParam);
[DllImport("user32.dll")]
private static extern int ReleaseCapture();
private Point m_currentPoint = new Point(0, 0);//定義一個點
private int m_panelCount = 0;
/// <summary>
/// 用於存放鼠標點擊的PANEL的NAME
/// </summary>
private string m_currentPanelname;
/// <summary>
/// 用於存放PICBOX標誌位
/// </summary>
private bool m_PicBoxMouseDownState = false;
//定義兩個變量
bool MouseIsDown = false;
Rectangle MouseRect = Rectangle.Empty; //矩形(爲鼠標畫出矩形選區)
Rectangle MouseRect_new = Rectangle.Empty; //矩形(爲鼠標畫出矩形選區)
int m_width;
int m_heigh;
Point Point = new Point(0, 0);
#endregion
public ucLayoutDesign()
{
InitializeComponent();
}
public string LayoutPanelRectangleString
{
get
{
List<PanelRectangle> panleMessageList = new List<PanelRectangle>();
int containerWidth = backPanel.Width;
int containerHeight = backPanel.Height;
string panelLocationJson = "";
foreach (Control ctrl in backPanel.Controls)
{
if (ctrl is Panel)
{
PanelRectangle panleMessage = new PanelRectangle();
panleMessage.Name = ctrl.Name;
panleMessage.X = ctrl.Location.X * 100.0 / containerWidth;
panleMessage.Y = ctrl.Location.Y * 100.0 / containerHeight;
panleMessage.Width = ctrl.Size.Width * 100.0 / containerWidth;
panleMessage.Height = ctrl.Size.Height * 100.0 / containerHeight;
panleMessageList.Add(panleMessage);
}
}
panelLocationJson = JsonConvert.SerializeObject(panleMessageList);
return panelLocationJson;
}
set
{
List<PanelRectangle> list = new List<PanelRectangle>();
list = JsonConvert.DeserializeObject<List<PanelRectangle>>(value);
foreach (PanelRectangle message in list)
{
CreateControls.ReBuildCreatePanel(backPanel, message.Name, backPanel_MouseMove, backPanel_MouseDown, backPanel_Paint, message.X, message.Y, message.Width, message.Height);
}
}
}
#region 功能
/// <summary>
/// 功能:創建panel
/// 時間:2020/6/7
/// </summary>
public void CreateLayoutPanel()
{
CreateControls.CreatePanel(backPanel, Guid.NewGuid().ToString(), backPanel_MouseMove, backPanel_MouseDown, backPanel_Paint);
}
/// <summary>
/// 功能:刪除選中的panel
/// 時間:2020/6/7
/// </summary>
public void RemoveLayoutPanel()
{
if (m_currentPanelname == "" && m_currentPanelname == null && m_SelectedPanleList == null)
{
throw new Exception("未選擇Panel");
}
else
{
if (m_SelectedPanleList.Count > 0)
{
foreach (PanelRectangle panelRectangle in m_SelectedPanleList)
{
Panel panel = backPanel.Controls[panelRectangle.Name] as Panel;
backPanel.Controls.Remove(panel);
}
m_SelectedPanleList.Clear();
}
if (m_currentPanelname != "" && m_currentPanelname != null)
{
Panel panel = backPanel.Controls[m_currentPanelname] as Panel;
backPanel.Controls.Remove(panel);
m_currentPanelname = "";
}
}
}
/// <summary>
/// 功能:向左對齊
/// </summary>
/// <param name="panel 目標panel"></param>
/// <param name="rectangles 選中的panel列表"></param>
public void PanelAlignLeft()
{
if (m_currentPanelname != "")
{
double containerWidths = backPanel.Width;
double containerHeights = backPanel.Height;
Panel panels = backPanel.Controls[m_currentPanelname] as Panel;
foreach (PanelRectangle panelRectangle in m_SelectedPanleList)
{//ctrl.Location.X * 100.0 / containerWidth
panelRectangle.X = panels.Location.X * 100.0 / containerWidths;
}
foreach (PanelRectangle panelRectangle in m_SelectedPanleList)
{
foreach (Control ct in backPanel.Controls)
{
if (panelRectangle.Name == ct.Name)
{
//刪除原來佈局塊
Panel panel = backPanel.Controls[ct.Name] as Panel;
backPanel.Controls.Remove(panel);
//重繪更新後的佈局塊.。
CreateControls.ReBuildCreatePanel(backPanel, panelRectangle.Name, backPanel_MouseMove, backPanel_MouseDown, backPanel_Paint, panelRectangle.X, panelRectangle.Y * 100.0 / containerHeights, panelRectangle.Width * 100.0 / containerWidths, panelRectangle.Height * 100.0 / containerHeights);
}
}
}
}
m_SelectedPanleList.Clear();
}
/// <summary>
/// 功能:向右對齊
/// </summary>
/// <param name="panel 目標panel"></param>
/// <param name="rectangles 選中的panel列表"></param>
public void PanelAlignRight()
{
if (m_currentPanelname != "")
{
double containerWidths = backPanel.Width;
double containerHeights = backPanel.Height;
Panel panels = backPanel.Controls[m_currentPanelname] as Panel;
foreach (PanelRectangle panelRectangle in m_SelectedPanleList)
{
panelRectangle.X = panels.Location.X + panels.Size.Width - panelRectangle.Width;
}
foreach (PanelRectangle panelRectangle in m_SelectedPanleList)
{
foreach (Control ct in backPanel.Controls)
{
if (panelRectangle.Name == ct.Name)
{
//刪除原來佈局塊
Panel panel = backPanel.Controls[ct.Name] as Panel;
backPanel.Controls.Remove(panel);
//重繪更新後的佈局塊
CreateControls.ReBuildCreatePanel(backPanel, panelRectangle.Name, backPanel_MouseMove, backPanel_MouseDown, backPanel_Paint, panelRectangle.X * 100.0 / containerWidths, panelRectangle.Y * 100.0 / containerHeights, panelRectangle.Width * 100.0 / containerWidths, panelRectangle.Height * 100.0 / containerHeights);
}
}
}
}
m_SelectedPanleList.Clear();
}
/// <summary>
/// 功能:居中對齊
/// </summary>
/// <param name="panel 目標panel"></param>
/// <param name="rectangles 選中的panel列表"></param>
public void PanelAlignMid()
{
if (m_currentPanelname != "")
{
double containerWidths = backPanel.Width;
double containerHeights = backPanel.Height;
Panel panels = backPanel.Controls[m_currentPanelname] as Panel;
foreach (PanelRectangle panelRectangle in m_SelectedPanleList)
{
double w = panelRectangle.Width / 2;
panelRectangle.X = panels.Location.X + panels.Size.Width / 2 - w;
}
foreach (PanelRectangle panelRectangle in m_SelectedPanleList)
{
foreach (Control ct in backPanel.Controls)
{
if (panelRectangle.Name == ct.Name)
{
//刪除原來佈局塊
Panel panel = backPanel.Controls[ct.Name] as Panel;
backPanel.Controls.Remove(panel);
//重繪更新後的佈局塊
CreateControls.ReBuildCreatePanel(backPanel, panelRectangle.Name, backPanel_MouseMove, backPanel_MouseDown, backPanel_Paint, panelRectangle.X * 100.0 / containerWidths, panelRectangle.Y * 100.0 / containerHeights, panelRectangle.Width * 100.0 / containerWidths, panelRectangle.Height * 100.0 / containerHeights);
}
}
}
}
m_SelectedPanleList.Clear();
}
/// <summary>
/// 功能:頂部對齊
/// </summary>
/// <param name="panel 目標panel"></param>
/// <param name="rectangles 選中的panel列表"></param>
public void PanelAlignTop()
{
if (m_currentPanelname != "")
{
double containerWidths = backPanel.Width;
double containerHeights = backPanel.Height;
Panel panels = backPanel.Controls[m_currentPanelname] as Panel;
foreach (PanelRectangle panelRectangle in m_SelectedPanleList)
{
panelRectangle.Y = panels.Location.Y;
}
foreach (PanelRectangle panelRectangle in m_SelectedPanleList)
{
foreach (Control ct in backPanel.Controls)
{
if (panelRectangle.Name == ct.Name)
{
//刪除原來佈局塊
Panel panel = backPanel.Controls[ct.Name] as Panel;
backPanel.Controls.Remove(panel);
//重繪更新後的佈局塊
CreateControls.ReBuildCreatePanel(backPanel, panelRectangle.Name, backPanel_MouseMove, backPanel_MouseDown, backPanel_Paint, panelRectangle.X * 100.0 / containerWidths, panelRectangle.Y * 100.0 / containerHeights, panelRectangle.Width * 100.0 / containerWidths, panelRectangle.Height * 100.0 / containerHeights);
}
}
}
}
m_SelectedPanleList.Clear();
}
/// <summary>
/// 功能:底部對齊
/// </summary>
/// <param name="panel 目標panel"></param>
/// <param name="rectangles 選中的panel列表"></param>
public void PanelAlignBottom()
{
if (m_currentPanelname != "")
{
double containerWidths = backPanel.Width;
double containerHeights = backPanel.Height;
Panel panels = backPanel.Controls[m_currentPanelname] as Panel;
foreach (PanelRectangle panelRectangle in m_SelectedPanleList)
{
double h = panelRectangle.Height;
panelRectangle.Y = panels.Location.Y + panels.Height - h;
}
foreach (PanelRectangle panelRectangle in m_SelectedPanleList)
{
foreach (Control ct in backPanel.Controls)
{
if (panelRectangle.Name == ct.Name)
{
//刪除原來佈局塊
Panel panel = backPanel.Controls[ct.Name] as Panel;
backPanel.Controls.Remove(panel);
//重繪更新後的佈局塊
CreateControls.ReBuildCreatePanel(backPanel, panelRectangle.Name, backPanel_MouseMove, backPanel_MouseDown, backPanel_Paint, panelRectangle.X * 100.0 / containerWidths, panelRectangle.Y * 100.0 / containerHeights, panelRectangle.Width * 100.0 / containerWidths, panelRectangle.Height * 100.0 / containerHeights);
}
}
}
}
m_SelectedPanleList.Clear();
}
/// <summary>
/// 功能:中間對齊
/// </summary>
/// <param name="panel 目標panel"></param>
/// <param name="rectangles 選中的panel列表"></param>
public void PanelAlignCenter()
{
if (m_currentPanelname != "")
{
double containerWidths = backPanel.Width;
double containerHeights = backPanel.Height;
Panel panels = backPanel.Controls[m_currentPanelname] as Panel;
foreach (PanelRectangle panelRectangle in m_SelectedPanleList)
{
double h = panelRectangle.Height;
panelRectangle.Y = panels.Location.Y + panels.Height / 2 - h / 2;
}
foreach (PanelRectangle panelRectangle in m_SelectedPanleList)
{
foreach (Control ct in backPanel.Controls)
{
if (panelRectangle.Name == ct.Name)
{
//刪除原來佈局塊
Panel panel = backPanel.Controls[ct.Name] as Panel;
backPanel.Controls.Remove(panel);
//重繪更新後的佈局塊
CreateControls.ReBuildCreatePanel(backPanel, panelRectangle.Name, backPanel_MouseMove, backPanel_MouseDown, backPanel_Paint, panelRectangle.X * 100.0 / containerWidths, panelRectangle.Y * 100.0 / containerHeights, panelRectangle.Width * 100.0 / containerWidths, panelRectangle.Height * 100.0 / containerHeights);
}
}
}
}
m_SelectedPanleList.Clear();
}
/// <summary>
/// 功能:寬度一致
/// </summary>
/// <param name="panel 目標panel"></param>
/// <param name="rectangles 選中的panel列表"></param>
public void PanelSameWidth()
{
if (m_currentPanelname != "")
{
double containerWidths = backPanel.Width;
double containerHeights = backPanel.Height;
Panel panels = backPanel.Controls[m_currentPanelname] as Panel;
foreach (PanelRectangle panelRectangle in m_SelectedPanleList)
{
panelRectangle.Width = panels.Width;
}
foreach (PanelRectangle panelRectangle in m_SelectedPanleList)
{
foreach (Control ct in backPanel.Controls)
{
if (panelRectangle.Name == ct.Name)
{
//刪除原來佈局塊
Panel panel = backPanel.Controls[ct.Name] as Panel;
backPanel.Controls.Remove(panel);
//重繪更新後的佈局塊
CreateControls.ReBuildCreatePanel(backPanel, panelRectangle.Name, backPanel_MouseMove, backPanel_MouseDown, backPanel_Paint, panelRectangle.X * 100.0 / containerWidths, panelRectangle.Y * 100.0 / containerHeights, panelRectangle.Width * 100.0 / containerWidths, panelRectangle.Height * 100.0 / containerHeights);
}
}
}
}
m_SelectedPanleList.Clear();
}
/// <summary>
/// 功能:大小一致
/// </summary>
/// <param name="panel 目標panel"></param>
/// <param name="rectangles 選中的panel列表"></param>
public void PanelSameSize()
{
if (m_currentPanelname != "")
{
double containerWidths = backPanel.Width;
double containerHeights = backPanel.Height;
Panel panels = backPanel.Controls[m_currentPanelname] as Panel;
foreach (PanelRectangle panelRectangle in m_SelectedPanleList)
{
panelRectangle.Width = panels.Width;
panelRectangle.Height = panels.Height;
}
foreach (PanelRectangle panelRectangle in m_SelectedPanleList)
{
foreach (Control ct in backPanel.Controls)
{
if (panelRectangle.Name == ct.Name)
{
//刪除原來佈局塊
Panel panel = backPanel.Controls[ct.Name] as Panel;
backPanel.Controls.Remove(panel);
//重繪更新後的佈局塊
CreateControls.ReBuildCreatePanel(backPanel, panelRectangle.Name, backPanel_MouseMove, backPanel_MouseDown, backPanel_Paint, panelRectangle.X * 100.0 / containerWidths, panelRectangle.Y * 100.0 / containerHeights, panelRectangle.Width * 100.0 / containerWidths, panelRectangle.Height * 100.0 / containerHeights);
}
}
}
}
m_SelectedPanleList.Clear();
}
/// <summary>
/// 功能:高度一致
/// </summary>
/// <param name="panel 目標panel"></param>
/// <param name="rectangles 選中的panel列表"></param>
public void PanelSameHight()
{
if (m_currentPanelname != "")
{
double containerWidths = backPanel.Width;
double containerHeights = backPanel.Height;
Panel panels = backPanel.Controls[m_currentPanelname] as Panel;
foreach (PanelRectangle panelRectangle in m_SelectedPanleList)
{
panelRectangle.Height = panels.Height;
}
foreach (PanelRectangle panelRectangle in m_SelectedPanleList)
{
foreach (Control ct in backPanel.Controls)
{
if (panelRectangle.Name == ct.Name)
{
//刪除原來佈局塊
Panel panel = backPanel.Controls[ct.Name] as Panel;
backPanel.Controls.Remove(panel);
//重繪更新後的佈局塊
CreateControls.ReBuildCreatePanel(backPanel, panelRectangle.Name, backPanel_MouseMove, backPanel_MouseDown, backPanel_Paint, panelRectangle.X * 100.0 / containerWidths, panelRectangle.Y * 100.0 / containerHeights, panelRectangle.Width * 100.0 / containerWidths, panelRectangle.Height * 100.0 / containerHeights);
}
}
}
}
m_SelectedPanleList.Clear();
}
/// <summary>
/// 功能:垂直平分
/// </summary>
public void LeftSplit()
{
if (m_SelectedPanleList.Count > 0)
{
m_SelectedPanleList = m_SelectedPanleList.OrderBy(j => j.Y).ToList();
Deduplication();
double containerWidths = backPanel.Width;
double containerHeights = backPanel.Height;
double Y = 634 / m_SelectedPanleList.Count;
double X = 1303 / m_SelectedPanleList.Count;
double locationY = 0;
foreach (PanelRectangle panelRectangle in m_SelectedPanleList)
{
panelRectangle.Height = Y;
panelRectangle.X = panelRectangle.X;
panelRectangle.Y = locationY;
locationY = locationY + Y;
}
foreach (PanelRectangle panelRectangle in m_SelectedPanleList)
{
foreach (Control ct in backPanel.Controls)
{
if (panelRectangle.Name == ct.Name)
{
//刪除原來佈局塊
Panel panel = backPanel.Controls[ct.Name] as Panel;
backPanel.Controls.Remove(panel);
//重繪更新後的佈局塊
CreateControls.ReBuildCreatePanel(backPanel, panelRectangle.Name, backPanel_MouseMove, backPanel_MouseDown, backPanel_Paint, panelRectangle.X * 100.0 / containerWidths, panelRectangle.Y * 100.0 / containerHeights, panelRectangle.Width * 100.0 / containerWidths, panelRectangle.Height * 100.0 / containerHeights);
}
}
}
}
m_SelectedPanleList.Clear();
}
/// <summary>
/// 水平平分
/// </summary>
public void HorizontalSplit()
{
if (m_SelectedPanleList.Count > 0)
{
m_SelectedPanleList = m_SelectedPanleList.OrderBy(j => j.X).ToList();
Deduplication();
double containerWidths = backPanel.Width;
double containerHeights = backPanel.Height;
Deduplication();
// double Y = 634 / m_SelectedPanleList.Count;
double X = 1303 / m_SelectedPanleList.Count;
double locationY = 0;
double locationX = 0;
foreach (PanelRectangle panelRectangle in m_SelectedPanleList)
{
panelRectangle.Width = X;
panelRectangle.X = locationX;
panelRectangle.Y = panelRectangle.Y;
locationX = locationX + X;
}
foreach (PanelRectangle panelRectangle in m_SelectedPanleList)
{
foreach (Control ct in backPanel.Controls)
{
if (panelRectangle.Name == ct.Name)
{
//刪除原來佈局塊
Panel panel = backPanel.Controls[ct.Name] as Panel;
backPanel.Controls.Remove(panel);
//重繪更新後的佈局塊
CreateControls.ReBuildCreatePanel(backPanel, panelRectangle.Name, backPanel_MouseMove, backPanel_MouseDown, backPanel_Paint, panelRectangle.X * 100.0 / containerWidths, panelRectangle.Y * 100.0 / containerHeights, panelRectangle.Width * 100.0 / containerWidths, panelRectangle.Height * 100.0 / containerHeights);
}
}
}
}
m_SelectedPanleList.Clear();
}
/// <summary>
/// 垂直居中
/// </summary>
public void VerticalMidSplit()
{
m_SelectedPanleList = m_SelectedPanleList.OrderBy(j => j.X).ToList();
if (m_currentPanelname != "")
{
Panel panels = backPanel.Controls[m_currentPanelname] as Panel;
PanelRectangle panel = new PanelRectangle();
panel.X = panels.Location.X;
panel.Y = panels.Location.Y;
panel.Name = panels.Name;
panel.Width = panels.Width;
panel.Height = panels.Height;
m_SelectedPanleList.Add(panel);
}
if (m_SelectedPanleList.Count > 0)
{
m_SelectedPanleList = m_SelectedPanleList.OrderBy(j => j.X).ToList();
Deduplication();
double containerWidths = backPanel.Width;
double containerHeights = backPanel.Height;
Deduplication();
double Y = 634 / m_SelectedPanleList.Count;
double X = 1303 / m_SelectedPanleList.Count;
double locationY = 0;
double locationX = 0;
foreach (PanelRectangle panelRectangle in m_SelectedPanleList)
{
panelRectangle.Y = 634 / 2 - panelRectangle.Height / 2;
}
foreach (PanelRectangle panelRectangle in m_SelectedPanleList)
{
foreach (Control ct in backPanel.Controls)
{
if (panelRectangle.Name == ct.Name)
{
//刪除原來佈局塊
Panel panel = backPanel.Controls[ct.Name] as Panel;
backPanel.Controls.Remove(panel);
//重繪更新後的佈局塊
CreateControls.ReBuildCreatePanel(backPanel, panelRectangle.Name, backPanel_MouseMove, backPanel_MouseDown, backPanel_Paint, panelRectangle.X * 100.0 / containerWidths, panelRectangle.Y * 100.0 / containerHeights, panelRectangle.Width * 100.0 / containerWidths, panelRectangle.Height * 100.0 / containerHeights);
}
}
}
}
m_SelectedPanleList.Clear();
}
/// <summary>
/// 功能:水平居中
/// </summary>
public void HorizontalMidSplit()
{
m_SelectedPanleList = m_SelectedPanleList.OrderBy(j => j.Y).ToList();
if (m_currentPanelname != "")
{
Panel panels = backPanel.Controls[m_currentPanelname] as Panel;
PanelRectangle panel = new PanelRectangle();
panel.X = panels.Location.X;
panel.Y = panels.Location.Y;
panel.Name = panels.Name;
panel.Width = panels.Width;
panel.Height = panels.Height;
m_SelectedPanleList.Add(panel);
}
if (m_SelectedPanleList.Count > 0)
{
m_SelectedPanleList = m_SelectedPanleList.OrderBy(j => j.Y).ToList();
Deduplication();
double containerWidths = backPanel.Width;
double containerHeights = backPanel.Height;
Deduplication();
double Y = 634 / m_SelectedPanleList.Count;
double X = 1303 / m_SelectedPanleList.Count;
double locationY = 0;
foreach (PanelRectangle panelRectangle in m_SelectedPanleList)
{
panelRectangle.X = 651 - panelRectangle.Width / 2;
}
foreach (PanelRectangle panelRectangle in m_SelectedPanleList)
{
foreach (Control ct in backPanel.Controls)
{
if (panelRectangle.Name == ct.Name)
{
//刪除原來佈局塊
Panel panel = backPanel.Controls[ct.Name] as Panel;
backPanel.Controls.Remove(panel);
//重繪更新後的佈局塊
CreateControls.ReBuildCreatePanel(backPanel, panelRectangle.Name, backPanel_MouseMove, backPanel_MouseDown, backPanel_Paint, panelRectangle.X * 100.0 / containerWidths, panelRectangle.Y * 100.0 / containerHeights, panelRectangle.Width * 100.0 / containerWidths, panelRectangle.Height * 100.0 / containerHeights);
}
}
}
}
m_SelectedPanleList.Clear();
}
#endregion
#region 鼠標事件
private void backPanel_Paint(object sender, PaintEventArgs e)
{
Panel panel = sender as Panel;
ControlPaint.DrawBorder(e.Graphics,
panel.ClientRectangle,
Color.Red,
1,
ButtonBorderStyle.Solid,
Color.Red,
1,
ButtonBorderStyle.Solid,
Color.Red,
1,
ButtonBorderStyle.Solid,
Color.Red,
1,
ButtonBorderStyle.Solid);
}
private void backPanel_MouseMove(object sender, MouseEventArgs e)
{//實現panel的縮放和拖動
Panel panel = sender as Panel;//取得當前panel
if (e.Button == System.Windows.Forms.MouseButtons.Left)
{//如果點擊的爲鼠標左鍵
//if (ModifierKeys == Keys.Control)
if(m_PicBoxMouseDownState)
{//如果按住ctrl鍵,則爲縮放panel
panel.Width +=e.X - m_currentPoint.X;//取出panel縮放後的實際寬度
panel.Height += e.Y -m_currentPoint.Y;//取出panel縮放後的實際高度
m_currentPoint =e.Location;//給點重新賦值
panel.Refresh();//刷新放置繪製出現延遲
if (panel.Width<100)
{
panel.Width = 100;
}
else if(panel.Height < 100)
{
panel.Height = 100;
}
else if(panel.Width>1303- panel.Location.X)
{
panel.Width = 1303 - panel.Location.X;
}
else if (panel.Height > 634 - panel.Location.Y)
{
panel.Height = 634 - panel.Location.Y;
}
foreach (Panel panels in backPanel.Controls)
{
panel.BackColor = backPanel.BackColor;
foreach (PictureBox pictureBoxs in panel.Controls)
{
panel.Controls.Remove(pictureBoxs);
}
}
panel.BackColor = Color.DarkBlue;
PictureBox pictureBox = new PictureBox();
pictureBox.Image = Image.FromFile("Images\\POINT.png");
pictureBox.Size = new Size(10, 10);
pictureBox.Location = new Point(panel.Width - 10, panel.Height - 10);
pictureBox.Cursor = Cursors.PanSE;
pictureBox.MouseDown += PictureBox_MouseDown;
pictureBox.MouseMove += PictureBox_MouseMove;
pictureBox.MouseUp += PictureBox_MouseUp;
panel.Controls.Add(pictureBox);
}
else
{//否則爲拖動panel
panel.Location = new Point(panel.Left + e.X - m_currentPoint.X, panel.Top + e.Y - m_currentPoint.Y);//拖動panel後重新定位位置
}
}
}
private void backPanel_MouseDown(object sender, MouseEventArgs e)
{
Panel panels = sender as Panel;
if (e.Button == System.Windows.Forms.MouseButtons.Left)
{
foreach (PictureBox pictureBoxs in panels.Controls)
{
panels.Controls.Remove(pictureBoxs);
}
m_currentPanelname = panels.Name;
PictureBox pictureBox = new PictureBox();
pictureBox.Image = Image.FromFile("Images\\POINT.png");
pictureBox.Size = new Size(10, 10);
pictureBox.Location = new Point(panels.Width - 10, panels.Height - 10);
pictureBox.Cursor = Cursors.PanSE;
pictureBox.MouseDown += PictureBox_MouseDown;
pictureBox.MouseMove += PictureBox_MouseMove;
pictureBox.MouseUp += PictureBox_MouseUp;
panels.Controls.Add(pictureBox);
change_Color(panels);
}
if (e.Button == System.Windows.Forms.MouseButtons.Right)
{
PanelRectangle panleMsg = new PanelRectangle();
panleMsg.Name = panels.Name;
panleMsg.X = panels.Location.X;
panleMsg.Y = panels.Location.Y;
panleMsg.Width = panels.Size.Width;
panleMsg.Height = panels.Size.Height;
m_SelectedPanleList.Add(panleMsg);//將選中的panel對象保存
panels.BackColor = Color.RoyalBlue;
foreach (PictureBox picture in panels.Controls)
{
panels.Controls.Remove(picture);
}
}
if (m_PicBoxMouseDownState)
{//如果按住ctrl鍵,則更新p點
Panel panel = sender as Panel;
m_currentPoint = new Point(e.X,e.Y);
}
else
{//否則執行移動,使用api函數
ReleaseCapture();
SendMessage((sender as Control).Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0);
Panel panel = sender as Panel;
if (panel.Location.X >= 1303 - panel.Width)
{
panel.Location = new Point(1303 - panel.Width, panel.Location.Y);
}
if (panel.Location.Y >= 634 - panel.Height)
{
panel.Location = new Point(panel.Location.X, 634 - panel.Height);
}
if (panel.Location.X < 0)
{
panel.Location = new Point(0, panel.Location.Y);
}
if (panel.Location.Y < 0)
{
panel.Location = new Point(panel.Location.X, 0);
}
}
}
private void PictureBox_MouseMove(object sender, MouseEventArgs e)
{
if (m_PicBoxMouseDownState)
{
Point panLocation = (backPanel.Controls[m_currentPanelname] as Panel).PointToClient((sender as PictureBox).PointToScreen(e.Location));
backPanel_MouseMove(backPanel.Controls[m_currentPanelname] as Panel, new MouseEventArgs(e.Button, e.Clicks, panLocation.X, panLocation.Y, e.Delta));
}
}
private void PictureBox_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == System.Windows.Forms.MouseButtons.Left)
{
Point panLocation = (backPanel.Controls[m_currentPanelname] as Panel).PointToClient((sender as PictureBox).PointToScreen(e.Location));
m_PicBoxMouseDownState = true;
backPanel_MouseDown(backPanel.Controls[m_currentPanelname] as Panel, new MouseEventArgs(e.Button, e.Clicks, panLocation.X, panLocation.Y, e.Delta));
}
}
private void PictureBox_MouseUp(object sender, MouseEventArgs e)
{
m_PicBoxMouseDownState = false;
}
#endregion
#region 功能方法(顏色清零,修改顏色,List去重)
/// <summary>
/// 功能:通過點擊鼠標右鍵清除顏色
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void color_Clear(object sender, EventArgs e)
{
MouseEventArgs Mouse_e = (MouseEventArgs)e;//click的事件是繼承了MOUSE事件,可以強制轉換
if (Mouse_e.Button == MouseButtons.Right)
{
foreach (Panel panel in backPanel.Controls)
{
panel.BackColor = backPanel.BackColor;
foreach (PictureBox pictureBox in panel.Controls)
{
panel.Controls.Remove(pictureBox);
}
}
m_SelectedPanleList.Clear();
m_currentPanelname = "";
m_PicBoxMouseDownState = false;
}
}
/// <summary>
/// 功能:list去重
/// </summary>
public void Deduplication()
{
var list = m_SelectedPanleList.GroupBy(c => c.Name).Select(c => c.First()).ToList();
m_SelectedPanleList.Clear();
m_SelectedPanleList = list;
}
/// <summary>
/// 功能:選擇根佈局顏色
/// </summary>
/// <param name="panels"></param>
private void change_Color(Panel panels)
{
foreach (Panel panel in backPanel.Controls)
{
panel.BackColor = backPanel.BackColor;
foreach (PictureBox pictureBoxs in panel.Controls)
{
panel.Controls.Remove(pictureBoxs);
}
}
panels.BackColor = Color.DarkBlue;
PictureBox pictureBox = new PictureBox();
pictureBox.Image = Image.FromFile("Images\\POINT.png");
pictureBox.Size = new Size(10, 10);
pictureBox.Location = new Point(panels.Width - 10, panels.Height - 10);
pictureBox.Cursor = Cursors.PanSE;
pictureBox.MouseDown += PictureBox_MouseDown;
pictureBox.MouseMove += PictureBox_MouseMove;
pictureBox.MouseUp += PictureBox_MouseUp;
panels.Controls.Add(pictureBox);
}
#endregion
#region 畫虛線框
/// <summary>
/// 功能:重畫矩形長寬
/// </summary>
/// <param name="sender"></param>
/// <param name="p"></param>
private void ResizeToRectangle(object sender, Point p)
{
DrawRectangle(sender);
MouseRect.Width = p.X - MouseRect.Left;
m_width = p.X - MouseRect.Left;
MouseRect.Height = p.Y - MouseRect.Top;
m_heigh = p.Y - MouseRect.Top;
DrawRectangle(sender);
if (m_width < 0)
{
string sss = "";
}
}
private void DrawRectangle(object sender)
{
Rectangle rect = ((Panel)sender).RectangleToScreen(MouseRect);
ControlPaint.DrawReversibleFrame(rect, Color.White, FrameStyle.Dashed);
}
private void DrawStart(object sender, Point StartPoint)
{
((Panel)sender).Capture = true;
Cursor.Clip = ((Panel)sender).RectangleToScreen(((Panel)sender).Bounds);
MouseRect = new Rectangle(StartPoint.X, StartPoint.Y, 0, 0);
}
private void backPanel_Mouse_Down(object sender, MouseEventArgs e)
{
MouseIsDown = true;
DrawStart(sender, e.Location);
}
private void backPanel_Mouse_Up(object sender, MouseEventArgs e)
{
this.Capture = false;
Cursor.Clip = Rectangle.Empty;
MouseIsDown = false;
DrawRectangle(sender);
MouseRect = Rectangle.Empty;
//鬆開鼠標時在上面重繪一個透明方塊用於選擇
}
/// <summary>
/// 功能:將鼠標框選中的panel存到list中
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void backPanel_Mouse_Move(object sender, MouseEventArgs e)
{
if (MouseIsDown)
{
ResizeToRectangle(sender, e.Location);
foreach (Control control in ((Panel)sender).Controls)
{
if (m_width > 0 && m_heigh > 0)
{
if (MouseRect.IntersectsWith(control.Bounds)) //相交( MouseRect.Contains 完全包含)
{
PanelRectangle panleMsg = new PanelRectangle();
panleMsg.Name = control.Name;
panleMsg.X = control.Location.X;
panleMsg.Y = control.Location.Y;
panleMsg.Width = control.Size.Width;
panleMsg.Height = control.Size.Height;
m_SelectedPanleList.Add(panleMsg);//將選中的panel對象保存
control.BackColor = Color.RoyalBlue;
}
}
else if (m_width < 0 && m_heigh < 0)
{
Rectangle rectangle = new Rectangle(e.Location.X, e.Location.Y, Math.Abs(m_width), Math.Abs(m_heigh));
if (rectangle.IntersectsWith(control.Bounds)) //相交( MouseRect.Contains 完全包含)
{
PanelRectangle panleMsg = new PanelRectangle();
panleMsg.Name = control.Name;
panleMsg.X = control.Location.X;
panleMsg.Y = control.Location.Y;
panleMsg.Width = control.Size.Width;
panleMsg.Height = control.Size.Height;
m_SelectedPanleList.Add(panleMsg);//將選中的panel對象保存
control.BackColor = Color.RoyalBlue;
}
}
else if (m_width < 0 && m_heigh > 0)
{
Rectangle rectangle = new Rectangle(e.Location.X, e.Location.Y - Math.Abs(m_heigh), Math.Abs(m_width), Math.Abs(m_heigh));
if (rectangle.IntersectsWith(control.Bounds)) //相交( MouseRect.Contains 完全包含)
{
PanelRectangle panleMsg = new PanelRectangle();
panleMsg.Name = control.Name;
panleMsg.X = control.Location.X;
panleMsg.Y = control.Location.Y;
panleMsg.Width = control.Size.Width;
panleMsg.Height = control.Size.Height;
m_SelectedPanleList.Add(panleMsg);//將選中的panel對象保存
control.BackColor = Color.RoyalBlue;
}
}
else if (m_width > 0 && m_heigh < 0)
{
Rectangle rectangle = new Rectangle(e.Location.X - Math.Abs(m_width), e.Location.Y, Math.Abs(m_width), Math.Abs(m_heigh));
if (rectangle.IntersectsWith(control.Bounds)) //相交( MouseRect.Contains 完全包含)
{
PanelRectangle panleMsg = new PanelRectangle();
panleMsg.Name = control.Name;
panleMsg.X = control.Location.X;
panleMsg.Y = control.Location.Y;
panleMsg.Width = control.Size.Width;
panleMsg.Height = control.Size.Height;
m_SelectedPanleList.Add(panleMsg);//將選中的panel對象保存
control.BackColor = Color.RoyalBlue;
}
}
Deduplication();
}
}
}
#endregion
}
public class CreateControls
{
/// <summary>
/// 功能:重建panel
/// 日期:2020/6/17
/// </summary>
/// <param name="ctl"></param>
/// <param name="name"></param>
/// <param name="panel_MouseMove"></param>
/// <param name="panel_MouseDown"></param>
/// <param name="panel_Paint"></param>
public static void CreatePanel(Control ctl, string name, MouseEventHandler panel_MouseMove, MouseEventHandler panel_MouseDown, PaintEventHandler panel_Paint)
{
Panel panel = new Panel()
{
Name = name,
BackColor = Color.FromArgb(10 * 5, 255, 255, 255),
BorderStyle = BorderStyle.FixedSingle,
Size = new Size(100, 100)
};
panel.MouseMove += new MouseEventHandler(panel_MouseMove);
panel.MouseDown += new MouseEventHandler(panel_MouseDown);
panel.Paint += new PaintEventHandler(panel_Paint);
panel.GetType().GetProperty("DoubleBuffered", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).SetValue(panel, true, null);//設定讓panel不閃爍
ctl.Controls.Add(panel);
panel.BringToFront();
}
/// <summary>
/// 功能:重建panel
/// 日期:2020/6/17
/// </summary>
/// <param name="ctl"></param panel >
/// <param name="name"></param panel name>
/// <param name="panel_MouseMove"></param>
/// <param name="panel_MouseDown"></param>
/// <param name="panel_Paint"></param>
/// <param name="x"></param >
/// <param name="y"></param>
/// <param name="width"></param>
/// <param name="height"></param>
public static void ReBuildCreatePanel(Control ctl, string name, MouseEventHandler panel_MouseMove, MouseEventHandler panel_MouseDown, PaintEventHandler panel_Paint, double x, double y, double width, double height)
{
Panel panel = new Panel()
{
Name = name,
BackColor = Color.FromArgb(10 * 5, 255, 255, 255),
BorderStyle = BorderStyle.FixedSingle,
Size = new Size((int)(width * 0.01 * ctl.Width), (int)(height * 0.01 * ctl.Height)),
Location = new System.Drawing.Point((int)(x * 0.01 * ctl.Width), (int)(y * 0.01 * ctl.Height))
};
panel.MouseMove += new MouseEventHandler(panel_MouseMove);
panel.MouseDown += new MouseEventHandler(panel_MouseDown);
panel.Paint += new PaintEventHandler(panel_Paint);
panel.GetType().GetProperty("DoubleBuffered", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).SetValue(panel, true, null);//設定讓panel不閃爍
ctl.Controls.Add(panel);
panel.BringToFront();
}
}
/// <summary>
/// 功能:panel屬性
/// </summary>
public class PanelRectangle
{
private string name;
private double x;
private double y;
private double width;
private double height;
public string Name { get => name; set => name = value; } public double X { get => x; set => x = value; } public double Y { get => y; set => y = value; } public double Width { get => width; set => width = value; } public double Height { get => height; set => height = value; } } }