GSI

Drag a Panel

하나의 패널 속에 여러개의 패널을 삽입이 가능하다.
이걸 가지고 패널 속에 Visio 와 같은 에디팅 화면을 구현할 수 있을거 같다.
물론 Panel이 아닌 ScrollView 등 다양한 뷰에도 구현이 가능해 진다.

특정 이벤트에 따라서 Panel에 여러개의 Panel 자식 컨트롤을 추가 한 후에
자식 Panel의 이벤트를 사용해서 각각의 패널을 동작시킬 수 있다.

우선 이벤트에 따른 자식 Panel로 등록하는 코드 이다.

private void button2_Click(object sender, EventArgs e)
{
    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;
}

- 전역 변수로 dragging, offset를 선언해 놓는다.
- Down 일때 드래그가 시작되었다고 알리고, 현재 위치를 저장한다.
- Move 일때 드래그라면 현재 선택된 패널 정보를 가져와서 Left, Top를 설정한다.
- Up 일때 드래그가 끝났다고 알린다.

드래그 이벤트는 다양한 컨트롤에서 사용되어 지며, 사용자의 입력을 받아서
처리 되는 다양한 효과를 구현할 수 있다.

관련 MSDN 주소 : http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=689097&SiteID=1

Posted by gsi
: