'random'에 해당되는 글 1건

  1. 2008/08/07 마우스 움직임에 따라 나타나는 원 (1)
WPF2008/08/07 00:55


이번 시간에는 위 동영상과 같이 마우스가 움직일 때 마다 원이 나타나는 효과를 구현해 보았습니다. (동영상을 올릴때 압축이 되서 그런지 약간 지저분해 보이기도 하네요ㅎㅎ) 소스코드는 아래와 같습니다.

[XAML]

<Window x:Class="WPFClock.Window1"
xmlns=http://schemas.microsoft.com/winfx/2006/xaml/presentation
xmlns:x=http://schemas.microsoft.com/winfx/2006/xaml
Title="Window1" Height="300" Width="300">
<Window.Resources>
<Style TargetType="Ellipse">
<Setter Property="RenderTransform">
<Setter.Value>
<ScaleTransform ScaleX="1" ScaleY="1"/>
</Setter.Value>
</Setter>
<Setter Property="RenderTransformOrigin" Value="0.5,0.5"/>
</Style>
<Storyboard x:Key="EllipseStoryBoard">
<DoubleAnimation To="8"
toryboard.TargetProperty
="(UIElement.RenderTransform).(ScaleTransform.ScaleX)"/>
<DoubleAnimation To="8"
toryboard.TargetProperty
="(UIElement.RenderTransform).(ScaleTransform.ScaleY)"/>
<DoubleAnimation To="0" Storyboard.TargetProperty="(UIElement.Opacity)"/>
</Storyboard>
</Window.Resources>
<Canvas x:Name="Root"/>
</
Window>

[C#]

public partial class Window1 : Window
{

public Window1()
{
InitializeComponent();
this.MouseMove += new MouseEventHandler(Window1_MouseMove);
}

void Window1_MouseMove(object sender, MouseEventArgs e)
{
Point Pt = e.GetPosition(this);
Add(Pt.X, Pt.Y);
}

//
마지막으로 객체가 생성된 시간
TimeSpan LastAdd;
public void Add(double X, double Y)
{

if ((DateTime.Now.TimeOfDay - LastAdd).Milliseconds < 50) return;
LastAdd = DateTime.Now.TimeOfDay;

Ellipse Ellipse = new Ellipse();
Ellipse.Stroke = GetRandomColorBrush();

int Size = (Byte)Rnadom.Next(5, 15);
Ellipse.Width = Ellipse.Height = Size;
Ellipse.Name = "_" + Ellipse.GetHashCode().ToString();

Canvas.SetLeft(Ellipse, X - Size / 2);
Canvas.SetTop(Ellipse, Y - Size / 2);

Root.RegisterName(Ellipse.Name, Ellipse);
Root.Children.Add(Ellipse);

Storyboard EllipseStoryboard = (Resources["EllipseStoryBoard"] as Storyboard).Clone();
Storyboard.SetTargetName(EllipseStoryboard, Ellipse.Name);

EllipseStoryboard.Completed += new EventHandler(EllipseStoryboard_Completed);
Ellipse.BeginStoryboard(EllipseStoryboard);

}

SolidColorBrush GetRandomColorBrush()
{
Random Rnadom = new Random(DateTime.Now.Millisecond);
Color StrokeColor = Color.FromArgb(
(Byte)Rnadom.Next(80, 255),
(Byte)Rnadom.Next(0, 255),
(Byte)Rnadom.Next(0, 255),
(Byte)Rnadom.Next(0, 255)
);
return new SolidColorBrush(StrokeColor);

}

void EllipseStoryboard_Completed(object sender, EventArgs e)
{

Storyboard Storyboard = (sender as ClockGroup).Timeline as Storyboard;
Ellipse Ellipse = FindName(Storyboard.GetTargetName(Storyboard)) as Ellipse;

Root.UnregisterName(Ellipse.Name);
Root.Children.Remove(Ellipse);

}
}

코드가 꾀 길어 보이지만 실제로는 복잡한 내용은 없으니 한줄 한줄 천천히 살펴보시면 이해 하실 수 있을 것입니다. (혹시 이해가 잘 안 되는 부분이나 추가 설명이 필요한 부분은 댓글 달아주시면 설명 해드리도록 하겠습니다.)

사용자 삽입 이미지
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 곡스