|
■No68375 (たいち さん) に返信
> VBが全く分かりません。
言語そのものは分からずとも、それ以外の部分について、たとえば
・Timer の使い方を把握しているか、あるいは全く分からないのか
・TextBox から先頭の文字を削りとる文字列操作をコーディングできるのか
・表示に Label を用いてみるのはどうか
・TextBox に ToolTip を使う代案が使えるかどうか
といった点に対して言及するぐらいの事はできるのでは…?
第一、ムドーさんの回答には、C# での説明も紹介されているのですし。(^_^;)
とりあえず、先の MarqueeLabel を C# 版に翻訳してみました。
using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Windows.Forms;
public sealed class MarqueeLabel : Label
{
private IContainer components;
private Timer timer;
private float location = 0.0f;
public MarqueeLabel()
{
base.UseCompatibleTextRendering = true;
timer = new Timer(components = new Container());
timer.Interval = 50;
timer.Tick += delegate
{
if (location > (float)Width)
{
location = -(float)Width;
}
else
{
location += speed / 10.0f;
}
Invalidate();
};
SetStyle(ControlStyles.UserPaint, true);
SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
SetStyle(ControlStyles.AllPaintingInWmPaint, true);
base.AutoSize = false;
timer.Start();
}
[DefaultValue(false)]
public override bool AutoSize
{
get { return base.AutoSize; }
set { if (!DesignMode) base.AutoSize = value; }
}
/// <summary>流れるスピードを指定します。</summary>
[Description("流れるスピードを指定します。")]
[Category("Action"), DefaultValue(20.0f)]
public float Speed
{
get { return Math.Max(0.0f, Math.Min((float)Width, speed)); }
set
{
if (value < 0.0f)
{
throw new ArgumentOutOfRangeException("Speed", value, "0以上の値を指定してください。");
}
speed = Math.Min((float)Width, value);
if (value == 0.0f)
{
timer.Stop();
if (DesignMode) ResetPosition();
}
else
{
timer.Start();
}
}
}
private float speed = 20.0f;
protected override void OnPaint(PaintEventArgs e)
{
e.Graphics.TranslateTransform(-location, 0.0f);
base.OnPaint(e);
}
public void ResetPosition()
{
location = 0.0f;
Invalidate();
}
[DebuggerNonUserCode]
protected override void Dispose(bool disposing)
{
try
{
if (disposing && components != null) { components.Dispose(); }
}
finally
{
base.Dispose(disposing);
}
}
}
|