'윈폼'에 해당되는 글 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 맨날맑음

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

네이트을 보면 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 맨날맑음


티스토리 툴바