소년포비의 세계정복!!

C# 미니팝업창 애니메이션 효과 본문

프로그램 세상/C#

C# 미니팝업창 애니메이션 효과

소년포비 2009. 10. 7. 06:27

 

 

사용자 삽입 이미지


using System.IO;
using System.Runtime.InteropServices;  // Win32 함수 사용
namespace AnimationTest
{
    public partial class Form1 : Form
    {
       //Animation Type
        public enum NotifyState
        {
            Hidden = 0,
            Visible = 1,
            Appear = 2,
            DisAppear = 3
        }

       //팝업창을 띄울때는 delegate로 Show를 해준다.
       //여기서는 상관 없지만 다른 폼에서 생성하여
         쇼우를 하면 크로스 스레드 문제가 발생한다.
     
 delegate void notify_popup(); // 공지창 출력


        private NotifyState notifyState = NotifyState.Hidden;
        private Bitmap backgroundImage = null;   // 배경화면
        private Rectangle screenRect;             // 공지창 출력 영역
        private Timer timer = null;               // 타이머

        private int nShowCount = 0;                    // 화면 출력될때 애니메이션 시간 간격
        private int nShowIncrement = 0;                // 화면이 출력될때 애니메이션당 증가치
        private int nVisibleCount = 0;                 // 화면에 공지창 출력 시간 간격
        private int nHideCount = 0;                    // 화면 사라질때 애니메이션 시간 간격
        private int nHideDecrement = 0;                // 화면 사라질때 애니메이션 횟수

        public Form1()
        {
            InitializeComponent();
            // 윈도우 초기화
            FormBorderStyle = FormBorderStyle.None;
            WindowState = FormWindowState.Minimized;
            base.Show();
            base.Hide();
            WindowState = FormWindowState.Normal;
            TopMost = true;
            MaximizeBox = false;
            MinimizeBox = false;
            ControlBox = false;
             // 타이머 설정
            timer = new Timer();
            timer.Enabled = true;
            timer.Tick += new EventHandler(OnTimer);

            // 출력될 배경 이미지 설정
            string Path1 = Directory.GetCurrentDirectory() + @"\Notify.bmp";
          
//@"\Notify.bmp"는 원하는 이미지를 넣습니다.
            this.backgroundImage = new Bitmap(Path1);   // 배경 이미지 설정
            this.Width = backgroundImage.Width;       // 출력 창의 폭 설정
            this.Height = backgroundImage.Height;     // 출력 창의 높이 설정

            //팝업창 띄우기
            NotifyPopup();

        }
        /// <summary>
        /// 타이머 이벤트 메소드
        /// </summary>
        /// <param name="obj"></param>
        /// <param name="ea"></param>
        protected void onTimer(Object obj, EventArgs ea)
        {
            switch (this.notifyState)
            {
                case NotifyState.Appear:
                    if (this.Height < this.backgroundImage.Height)
                    {
                        this.SetBounds(this.Left, this.Top - this.nShowIncrement,
                                              this.Width, this.Height + this.nShowIncrement);
                    }
                    else
                    {
                        timer.Stop();
                        this.Height = this.backgroundImage.Height;
                        timer.Interval = this.nVisibleCount;
                        this.notifyState = NotifyState.Visible;
                        timer.Start();
                    }
                    break;

                case NotifyState.Visible:
                    timer.Stop();
                    timer.Interval = this.nHideCount;

                    this.notifyState = NotifyState.DisAppear;

                    timer.Start();
                    break;

                case NotifyState.DisAppear:
                    Refresh();
                    break;
                case NotifyState.Appear:
                    if (this.Height < this.backgroundImage.Height)
                    {
                        this.SetBounds(this.Left, this.Top - this.nShowIncrement,
                                       this.Width, this.Height + this.nShowIncrement);
                    }
                    else
                    {
                        timer.Stop();
                        this.Height = this.backgroundImage.Height;
                        timer.Interval = this.nVisibleCount;
                        this.notifyState = NotifyState.Visible;
                        timer.Start();
                    }
                    break;
            }

        }

