'윈폼'에 해당되는 글 2건

  1. 2009.12.29 윈폼 파일 드레그하기. (8)
  2. 2009.06.08 트레이 아이콘을 가지는 윈도우 만들기 (17)
안녕하세요? 맨날맑음 입니다.

정말 오랜만에 블로깅이네요. 3개월 정도 지난거 같네요. 바쁘다는 핑계로 블로깅도 미루고, 덕분에 블로깅 할 주제는 많이 생겨서 좋은건가요?

- Fig1. 곰플레이어에서 파일 Drag&Drop을 이용하여 실행시키는 장면 -

 
많은 어플리케이션이 위와같이 파일을 Drag&Drop만으로 열 수 있는 기능을 제공해 주고있습니다. 실제 파일을 다루는 어플리케이션을 개발하다보면 빠지면 서운한 기능일텐데요. .Net WinForm에서는 아주 쉬운방법으로 위와 같은 기능을 구현 할 수 있습니다.

#1. Windows Forms 프로젝트 생성.

- Fig2. Windows Forms 프로젝트 생성 -


#2. ListBox 추가

- Fig3. Form에 ListBox를 추가한 모습 -

여기서 ListBox는 Form위로 드레그 되어 들어온 파일의 정보를 보기위한 간단한 용도입니다.

#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 두개 입니다.

DragEventHandlerDragEventArgs
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);

                }               

            }

        }

    }

}

간단한 소스라 따로 설명은 없어도 될 것 같습니다. 유의 할 점은 e.Data.GetData(DataFormats.FileDrop)에서 반환값이 string 배열이라는 점입니다.

이와같은 방법을 응용하면 ListBox간 아이템 이동이라던지, 대부분의 Drag&Drop 기능은 구현 가능 할 것 같습니다.
Posted by 맨날맑음

댓글을 달아 주세요

  1. Favicon of http://dklee.net BlogIcon DKLEE 2009.12.30 16:29  댓글주소  수정/삭제  댓글쓰기

    이제 달리는군요!!

  2. Favicon of https://gallerymomo.tistory.com BlogIcon ASH84 2010.01.12 14:40 신고  댓글주소  수정/삭제  댓글쓰기

    AllowDrop 속성을 저럴때 쓰는군요^^
    참고하겠습니다^^

  3. Favicon of http://fkfkfk6399.vfm.kr/ BlogIcon 강천구 2010.02.01 09:53  댓글주소  수정/삭제  댓글쓰기

    좋은글 잘보고있습니다^^

  4. Favicon of http://fkfkfk6399.vfm.kr/ BlogIcon 강천구 2010.02.01 09:53  댓글주소  수정/삭제  댓글쓰기

    좋은글 잘보고있습니다^^

  5. 블루아사 2010.05.24 17:48  댓글주소  수정/삭제  댓글쓰기

    좋은정보 감사합니다. :)

  6. Favicon of http://ypc.michaelkorsoute.com BlogIcon Michael Kors purses 2013.04.12 11:11  댓글주소  수정/삭제  댓글쓰기

    지독한 내게 의미를 준 너의 사랑, http://ypc.hairstraightenersel.com ghd straightener


안녕하세요? 맨날맑음 입니다.

네이트을 보면 X(종료) 버튼을 누를시 프로그램이 꺼지지 않고, 트레이로 가게 됩니다.
이번에 알아볼 내용은 .net Windows Forms 프로젝트에서 이런 기능을 구현 하는 것입니다.

우선 준비물이 필요합니다. 트레이에 나타나게 할 아이콘 파일(.ico)입니다.
아이콘 파일은 웹상에서 마음에 드는것을 다운로드 받아도 되고, 포토샵이나 기타 프로그램으로
그림파일을 변환시켜 사용하셔도 됩니다. 물론 솔루션 탐색기 -> 해당 프로젝트(우클릭) -> 추가 -> 새항목 -> 아이콘파일을 선택하셔서 직접 그려서 사용하셔도 됩니다. 각자 취향에 맞는 아이콘을 준비해 주면 됩니다.

우선 Windows Forms 프로젝트를 생성합니다.

