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#

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);
}
}
}