Files
RhythmicWallpaper/AudioVisualizer/MyPanel.cs
2024-10-17 23:10:02 +08:00

177 lines
5.0 KiB
C#

using System.ComponentModel;
namespace AudioWallpaper {
public partial class PanelEx : Control {
private float _iBorderThickness = 1f;
private float _iOpacity = 1f;
private Brush _brushBg = null;
private Pen _penFg = null;
public PanelEx() {
this.SetStyle(ControlStyles.SupportsTransparentBackColor |
ControlStyles.Opaque, true);
this.BackColor = Color.Transparent;
BackgroundBrush = Brushes.Transparent;
ForegroundPen = Pens.Black;
}
#region Propertys
#region HideParent
[Browsable(false)]
[EditorBrowsable(EditorBrowsableState.Never)]
public override string Text {
get { return base.Text; }
set { base.Text = value; }
}
[Browsable(false)]
[EditorBrowsable(EditorBrowsableState.Never)]
public override Image BackgroundImage {
get { return base.BackgroundImage; }
set { base.BackgroundImage = value; }
}
[Browsable(false)]
[EditorBrowsable(EditorBrowsableState.Never)]
public override ImageLayout BackgroundImageLayout {
get {
return base.BackgroundImageLayout;
}
set {
base.BackgroundImageLayout = value;
}
}
#endregion
public override Color BackColor {
get {
return base.BackColor;
}
set {
base.BackColor = value;
ResetBgBrush();
}
}
//[EditorAttribute(typeof(BrushTypeEditor), typeof(System.Drawing.Design.UITypeEditor))]
//public double Background
//{
// get;
// set;
//}
public override Color ForeColor {
get {
return base.ForeColor;
}
set {
base.ForeColor = value;
ResetFgPen();
}
}
public float BorderThickness {
get { return _iBorderThickness; }
set {
if (value < 0) {
throw new Exception("Out off range");
}
_iBorderThickness = value;
ResetFgPen();
ResetDrawRect();
}
}
public virtual float RotateAngle {
get;
set;
}
public float Opacity {
get { return _iOpacity; }
set {
if (value > 1 || value < 0) {
throw new Exception("Out of range,the Value be in [0,1]");
} else {
_iOpacity = value;
ResetBrushes();
}
}
}
protected override CreateParams CreateParams {
get {
CreateParams cp = base.CreateParams;
cp.ExStyle = 0x20;
return cp;
}
}
protected virtual Brush BackgroundBrush {
get { return _brushBg; }
set { _brushBg = value; }
}
protected virtual Pen ForegroundPen {
get { return _penFg; }
set { _penFg = value; }
}
protected virtual RectangleF DrawRect {
get;
set;
}
#endregion
#region Methods
protected override void OnPaint(PaintEventArgs e) {
base.OnPaint(e);
e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
}
protected override void OnSizeChanged(EventArgs e) {
base.OnSizeChanged(e);
ResetDrawRect();
}
protected override void OnPaddingChanged(EventArgs e) {
base.OnPaddingChanged(e);
ResetDrawRect();
}
protected void ResetBrushes() {
ResetBgBrush();
ResetFgPen();
}
protected void ResetBgBrush() {
BackgroundBrush = new SolidBrush(GetOpacityColor(BackColor, Opacity));
}
protected void ResetFgPen() {
ForegroundPen = new Pen(GetOpacityColor(ForeColor, Opacity), BorderThickness);
}
protected Color GetOpacityColor(Color baseColor, float op) {
return Color.FromArgb(Convert.ToInt32(op * baseColor.A), baseColor);
}
private void ResetDrawRect() {
float dbwidth = 2 * BorderThickness;
float halfwidth = BorderThickness / 2;
int paddingWhith = Padding.Left + Padding.Right;
int paddingHeight = Padding.Top + Padding.Bottom;
if (dbwidth > Width - paddingWhith || dbwidth > Height - paddingHeight) {
DrawRect = this.Bounds;
} else {
DrawRect = new RectangleF(Padding.Left + halfwidth,
Padding.Top + halfwidth,
Width - BorderThickness - paddingWhith,
Height - BorderThickness - paddingHeight);
}
}
#endregion
}
}