이전에 제 블로그 성향을 제 이야기를 풀어가는 쪽으로 변경한다고 했었는데, 지속적으로 미니기기 관련 글만 올라오는게 블로그가 더 딱딱해진 느낌이네요. 그래서 이제부터 은광초등학교(Silverlight Elementary School ㅎㅎ;) 에서 열심히 공부한 것들도 제 블로그에 올려보려고 합니다. 조금 부족하지만 모아두면 좋은 자료가 될 것 같네요.
[완성품]
[소스]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
namespace slider
{
public partial class Page : UserControl
{
public Random rand = new Random();
public Page()
{
InitializeComponent();
}
public Color ColorFromAhsb(byte a, float h, float s, float b)
{
/*
if (0 > a || 255 < a)
{
throw new ArgumentOutOfRangeException(“a”, a,
Properties.Resources.InvalidAlpha);
}
if (0f > h || 360f < h)
{
throw new ArgumentOutOfRangeException(“h”, h,
Properties.Resources.InvalidHue);
}
if (0f > s || 1f < s)
{
throw new ArgumentOutOfRangeException(“s”, s,
Properties.Resources.InvalidSaturation);
}
if (0f > b || 1f < b)
{
throw new ArgumentOutOfRangeException(“b”, b,
Properties.Resources.InvalidBrightness);
}
*/
if (0 == s)
{
return Color.FromArgb(a, (byte)(b * 255),(byte)(b * 255), (byte)(b * 255));
}
float fMax, fMid, fMin;
int iSextant;
byte iMax, iMid, iMin;
if (0.5 < b)
{
fMax = b – (b * s) + s;
fMin = b + (b * s) – s;
}
else
{
fMax = b + (b * s);
fMin = b – (b * s);
}
iSextant = (int)Math.Floor(h / 60f);
if (300f <= h)
{
h -= 360f;
}
h /= 60f;
h -= 2f * (float)Math.Floor(((iSextant + 1f) % 6f) / 2f);
if (0 == iSextant % 2)
{
fMid = h * (fMax – fMin) + fMin;
}
else
{
fMid = fMin – h * (fMax – fMin);
}
iMax = (byte)(fMax * 255);
iMid = (byte)(fMid * 255);
iMin = (byte)(fMin * 255);
switch (iSextant)
{
case 1:
return Color.FromArgb(a, iMid, iMax, iMin);
case 2:
return Color.FromArgb(a, iMin, iMax, iMid);
case 3:
return Color.FromArgb(a, iMin, iMid, iMax);
case 4:
return Color.FromArgb(a, iMid, iMin, iMax);
case 5:
return Color.FromArgb(a, iMax, iMin, iMid);
default:
return Color.FromArgb(a, iMax, iMid, iMin);
}
}
private void G_slider_ValueChanged(object sender, RoutedEventArgs e)
{
SetNameColor();
}
private void B_slider_ValueChanged(object sender, RoutedEventArgs e)
{
SetNameColor();
}
private void R_slider_ValueChanged(object sender, RoutedEventArgs e)
{
SetNameColor();
}
public void SetNameColor()
{
//Name.Text = “정상범”;
nemo.Fill = new SolidColorBrush(ColorFromAhsb(255, (float)R_slider.Value, (float)G_slider.Value, (float)B_slider.Value));
//Name.Foreground = new SolidColorBrush(Color.FromArgb(255, (byte)R_slider.Value, (byte)G_slider.Value, (byte)B_slider.Value));
}
private void Name_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
int i;
int j;
int value_b;
Name.Text = “정상범(큐브)입니다.”;
Color_Storyboard.Begin();
TargetColor.Value = ColorFromAhsb(255, (float)R_slider.Value, (float)G_slider.Value, (float)B_slider.Value);
if (B_slider.Value >= 0.80)
{
value_b = 80;
}
else
{
value_b = (int)(B_slider.Value * 100);
}
for (i = 0; i < 15; i++ )
{
for (j = 0; j < 15; j++)
{
Rectangle tmp = new Rectangle();
tmp.Height = 20.0;
tmp.Width = 20.0;
tmp.Fill = new SolidColorBrush(ColorFromAhsb(255, (float)R_slider.Value, (float)G_slider.Value, (float)(rand.Next(value_b, value_b+20) / 100.0)));
tmp.SetValue(Canvas.LeftProperty, i*20.0);
tmp.SetValue(Canvas.TopProperty, j*20.0);
Layout_Rec.Children.Add(tmp);
}
}
//Name.Foreground = new SolidColorBrush(Color.FromArgb(255, (byte)R_slider.Value, (byte)G_slider.Value, (byte)B_slider.Value));
}
private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
SetNameColor();
}
}
}
실버라이트 2.0 정식버전이 깔려야 볼 수 있는 자료입니다.
소스는 xaml 파일을 제외한 Page.xaml.cs의 소스이구요.
RGB값을 HSB로 바꾸어주는 함수를 이용하여 만들었습니다. (교장선생님 최고~)
사실 처음에는 슬라이더를 공부하다가 어찌어찌 이런 것까지 만들게 되었네요.
이용방법은 슬라이더 각각 Hue, Saturation, Brightness를 나타내고 글씨를 누르게 되면,
HSB의 색상을 받아와서 적절하게 모자이크처럼 보여줍니다.
이번에 만들면서 문제가 있었던 부분은 스토리보드를 켜놓은 상태에서 슬라이더 Value값이나
설정값을 수정하면 그 값이 스토리보드에 저장이 되는 것일 뿐 원본은 변화가 없다는 것입니다.
이걸로 몇 분을 허비했던지, 꼭!! 다음번에도 주의를 해야겠습니다.
아… 소스 공개 참 부끄럽네요… 부끄부끄…
답글 남기기