NGMsoftware

NGMsoftware
로그인 회원가입
  • 매뉴얼
  • NGM 5
  • 매뉴얼

    NGM 5의 매뉴얼입니다.

    NGM 5

    NGM 5의 매뉴얼입니다.

    본 사이트의 컨텐츠는 저작권법의 보호를 받으므로 무단 복사, 게재, 배포 등을 금합니다.

    디자이너 디자이너를 최소화하면 트레이 아이콘으로 이동하기

    페이지 정보

    본문

    안녕하세요. 소심비형입니다. 실제 디자이너를 예제로 만든건 아니지만, 코딩은 동일하기 때문에 참고하셔서 기능을 추가하는데 크게 어려움은 없을겁니다. 일반적으로 Tray Icon은 윈도우의 우측 하단에 위치하고 있습니다. 응용 프로그램이 비하인드에서 실행될 때 사용되곤 하는데요. 그렇다고 해서 꼭 백그라운드 프로그램일 필요는 없습니다.

    img.png

     

     

    조금만 검색 해보면 NotifyIcon관련 무료 라이브러리들이 많이 있습니다. 다운로드해서 사용해도 되고, Win32 API를 이용할수도 있습니다. 여하튼, 다양한 방법으로 비슷한 기능을 구현할 수 있으며, 기능을 확장할수도 있죠^^

     

    아래와 같이 폼을 구성하세요. 사실 단순히 NotifyIcon만 구성한다면, 아래처럼 복잡한 폼은 필요 없습니다. 폼만 있으면 됩니다.

    img.png

     

     

    이제 필요한 NotifyIcon과 약간의 기능을 확장하기 위한 ContextMenuStrip을 추가하세요.

    추가한 컨트롤들은 UI를 가지지 않는 컴포넌트들입니다. 따라서, 하단에 추가가 됩니다.

    img.png

     

     

    NotifyIcon의 속성입니다. 아래 그림처럼 설정하세요.

    img.png

     

     

    이벤트도 설정합니다.

    img.png

     

     

    ContextMenuStrip은 속성에서 Items를 클릭하여 컬렉션을 수정하세요.

    img.png

     

     

    ContextMenuStrip의 MenuItem은 아래 그림처럼 구성하면 됩니다. 이 예제에서 사용된 응용 프로그램이 Start, Stop 버튼을 가지고 있기 때문에 아래처럼 되어 있습니다. 하지만, 이 학습을 위해서는 ctxExitMenu만 추가하면 됩니다.

    img.png

     

     

    UI 구성이 완료되었으니 이제 내부 코딩을 해야겠죠? F7을 눌러서 코드 보기로 이동합니다.

    Main.cs

    using System;
    using System.Diagnostics;
    using System.Windows.Forms;
     
    namespace PreventScreensaverAndSleep
    {
        public partial class Main : Form
        {
            private bool isBalloonOpen = false; private Timer balloonTimer = null;

     

     

    9~10라인은 응용 프로그램이 Tray 영역에 있을 때 마우스가 오버되면 보여질 정보입니다. 이 코드가 필요한 이유는 NotifyIcon 컨트롤의 경우 OnMouseOver와 같은 이벤트가 없기 때문입니다. 그렇다고해서 좌표값을 계산하기에는 코드가 길어지므로 최대한 단순한 방법으로 처리하려고 합니다.

    Main.cs

    public Main()
    {
        InitializeComponent();
     
        balloonTimer = new Timer();
        balloonTimer.Interval = 1000;
        balloonTimer.Tick += BalloonTimer_Tick;

     

     

    Balloon tool tip을 보여주는 시간을 설정합니다. 기본값을 1초로 설정한 후 타이머가 상태 값을 업데이트하는 방식입니다. 이렇게 복잡하게 처리하는 이유는 단순히 MouseOver에 대해 체크할 수 있는 이벤트가 없기 때문입니다-_-; MouseMove 이벤트만 제공되는데 이 이벤트만으로는 자연스럽게 처리할 수 없습니다.

     

    위에서 설정한 타이머의 이벤트를 처리하세요.

    Main.cs

    private void BalloonTimer_Tick(object sender, EventArgs e)
    {
        isBalloonOpen = false;
        balloonTimer.Stop();
    }
    

     

     

    NotifyIcon의 이벤트를 처리합니다. 우선, Main폼에 Resize 이벤트를 추가합니다. 폼의 최소화 버튼 클릭시 응용 프로그램을 Tray 영역에 등록하기위한 처리기입니다.

    Main.cs

    private void Main_Resize(object sender, EventArgs e)
    {
        if (this.WindowState == FormWindowState.Minimized)
        {
            this.notifyIcon.Visible = true;
            this.Hide();
        }
    }
     
    private void notifyIcon_MouseClick(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            if (this.WindowState == FormWindowState.Minimized)
            {
                this.notifyIcon.Visible = false;
                this.Show();
                this.WindowState = FormWindowState.Normal;
                this.Activate();
            }
        }
    }
     
    private void notifyIcon_MouseMove(object sender, MouseEventArgs e)
    {
        if (!isBalloonOpen)
        {
            this.notifyIcon.ShowBalloonTip(1000, this.notifyIcon.BalloonTipTitle, this.lblStatus.Text, this.notifyIcon.BalloonTipIcon);
            balloonTimer.Start();
        }
    }
     
    private void notifyIcon_BalloonTipClosed(object sender, EventArgs e)
    {
        isBalloonOpen = false;
    }
     
    private void notifyIcon_BalloonTipShown(object sender, EventArgs e)
    {
        isBalloonOpen = true;
    }
     
    private void notifyIcon_BalloonTipClicked(object sender, EventArgs e)
    {
        notifyIcon_MouseClick(null, new MouseEventArgs(MouseButtons.Left, 1, 0, 0, 0));
    }
    

     

     

    소스만 보면 크게 어려운 내용은 없을겁니다. 위 내용을 잘 Wrapping한다면, 괜찮은 컨트롤이 될거 같기도 하네요^^; 이 프로그램을 테스트하려면, 폼의 최소화 버튼을 클릭할 때 폼이 사라지고 트레이 아이콘 영역에 정상 등록되는지 확인하면 됩니다. 그리고, Balloon tool tip을 클릭할 때 원래 상태로 복구가 되어야 합니다. 이외에도 우클릭 시 Context menu strip이 표시되고, Exit 버튼을 클릭하면 응용 프로그램이 종료됩니다.

    간단하죠ㅎㅎ?

    • 네이버 공유하기
    • 페이스북 공유하기
    • 트위터 공유하기
    • 카카오스토리 공유하기
    추천1 비추천0

    댓글목록

    profile_image

    멘트님의 댓글

    no_profile 멘트 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 작성일 Date

    유용한 기능이네요 ㅎㅎ 감사합니다.