You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
441 lines
14 KiB
C#
441 lines
14 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel;
|
|
using System.Drawing;
|
|
using System.Data;
|
|
using System.Text;
|
|
using System.Windows.Forms;
|
|
|
|
namespace HuizhongLibrary.MyAlphaControl
|
|
{
|
|
public partial class AlphaLabel : UserControl
|
|
{
|
|
private Bitmap m_BackgroundImage;
|
|
/// <summary>
|
|
/// 背景图片
|
|
/// </summary>
|
|
public new Bitmap BackgroundImage
|
|
{
|
|
get { return m_BackgroundImage; }
|
|
set
|
|
{
|
|
m_BackgroundImage = value;
|
|
}
|
|
}
|
|
private StringPool m_ScrollText = new StringPool();
|
|
/// <summary>
|
|
/// 滚动文字列表
|
|
/// </summary>
|
|
public StringPool ScrollText
|
|
{
|
|
get { return m_ScrollText; }
|
|
set { m_ScrollText = value; }
|
|
}
|
|
private int m_ScrollTop = 0;
|
|
|
|
public int ScrollTop
|
|
{
|
|
get { return m_ScrollTop; }
|
|
set { m_ScrollTop = value; }
|
|
}
|
|
private int m_ScrollLeft = 0;
|
|
|
|
public int ScrollLeft
|
|
{
|
|
get { return m_ScrollLeft; }
|
|
set { m_ScrollLeft = value; }
|
|
}
|
|
private string m_MoveDirection = "None";
|
|
/// <summary>
|
|
/// 移动方向(None,Left,Right,Top,Boottom)
|
|
/// </summary>
|
|
public string MoveDirection
|
|
{
|
|
get { return m_MoveDirection; }
|
|
set { m_MoveDirection = value; }
|
|
}
|
|
private int m_DurationStep = 5;
|
|
/// <summary>
|
|
/// 每次移动多少个像素(默认一个像素,最慢的移动速度)
|
|
/// </summary>
|
|
public int DurationStep
|
|
{
|
|
get { return m_DurationStep; }
|
|
set { m_DurationStep = value; }
|
|
}
|
|
private StringFormat m_TextAlign = new StringFormat();
|
|
/// <summary>
|
|
/// 文本对齐
|
|
/// </summary>
|
|
public StringFormat TextAlign
|
|
{
|
|
get { return m_TextAlign; }
|
|
set { m_TextAlign = value; }
|
|
}
|
|
|
|
|
|
private int m_Interval = 1;
|
|
|
|
public int Interval
|
|
{
|
|
get { return m_Interval; }
|
|
set { m_Interval = value; }
|
|
}
|
|
|
|
private int m_TimeOut = 30;
|
|
|
|
public int TimeOut
|
|
{
|
|
get { return m_TimeOut; }
|
|
set { m_TimeOut = value; }
|
|
}
|
|
private bool m_TickEnable = false;
|
|
/// <summary>
|
|
/// 是否启用倒计时
|
|
/// </summary>
|
|
public bool TickEnable
|
|
{
|
|
get { return m_TickEnable; }
|
|
set
|
|
{
|
|
m_TickEnable = value;
|
|
if (value == true) { StartTimeer(); }
|
|
else { StopTimeer(); }
|
|
}
|
|
}
|
|
|
|
private Color m_BorderColor = Color.Black;
|
|
/// <summary>
|
|
/// 边框粗细
|
|
/// </summary>
|
|
public Color BorderColor
|
|
{
|
|
get { return m_BorderColor; }
|
|
set { m_BorderColor = value; }
|
|
}
|
|
|
|
private bool m_Visible = true;
|
|
|
|
public new bool Visible
|
|
{
|
|
get { return m_Visible; }
|
|
set
|
|
{
|
|
m_Visible = value;
|
|
base.Visible = value;
|
|
}
|
|
}
|
|
private string m_NullText = "";
|
|
/// <summary>
|
|
/// 空时显示的文本
|
|
/// </summary>
|
|
public string NullText
|
|
{
|
|
get { return m_NullText; }
|
|
set { m_NullText = value; }
|
|
}
|
|
public bool ShowDateTime = false; //是否显示时间
|
|
public string DateTimeFormat = "yyyy年M月d日HH:mm:ss";
|
|
public int MaxRowNumber = 1;
|
|
|
|
/// <summary>
|
|
/// 当倒计时正常终止时触发
|
|
/// </summary>
|
|
public event Action<AlphaLabel> TimeTick;
|
|
|
|
private int ScrollTextWidth = 0;
|
|
private int SRCCOPY = 13369376;
|
|
private Graphics G1;
|
|
private Graphics G2;
|
|
private IntPtr hdc1;
|
|
private IntPtr hdc2;
|
|
|
|
|
|
public AlphaLabel()
|
|
{
|
|
TextAlign.LineAlignment = StringAlignment.Near;
|
|
TextAlign.Alignment = StringAlignment.Near;
|
|
InitializeComponent();
|
|
|
|
}
|
|
|
|
#region 画背景图片(用于假透明显示)
|
|
public void SetBackground(Bitmap bmp)
|
|
{
|
|
if (bmp == null) return;
|
|
BackgroundImage = new Bitmap(this.Bounds.Width, this.Bounds.Height);
|
|
Graphics G2 = Graphics.FromImage(BackgroundImage);
|
|
G2.DrawImage(bmp, new Rectangle(0, 0, this.Bounds.Width, this.Bounds.Height), new Rectangle(this.Left, this.Top, this.Bounds.Width, this.Bounds.Height), GraphicsUnit.Pixel);
|
|
G2.Dispose();
|
|
//this.BorderStyle = BorderStyle.None;
|
|
//this.BackColor=Color.Transparent;
|
|
}
|
|
#endregion
|
|
#region 重画文字
|
|
//private byte[] CacheImage = null;
|
|
public void DrawString(int x, int y, string s)
|
|
{
|
|
Bitmap bmp = null;
|
|
if (BackgroundImage == null)
|
|
{
|
|
bmp = new Bitmap(this.Bounds.Width, this.Bounds.Height);
|
|
}
|
|
else
|
|
{
|
|
//复制图片
|
|
//CacheImage = CustomIO.GetPhoto(this.BackgroundImage);
|
|
bmp = (Bitmap)BackgroundImage.Clone();
|
|
}
|
|
G1 = this.CreateGraphics();
|
|
G2 = Graphics.FromImage(bmp);
|
|
|
|
hdc1 = G1.GetHdc();
|
|
hdc2 = G2.GetHdc();
|
|
|
|
|
|
if (BackgroundImage == null) G2.Clear(this.BackColor);
|
|
Brush backBrush = new SolidBrush(this.ForeColor);
|
|
G2.DrawString(s, this.Font, backBrush, x, y);
|
|
backBrush.Dispose();
|
|
SystemInfo.BitBlt(hdc1, 0, 0, Width, Height, hdc2, 0, 0, SRCCOPY);
|
|
|
|
G1.ReleaseHdc(hdc1);
|
|
G2.ReleaseHdc(hdc2);
|
|
|
|
G1.Dispose();
|
|
G2.Dispose();
|
|
bmp.Dispose();
|
|
|
|
//if (pictureBox1.Image != null) pictureBox1.Image.Dispose();
|
|
//pictureBox1.Image = bmp;
|
|
//GC.Collect();
|
|
}
|
|
#endregion
|
|
#region 移动文字
|
|
public void MoveText()
|
|
{
|
|
if (this.MoveDirection == "Left")
|
|
{
|
|
if (this.ScrollLeft <= -this.ScrollTextWidth) { this.ScrollLeft = this.Width; AddScrollTextIndex(); }
|
|
this.ScrollLeft -= this.DurationStep;
|
|
|
|
}
|
|
if (this.MoveDirection == "Right")
|
|
{
|
|
if (this.ScrollLeft >= this.Width) { this.ScrollLeft = -this.ScrollTextWidth; AddScrollTextIndex(); }
|
|
this.ScrollLeft += this.DurationStep;
|
|
|
|
}
|
|
if (this.MoveDirection == "Top")
|
|
{
|
|
if (this.ScrollTop <= 0) { this.ScrollTop = this.Height; AddScrollTextIndex(); }
|
|
this.ScrollTop -= this.DurationStep;
|
|
|
|
}
|
|
if (this.MoveDirection == "Bottom")
|
|
{
|
|
if (this.ScrollTop >= this.Height) { this.ScrollTop = 0; AddScrollTextIndex(); }
|
|
this.ScrollTop += this.DurationStep;
|
|
}
|
|
this.DrawString(this.ScrollLeft, this.ScrollTop, this.Text);
|
|
|
|
}
|
|
#endregion
|
|
#region 增加索引
|
|
void AddScrollTextIndex()
|
|
{
|
|
if (string.IsNullOrEmpty(this.Text) == false) ScrollText.CheckIn(this.Text);
|
|
if (ScrollText.Available == 0) this.Text = this.NullText;
|
|
this.Text = ScrollText.CheckOut();
|
|
InitScrollTextSize();
|
|
//ScrollTextIndex++;
|
|
//if (ScrollTextIndex >= this.ScrollText.Count)
|
|
//{
|
|
// ScrollTextIndex = 0;
|
|
//}
|
|
}
|
|
#endregion
|
|
#region 计算文字大小
|
|
private SizeF MeasureString(string Text, Font font)
|
|
{
|
|
Bitmap bmp = new Bitmap(1, 1, System.Drawing.Imaging.PixelFormat.Format32bppRgb);
|
|
Graphics g = Graphics.FromImage(bmp);
|
|
SizeF s = g.MeasureString(Text, font);
|
|
return s;
|
|
}
|
|
#endregion
|
|
#region 开始计时
|
|
Timer time1 = new Timer();
|
|
private int TimeNumber=0;
|
|
public void StartTimeer()
|
|
{
|
|
TimeNumber = this.TimeOut;
|
|
time1.Interval = this.Interval * 1000;
|
|
time1.Tick += time1_Tick;
|
|
time1.Enabled = true;
|
|
}
|
|
|
|
void time1_Tick(object sender, EventArgs e)
|
|
{
|
|
if (ShowDateTime == true)
|
|
{
|
|
|
|
this.Text = DateTime.Now.ToString(DateTimeFormat);
|
|
}
|
|
else
|
|
{
|
|
if (this.TimeNumber == 0)
|
|
{
|
|
StopTimeer();
|
|
TimeNumber = this.TimeOut;
|
|
if (this.TimeTick != null) this.TimeTick(this);
|
|
return;
|
|
}
|
|
this.Text = TimeNumber.ToString();
|
|
TimeNumber--;
|
|
}
|
|
this.Refresh();
|
|
}
|
|
#endregion
|
|
#region 停止计时
|
|
public void StopTimeer()
|
|
{
|
|
time1.Tick -= time1_Tick;
|
|
time1.Enabled = false;
|
|
}
|
|
#endregion
|
|
|
|
#region 刷新
|
|
public new void Refresh()
|
|
{
|
|
Bitmap bmp = null;
|
|
if (BackgroundImage == null)
|
|
{
|
|
bmp = new Bitmap(this.Bounds.Width, this.Bounds.Height);
|
|
}
|
|
else
|
|
{
|
|
bmp = (Bitmap)BackgroundImage.Clone();
|
|
}
|
|
//G1 = this.CreateGraphics();
|
|
G2 = Graphics.FromImage(bmp);
|
|
|
|
//hdc1 = G1.GetHdc();
|
|
//hdc2 = G2.GetHdc();
|
|
|
|
if (BackgroundImage == null) G2.Clear(this.BackColor);
|
|
Brush backBrush = new SolidBrush(this.ForeColor);
|
|
//if (this.Border > 0) g.DrawRectangle(new Pen(BorderColor, this.Border), this.Bounds);
|
|
//if (string.IsNullOrEmpty(this.Text) == false) g.DrawString(this.Text, this.Font, backBrush, new RectangleF(0, 0, this.Bounds.Width, this.Bounds.Height), TextAlign);
|
|
if (string.IsNullOrEmpty(this.Text) == false)
|
|
{
|
|
G2.DrawString(this.Text, this.Font, backBrush, new RectangleF(0, 0, this.Width, this.Height), this.TextAlign);
|
|
//if (TextAlign.Alignment == StringAlignment.Near)
|
|
//{
|
|
// G2.DrawString(this.Text, this.Font, backBrush, 0, 0);
|
|
//}
|
|
//if (TextAlign.Alignment == StringAlignment.Center)
|
|
//{
|
|
// float TextWidth = MeasureString(this.Text, this.Font).Width;
|
|
// float x = (this.Width - TextWidth) / 2;
|
|
// G2.DrawString(this.Text, this.Font, backBrush, x, 0);
|
|
//}
|
|
//if (TextAlign.Alignment == StringAlignment.Far)
|
|
//{
|
|
// float TextWidth = MeasureString(this.Text + "AA", this.Font).Width;
|
|
// float x = (this.Width - TextWidth);
|
|
// G2.DrawString(this.Text, this.Font, backBrush, x, 0);
|
|
//}
|
|
}
|
|
backBrush.Dispose();
|
|
//SystemInfo.BitBlt(hdc1, 0, 0, Width, Height, hdc2, 0, 0, SRCCOPY);
|
|
|
|
//G1.ReleaseHdc(hdc1);
|
|
//G2.ReleaseHdc(hdc2);
|
|
|
|
//G1.Dispose();
|
|
//G2.Dispose();
|
|
//bmp.Dispose();
|
|
if (pictureBox1.Image != null) pictureBox1.Image.Dispose();
|
|
pictureBox1.Image = bmp;
|
|
}
|
|
#endregion
|
|
#region 新增文本行
|
|
public void AddRowText(string Text)
|
|
{
|
|
if (this.ScrollText.Available == this.MaxRowNumber)
|
|
{
|
|
this.ScrollText.CheckOut();
|
|
}
|
|
this.ScrollText.CheckIn(Text);
|
|
string ss = "";
|
|
for (int i = 0; i < this.ScrollText.Available; i++)
|
|
{
|
|
ss+=this.ScrollText.Peek()+ "\n";
|
|
}
|
|
ss = ss.Substring(0, ss.Length - 1);
|
|
this.Text = ss;
|
|
}
|
|
#endregion
|
|
#region 清除文本
|
|
public void ClearRowText()
|
|
{
|
|
this.ScrollText.Clear();
|
|
this.Text = "";
|
|
}
|
|
#endregion
|
|
#region 移除滚动文字
|
|
public void Remove(string item)
|
|
{
|
|
this.ScrollText.Remove(item);
|
|
if (this.Text == item) this.Text = "";
|
|
if (ScrollText.Available == 0)
|
|
{
|
|
this.Text = this.NullText;
|
|
}
|
|
else
|
|
{
|
|
this.Text = this.ScrollText.CheckOut();
|
|
}
|
|
if (this.MoveDirection == "Left")
|
|
{
|
|
this.ScrollLeft = this.Width;
|
|
}
|
|
if (this.MoveDirection == "Right")
|
|
{
|
|
this.ScrollLeft = 0;
|
|
}
|
|
if (this.MoveDirection == "Top")
|
|
{
|
|
this.ScrollTop = this.Height;
|
|
}
|
|
if (this.MoveDirection == "Bottom")
|
|
{
|
|
this.ScrollTop = 0;
|
|
}
|
|
InitScrollTextSize();
|
|
}
|
|
#endregion
|
|
|
|
#region 初始化文字大小
|
|
public void InitScrollTextSize()
|
|
{
|
|
this.ScrollTextWidth =Convert.ToInt32(MeasureString(this.Text, this.Font).Width);
|
|
}
|
|
#endregion
|
|
|
|
#region 隐藏背景控件
|
|
public void VisiblePictureBox()
|
|
{
|
|
pictureBox1.Visible = false;
|
|
}
|
|
#endregion
|
|
|
|
|
|
protected override void OnPaint(PaintEventArgs e)
|
|
{
|
|
base.OnPaint(e);
|
|
}
|
|
}
|
|
}
|