일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 김춘배
- windows mobile 6.5
- 서진호
- 황광진
- 윈모데브
- winmodev
- UX베이커리
- 옴니아2
- 안드로이드
- 데브피아
- 지승욱
- 소년포비소프트
- MIX10
- 윈도데브
- 신동혁
- 윈도우 모바일
- 주신영
- 훈스닷넷
- 마이크로소프트
- 거제도
- 신석현
- 윈도우모바일
- 루나네스
- 쉐어포인트코리아
- 실버라이트 코리아
- 소년포비
- 윈도우폰
- 스마트폰
- 윈도우폰7
- 헤이맨
- Today
- Total
소년포비의 세계정복!!
C# 미니팝업창 애니메이션 효과 본문
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;
}
}
}
}
좀 길죠... 요즘 시간이 없어서 다음에 이벤트 묶어서 사용하는 것까지 자세히 설명해 올릴께요~
예제 파일입니다.
'프로그램 세상 > C#' 카테고리의 다른 글
C#으로 모니터 제어(on/off) (0) | 2009.10.07 |
---|---|
웹에서 윈폼 실행시키며 정보 넘기기 (0) | 2009.10.07 |
문자열 다루기 (0) | 2009.10.06 |
오버로딩,오버라이딩 그리고 new (0) | 2009.10.06 |
[ExecuteUnit] Process & Thread 개요 (0) | 2009.10.06 |