         protected override void onPaintBackground(PaintEventArgs pea)
        {
            Graphics grathic = pea.Graphics;
            grathic.PageUnit = GraphicsUnit.Pixel;

            Graphics offscreen;
            Bitmap bmp;

            bmp = new Bitmap(this.backgroundImage.Width, this.backgroundImage.Height);
            offscreen = Graphics.FromImage(bmp);

            // 바탕화면 그리기
            offscreen.DrawImage(this.backgroundImage, 0, 0, this.backgroundImage.Width,
                                           this.backgroundImage.Height);

            grathic.DrawImage(bmp, 0, 0);
        }
        /// <summary>
        /// 창 숨기기
        /// </summary>
        public new void Hide()
        {
            if (this.notifyState != NotifyState.Hidden)
            {
                timer.Stop();
                this.notifyState = NotifyState.Hidden;
                base.Hide();
            }
        }
        /// <summary>
        /// 화면에 Notify 창을 호출하기위해 Win32 API 사용
        /// </summary>
        /// <param name="hWnd"></param>
        /// <param name="nCmdShow"></param>
        /// <returns></returns>
        [DllImport("user32.dll")]
        private static extern Boolean ShowWindow(IntPtr hWnd, Int32 nCmdShow);


        #region 팝업창 Invoke 띄우기
        public void NotifyPopup()
        {
            notify_popup notify = new notify_popup(NotifyShow);
            this.Invoke(notify);
        }
        #endregion
        #region 팝업창 띄우기
        public void NotifyShow()
        {
            /// <summary>
            ///show = 500;  보여주는데 걸리는 시간
            ///stay = 3000; 보여주고 있는 시간
            ///hide = 500;  없어지는데 걸리는 시간
            /// </summary>
            /// <param name="showTime"></param>
            /// <param name="stayTime"></param>
            /// <param name="closeTime"></param>
            /// <returns></returns>
            this.Show(500, 4000, 500);
        }
        #endregion
        /// <summary>
        /// 공지창 출력
        /// </summary>
        /// <param name="strTitle">제목</param>
        /// <param name="strContent">내용</param>
        /// <param name="nShowTime">출력 시간</param>
        /// <param name="nStayTime">지속 시간</param>
        /// <param name="nHideTime">닫히는 시간</param>
        public void Show(int nShowTime, int nStayTime, int nHideTime)
        {
            this.screenRect = Screen.GetWorkingArea(this.screenRect);

            this.nVisibleCount = nStayTime;

            // 화면에 창이 출력될때 애니메이션 설정
            int nCount = 0;             // 화면 갱신 횟수

            if (nShowTime > 10)
            {
                nCount = Math.Min((nShowTime / 10), this.backgroundImage.Height);
                this.nShowCount = nShowTime / nCount;    // 화면 출력될때 애니메이션 횟수
                // 한번 화면이 갱신될때 증가치
                this.nShowIncrement = this.backgroundImage.Height / nCount;  
                 
            }
            else
            {
                this.nShowCount = 10;
                this.nShowIncrement = this.backgroundImage.Height;
            }

            // 화면이 닫힐때 애니메이션 설정
            if (nHideTime > 10)
            {
                nCount = Math.Min((nHideTime / 10), this.backgroundImage.Height);
                this.nHideCount = nHideTime / nCount;
                this.nHideDecrement = this.backgroundImage.Height / nCount;
            }
            else
            {
                this.nHideCount = 10;
                this.nHideDecrement = this.backgroundImage.Height;
            }

            // Hidden -> Appear -> Visible -> DisAppear -> Hidden 순으로 화면 변화
            switch (this.notifyState)
            {
                case NotifyState.Hidden:
                    this.notifyState = NotifyState.Appear;
                    this.SetBounds(this.screenRect.Right - this.backgroundImage.Width - 10,
                                        this.screenRect.Bottom - 1, this.backgroundImage.Width, 0);
                    timer.Interval = this.nShowCount;  // 타이머 시간 설정
                    timer.Start();
                    // 바탕 화면에 창 출력
                    ShowWindow(this.Handle, 4); // Win32 API 함수 호출
                    break;

                case NotifyState.Visible:
                    timer.Stop();
                    timer.Interval = this.nVisibleCount;
                    timer.Start();
                    Refresh();
                    break;

                case NotifyState.Appear:
                    Refresh();
                    break;

                case NotifyState.DisAppear:
                    timer.Stop();
                    this.notifyState = NotifyState.Visible;
                    this.SetBounds(this.screenRect.Right - this.backgroundImage.Width - 10,
                                         this.screenRect.Bottom - this.backgroundImage.Height - 1,
                                         this.backgroundImage.Width, this.backgroundImage.Height);
                    timer.Interval = this.nVisibleCount;
                    timer.Start();
                    Refresh();
                    break;
            }
        }
    }
}
좀 길죠... 요즘 시간이 없어서 다음에 이벤트 묶어서 사용하는 것까지 자세히 설명해 올릴께요~
예제 파일입니다.

 

AnimationTest.zip

AnimationTest.zip
0.04MB