[C#] - 마우스 이벤트를 사용한 Drag a Panel 처리방법
C# 2008. 3. 3. 00:06 |Drag a Panel
하나의 패널 속에 여러개의 패널을 삽입이 가능하다.
이걸 가지고 패널 속에 Visio 와 같은 에디팅 화면을 구현할 수 있을거 같다.
물론 Panel이 아닌 ScrollView 등 다양한 뷰에도 구현이 가능해 진다.
특정 이벤트에 따라서 Panel에 여러개의 Panel 자식 컨트롤을 추가 한 후에
자식 Panel의 이벤트를 사용해서 각각의 패널을 동작시킬 수 있다.
우선 이벤트에 따른 자식 Panel로 등록하는 코드 이다.
{
Panel childPanel = new Panel();
childPanel.BackColor = System.Drawing.Color.Gainsboro;
childPanel.Location = new System.Drawing.Point(67, 44);
childPanel.Name = "panel4";
childPanel.Size = new System.Drawing.Size(71, 78);
childPanel.MouseDown += new MouseEventHandler(childPanel_MouseDown);
childPanel.MouseMove += new MouseEventHandler(childPanel_MouseMove);
childPanel.MouseUp += new MouseEventHandler(childPanel_MouseUp);
panel2.Controls.Add(childPanel);
}
- 여러개의 패널이 등록 되지만 이벤트를 처리 하는 함수는 동일하게 가져 가게 되면
공통적으로 Panel을 처리할 수 있다. (childPanel_MouseDown, Move, Up)
이제 Drag a Panel을 구현하기 위한 코드이다.
private bool dragging = false;
private Point offset;
void childPanel_MouseDown(object sender, MouseEventArgs e)
{
dragging = true;
offset = new Point(e.X, e.Y);
}
void childPanel_MouseMove(object sender, MouseEventArgs e)
{
if (dragging)
{
Panel selPanel = (Panel)sender;
selPanel.Left = e.X + selPanel.Left - offset.X;
selPanel.Top = e.Y + selPanel.Top - offset.Y;
}
}
void childPanel_MouseUp(object sender, MouseEventArgs e)
{
dragging = false;
}
- Down 일때 드래그가 시작되었다고 알리고, 현재 위치를 저장한다.
- Move 일때 드래그라면 현재 선택된 패널 정보를 가져와서 Left, Top를 설정한다.
- Up 일때 드래그가 끝났다고 알린다.
드래그 이벤트는 다양한 컨트롤에서 사용되어 지며, 사용자의 입력을 받아서
처리 되는 다양한 효과를 구현할 수 있다.
관련 MSDN 주소 : http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=689097&SiteID=1