/* * BTrackBar.cs * Copyright (c) 2009 kbinani * * This file is part of Boare.Lib.AppUtil. * * Boare.Lib.AppUtil is free software; you can redistribute it and/or * modify it under the terms of the BSD License. * * Boare.Lib.AppUtil is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. */ //#define BENCH using System; using System.Windows.Forms; using System.Reflection; namespace Boare.Lib.AppUtil { /// /// Valueの型を変えられるTrackBar /// public class BTrackBar : UserControl where T : struct, IComparable { const int _MAX = 10000; private T m_value; private T m_min; private T m_max; private T m_tick_frequency; private MethodInfo m_parser = null; private ValueType m_value_type = ValueType.int_; private TrackBarEx m_track_bar; private Type m_type = typeof( int ); private enum ValueType { sbyte_, byte_, shoft_, ushort_, int_, uint_, long_, ulong_, } public event EventHandler ValueChanged; private static void test() { System.Windows.Forms.TrackBar tb = new System.Windows.Forms.TrackBar(); BTrackBar tb2 = new BTrackBar(); } public BTrackBar() { InitializeComponent(); T value_type = new T(); if ( value_type is byte ) { m_value_type = BTrackBar.ValueType.byte_; } else if ( value_type is sbyte ) { m_value_type = BTrackBar.ValueType.sbyte_; } else if ( value_type is short ) { m_value_type = BTrackBar.ValueType.shoft_; } else if ( value_type is ushort ) { m_value_type = BTrackBar.ValueType.ushort_; } else if ( value_type is int ) { m_value_type = BTrackBar.ValueType.int_; } else if ( value_type is uint ) { m_value_type = BTrackBar.ValueType.uint_; } else if ( value_type is long ) { m_value_type = BTrackBar.ValueType.long_; } else if ( value_type is ulong ) { m_value_type = BTrackBar.ValueType.ulong_; } else { throw new NotSupportedException( "generic type T must be byte, sbyte, short, ushort, int, uint, long or ulong" ); } m_type = value_type.GetType(); m_parser = typeof( T ).GetMethod( "Parse", new Type[] { typeof( string ) } ); if ( m_parser == null ) { throw new ApplicationException( "this error never occurs; m_type=" + m_value_type ); } #if BENCH // Benchmark1: string parser int _COUNT = 100000; MethodInfo parser_double = typeof( double ).GetMethod( "Parse", new Type[] { typeof( string ) } ); Console.WriteLine( "parsed \"123.456\" = " + ((double)parser_double.Invoke( typeof( double ), new object[] { "123.456" } )) ); DateTime start = DateTime.Now; for ( int i = 0; i < _COUNT; i++ ) { double v = (double)parser_double.Invoke( typeof( double ), new object[] { "123.456" } ); } Console.WriteLine( "Benchmark1; " + DateTime.Now.Subtract( start ).TotalMilliseconds / (double)_COUNT + "ms" ); // Benchmark2: BinaryFormatter System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bf = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); System.IO.MemoryStream ms = new System.IO.MemoryStream( 64 ); const double cdbbl = 123.456; bf.Serialize( ms, cdbbl ); _COUNT = 10000; ms.Seek( 0, System.IO.SeekOrigin.Begin ); Console.WriteLine( "deserilized = " + ((double)bf.Deserialize( ms )) ); start = DateTime.Now; for ( int i = 0; i < _COUNT; i++ ) { ms.Seek( 0, System.IO.SeekOrigin.Begin ); double v = (double)bf.Deserialize( ms ); } Console.WriteLine( "Benchmark2; " + DateTime.Now.Subtract( start ).TotalMilliseconds / (double)_COUNT + "ms" ); // Benchmark3: Convert class object obj = cdbbl; Console.WriteLine( "Converted = " + Convert.ToDouble( obj ) ); _COUNT = 100000; start = DateTime.Now; for ( int i = 0; i < _COUNT; i++ ) { double v = Convert.ToDouble( obj ); } Console.WriteLine( "Benchmark3; " + DateTime.Now.Subtract( start ).TotalMilliseconds / (double)_COUNT + "ms" ); #endif } public T Maximum { get { return m_max; } set { if ( value.CompareTo( m_min ) < 0 ) { throw new ArgumentOutOfRangeException( "Maximum" ); } m_max = value; if ( m_max.CompareTo( m_value ) < 0 ) { Value = m_max; } } } public T Minimum { get { return m_min; } set { if ( value.CompareTo( m_max ) > 0 ) { throw new ArgumentOutOfRangeException( "Minimum" ); } m_min = value; if ( m_min.CompareTo( m_value ) > 0 ) { Value = m_min; } } } public TickStyle TickStyle { get { return m_track_bar.TickStyle; } set { m_track_bar.TickStyle = value; } } public T TickFrequency { get { return m_tick_frequency; } set { m_tick_frequency = value; double max = asDouble( m_max ); double min = asDouble( m_min ); double stride = asDouble( m_tick_frequency ); double rate = (max - min) / stride; Console.WriteLine( "BTrackBar+set__TickFrequency" ); Console.WriteLine( " rate=" + rate ); int freq = (int)(_MAX / rate); Console.WriteLine( " freq=" + freq ); Console.WriteLine( " m_track_bar.Maximum=" + m_track_bar.Maximum ); m_track_bar.TickFrequency = freq; } } public T Value { get { return m_value; } set { if ( value.CompareTo( m_max ) > 0 ) { throw new ArgumentOutOfRangeException( "Value" ); } if ( value.CompareTo( m_min ) < 0 ) { throw new ArgumentOutOfRangeException( "Value" ); } T old = m_value; m_value = value; if ( old.CompareTo( m_value ) != 0 && ValueChanged != null ) { ValueChanged( this, new EventArgs() ); } } } private double asDouble( T value ) { object o = value; return Convert.ToDouble( o ); } private T add( T value1, T value2 ) { object o1 = value1; object o2 = value2; switch ( m_value_type ) { case BTrackBar.ValueType.sbyte_: sbyte sb1 = Convert.ToSByte( o1 ); sbyte sb2 = Convert.ToSByte( o2 ); object sb_r = (sb1 + sb2); return (T)sb_r; case BTrackBar.ValueType.byte_: byte b1 = Convert.ToByte( o1 ); byte b2 = Convert.ToByte( o2 ); object b_r = (b1 + b2); return (T)b_r; case BTrackBar.ValueType.shoft_: short s1 = Convert.ToInt16( o1 ); short s2 = Convert.ToInt16( o2 ); object s_r = (s1 + s2); return (T)s_r; case BTrackBar.ValueType.ushort_: ushort us1 = Convert.ToUInt16( o1 ); ushort us2 = Convert.ToUInt16( o2 ); object us_r = (us1 + us2); return (T)us_r; case BTrackBar.ValueType.int_: int i1 = Convert.ToInt32( o1 ); int i2 = Convert.ToInt32( o2 ); object i_r = (i1 + i2); return (T)i_r; case BTrackBar.ValueType.uint_: uint ui1 = Convert.ToUInt32( o1 ); uint ui2 = Convert.ToUInt32( o2 ); object ui_r = ui1 + ui2; return (T)ui_r; case BTrackBar.ValueType.long_: long l1 = Convert.ToInt64( o1 ); long l2 = Convert.ToInt64( o2 ); object l_r = l1 + l2; return (T)l_r; case BTrackBar.ValueType.ulong_: ulong ul1 = Convert.ToUInt64( o1 ); ulong ul2 = Convert.ToUInt64( o2 ); object ul_r = ul1 + ul2; return (T)ul_r; } return new T(); } private void InitializeComponent() { this.m_track_bar = new TrackBarEx(); ((System.ComponentModel.ISupportInitialize)(this.m_track_bar)).BeginInit(); this.SuspendLayout(); // // trackBar // this.m_track_bar.Dock = System.Windows.Forms.DockStyle.Fill; this.m_track_bar.Location = new System.Drawing.Point( 0, 0 ); this.m_track_bar.Name = "trackBar"; this.m_track_bar.Size = new System.Drawing.Size( 286, 55 ); this.m_track_bar.TabIndex = 0; this.m_track_bar.Maximum = _MAX; this.m_track_bar.Minimum = 0; this.m_track_bar.TickFrequency = 1; this.m_track_bar.SmallChange = 1; this.m_track_bar.m_wheel_direction = false; // // BTrackBar // this.Controls.Add( this.m_track_bar ); this.Name = "BTrackBar"; this.Size = new System.Drawing.Size( 286, 55 ); ((System.ComponentModel.ISupportInitialize)(this.m_track_bar)).EndInit(); this.ResumeLayout( false ); this.PerformLayout(); } } internal class TrackBarEx : TrackBar { public bool m_wheel_direction = true; protected override void OnMouseWheel( MouseEventArgs e ) { if ( m_wheel_direction ) { base.OnMouseWheel( new MouseEventArgs( e.Button, e.Clicks, e.X, e.Y, e.Delta ) ); } else { base.OnMouseWheel( new MouseEventArgs( e.Button, e.Clicks, e.X, e.Y, -e.Delta ) ); } } } }