정말 오랜만에 블로깅이네요. 3개월 정도 지난거 같네요. 바쁘다는 핑계로 블로깅도 미루고, 덕분에 블로깅 할 주제는 많이 생겨서 좋은건가요?
- Fig1. 곰플레이어에서 파일 Drag&Drop을 이용하여 실행시키는 장면 -
#1. Windows Forms 프로젝트 생성.
- Fig2. Windows Forms 프로젝트 생성 -
- Fig3. Form에 ListBox를 추가한 모습 -
#3. 드레그 드롭 관련 지식
public virtual bool AllowDrop { get; set; }
- 사용자가 컨트롤로 끌어 온 데이터가 컨트롤에서 허용되는지 여부를 나타내는 값을 가져오거나 설정.
- 반환 값: 끌어서 놓기 작업을 수행할 수 있으면 true이고, 그렇지 않으면 false, 기본값은 false
Controls의 AllowDrop 프로퍼티를 이용하면 Control에 Drag로 데이터를 끌어올 수 있는지 없는지 설정 할 수 있습니다. 이말은 즉 Controls를 상속받는 많은 WinForm과 Control들이 AllowDrop 프로퍼티를 사용 할 수 있다는 말입니다.
Drag&Drop 관련 이벤트
Controls.DragDrop : 드레그 작업이 완료되면 발생.
Controls.DragOver : 드레그한 개체가 컨트롤 위로 올라오면 발생.
Controls.DragEnter : 드레그한 개체가 컨트롤 범위 안으로 들어오면 발생.
Controls.DragLeave : 드레그한 개체가 컨트롤 범위 밖으로 나가면 발생.
4개의 이벤트가 있는데요. 우리가 사용 할 이벤트는 DragDrop과 DragOver 두개 입니다.
DragEventHandler의 DragEventArgs
X : 화면 좌표로 나타난 마우스 포인터의 x좌표.
Y : 화면 좌표로 나타난 마우스 포인터의 Y좌표.
Data.GetDataPresent : 인스턴스에 저장된 데이터가 지정된 형식과 관련 있는지 확인.
Effect : 드레그한 개체에대한 마우스 커서를 결정.
이벤트관련 클래스의 사용법도 알아보았으니 이제 구현을 해봅니다!
#4. 코드 구현
using System.Windows.Forms;
namespace DragSample
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
//드레그를 허용
this.AllowDrop = true;
//Drag관련이벤트 연결------------------------------------------------
this.DragOver += new DragEventHandler(Form1_DragOver);
this.DragDrop+=new DragEventHandler(Form1_DragDrop);
}
//드레그한 개체가 폼위로 올라올때--------------------------------------
void Form1_DragOver(object sender, DragEventArgs e)
{
//드레그하는 개체가 파일이면
if (e.Data.GetDataPresent(DataFormats.FileDrop))
{
//마우스 커서를 Copy모양으로 바꿔준다.
e.Effect = DragDropEffects.Copy;
}
else
{
//아닐경우 커서의 모양을 θ 요런 모양으로 바꾼다.
e.Effect = DragDropEffects.None;
}
}
//드레그한 개체를 폼위에 올려 놓았을때----------------------------------
void Form1_DragDrop(object sender, DragEventArgs e)
{
//객체들의 이름을 string 배열에 얻어온다.
string[] files = e.Data.GetData(DataFormats.FileDrop) as string[];
if(files!=null)
{
foreach (string file in files)
{
//끌어온 파일명을 리스트박스에 달아준다.
listBox1.Items.Add(file);
}
}
}
}
}
이와같은 방법을 응용하면 ListBox간 아이템 이동이라던지, 대부분의 Drag&Drop 기능은 구현 가능 할 것 같습니다.
'.NET > Visual C#' 카테고리의 다른 글
리플렉션을 이용한 동적 코드 생성 (6) | 2010.11.01 |
---|---|
화살표 그리기(.NET Pen Class) (5) | 2009.10.22 |
주민등록번호 유효성 검사하기! (12) | 2009.08.05 |
윈도우간 도킹 기능(자석 윈도우) (13) | 2009.07.16 |
현재 실행중인 프로그램 목록 얻어오기 (1) | 2009.07.16 |