도구상자에서 NotifyIcon을 선택하여 Form에 추가 합니다. 추가 후 소성창의 Icon 속성에 준비해준 Ico 파일을 연결해 줍니다. 여기까지만 하고 실행시켜도 트레이에 우리 프로그램의 아이콘이 보이는 걸 볼 수 있습니다.

트레이에서 마우스 오른쪽 버튼을 눌렀을 경우 나올 메뉴를 위해 ContextMenuStrip도 추가해 줍니다.
ContextMenuStrip의 메뉴를 추가 합니다. 간단히 '종료' 메뉴(Name : ExitToolStripMenuItem)만 넣었습니다. 다시 notifyIcon1의 속성창으로 가서 ContextMenuStrip의 값을 contextMenuStrip1로 지정 합니다.
여기까지 하셨으면 프로그램 실행 시 트레이에 아이콘이 나타나게 되고, 오른쪽 버튼으로 아이콘을 클릭하면
종료 메뉴가 나타나게 됩니다.

이제 코드창(cs)으로 가서 몇가지 이벤트핸들러만 구현해 주면 트레이에 아이콘이 나타나는 프로그램을 만들수 있습니다.
using System;
using System.Windows.Forms;
namespace TraySample
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.FormClosing += Form1_FormClosing;
            this.notifyIcon1.DoubleClick += notifyIcon1_DoubleClick;
            this.ExitToolStripMenuItem.Click += ExitToolStripMenuItem_Click;
        }
        // 트레이의 종료 메뉴를 눌렀을때
        void ExitToolStripMenuItem_Click(object sender, EventArgs e)
        {
            //트레이아이콘 없앰
            notifyIcon1.Visible = false;
            //프로세스 종료
            Application.Exit();
        }
        //트레이 아이콘을 더블클릭 했을시 호출
        void notifyIcon1_DoubleClick(object sender, EventArgs e)
        {
            this.Visible = true; // 폼의 표시
            if (this.WindowState == FormWindowState.Minimized)
                this.WindowState = FormWindowState.Normal; // 최소화를 멈춘다 
            this.Activate(); // 폼을 활성화 시킨다
        }
        //폼이 종료 되려 할때 호출
        void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            e.Cancel = true; // 종료 이벤트를 취소 시킨다
            this.Visible = false; // 폼을 표시하지 않는다;
        }
    }
}
주석으로 충분한 설명이 있지만 간단히 소스를 설명하면, 우선 타이틀바의 X 단추를 눌렀을때 프로그램이 종료 되는것을 막기위해 FormClosing 이벤트 핸들러에서 폼이 종료 이벤트를 취소 시켰습니다.
또한 트레이 아이콘을 더블클릭하면 폼이 다시 나와야함으로 notifyIcon1_DoubleClick 이벤트 핸들러에서 는 폼을 다시 표시하고, 활성화 시켰으며, 메뉴에서 종료를 선택했을때는 프로그램을 종료하게 하였습니다.

이렇게 간단하게 네이트온처럼 트레이에 표시되는 응용프로그램을 만들 수 있습니다.
Posted by 맨날맑음

댓글을 달아 주세요

  1. Favicon of http://www.dklee.net BlogIcon DKLEE 2009.06.09 19:16  댓글주소  수정/삭제  댓글쓰기

    좋은 포스트 입니다.^^
    좋은 정보 알아 갑니다.

  2. Favicon of https://redreans.tistory.com BlogIcon 아르다 2009.08.07 15:05 신고  댓글주소  수정/삭제  댓글쓰기

    좋은정보 가져갑니다 ^^
    그리고 코드는 어떻게 저렇게 쓸수 있나요??
    저도 오늘부터 티스토리 하는데요..저렇게 하는 방법 좀 알수 있을까요?ㅎㅎ;

    • Favicon of https://crynut84.tistory.com BlogIcon 맨날맑음 2009.08.07 22:31 신고  댓글주소  수정/삭제

      아르데나스님 댓글 감사합니다.
      도움 드릴려구 블로그에 방문에 보니 벌써 SyntaxHighlighter를 설치하여 쓰고 계시네요.
      http://crynut84.tistory.com/4 이글을 보시면 SyntaxHighlighter의 설치 / 사용 방법을 설명해 놓았습니다.

  3. Favicon of https://maenggeum.tistory.com BlogIcon MaengGeum 2009.08.12 18:10 신고  댓글주소  수정/삭제  댓글쓰기

    Application.Exit();를 사용하면 프로세서는 살아있네요.
    종료시 this.Dispose();를 해주면 제대로 종료가 된네요.

    • Favicon of https://crynut84.tistory.com BlogIcon 맨날맑음 2009.08.12 22:30 신고  댓글주소  수정/삭제

      MSDN을 보니 Application.Exit()메서드는 해당 Windows Form의 모든 Thread를 종료 시킨다고 나와잇습니다. 즉 Message Loop에서 Run이 반환되도록 하는 것이지요. Application.Exit()가 호출되면 FormClosing → FormClosed 이벤트 순서로 응용이 종료하게 됩니다.

      Form의 Dispose() 메소드는 Component에서 사용하는 모든 리소스를 해제합니다.(Component에서 상속됨)라고 하는데, 응용의 종료와는 조금 다른 개념 같네요;
      http://msdn.microsoft.com/ko-kr/library/ms157894(VS.80).aspx
      http://msdn.microsoft.com/ko-kr/library/system.windows.forms.form.dispose.aspx

    • Favicon of https://crynut84.tistory.com BlogIcon 맨날맑음 2009.08.12 22:31 신고  댓글주소  수정/삭제

      MaengGeum님 댓글 감사합니다. Application.Exit()메소드 호출시 저는 정상적으로 프로세스가 종료되는데요; 한번 시간내서 알아봐야 겠습니다.

  4. Favicon of https://maenggeum.tistory.com BlogIcon MaengGeum 2009.08.14 11:44 신고  댓글주소  수정/삭제  댓글쓰기

    저는 Ctrl+Alt+Delete 에서 프로세스 에서 확인해보면
    아직 살아 있네요~~ㅎ

  5. Skynet 2009.11.14 22:18  댓글주소  수정/삭제  댓글쓰기

    이 글을 보고 질문이 있는데 새로 프로젝트는 만드는 것이 아닌
    이미 만들어진 프로그램에
    이 것을 적용할 수는 없을까요?

    • Favicon of http://crynut84.tistory.com BlogIcon 맨날맑음 2009.11.19 21:11  댓글주소  수정/삭제

      Skynet님 안녕하세요?
      물론 미리 만들어진 프로그램에도 가능합니다.
      미리 만들어진 프로젝트를 열어 위의 과정을 똑같이 해주시면 됩니다^^

  6. EOLS 2010.04.12 21:41  댓글주소  수정/삭제  댓글쓰기

    아 정말 필요한 정보였는데 ㅠㅠ 감사합니다^^!

  7. Passowrd 2010.09.15 15:53  댓글주소  수정/삭제  댓글쓰기

    트레이 아이콘 생기고요 거기에서 오른쪽 마우스 버튼 누르면은 종료 나오는데 오른족 마우스 버튼 누르면 Context Menu 나오게 하는 방법 어떻게 하나요 부탁드려요.

  8. 킴언어 2012.11.19 15:29  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 먼저이 프로그램은 정말 감사합니다.
    근데 프로그램 종료시에요 화면만 종료 될뿐 프로세스는 종료되지 않더라구요.,
    ..ㅠㅠ어떻게 해야하나요?

  9. Favicon of https://flowerfour.tistory.com BlogIcon 엡뽀 2015.01.02 14:55 신고  댓글주소  수정/삭제  댓글쓰기

    좋은 정보 감사합니다.

    그런데 윗 분들 말씀대로 프로세스가 종료가 되질않네요.

    this.Close() 호출 후에 Form1_FormClosing 이벤트가 다시 발생하면서
    폼이 정상 종료 되지 않고 프로세스가 남아있는거 같습니다.

    MaengGeum 님 말씀 처럼 저도 Dispose로 해결했습니다.

  10. Favicon of https://flack3r.tistory.com BlogIcon flack3r 2016.02.03 23:02 신고  댓글주소  수정/삭제  댓글쓰기

    좋은 정보 감사합니다 저도 윗분들처럼 프로세스가 완전히 종료되지 않네요. FormClosing할때 종료이벤트를 true로 설정해 두어서 그런거 같습니다. 그래서 이 프로그램을 죽일때 종료이벤트를 다시 false로 설정하고 exit하니까 잘 되네요.