first commit
This commit is contained in:
536
hLabel.cs
Normal file
536
hLabel.cs
Normal file
@@ -0,0 +1,536 @@
|
||||
using System;
|
||||
using System.ComponentModel;
|
||||
using System.Drawing;
|
||||
using System.Drawing.Drawing2D;
|
||||
using System.Drawing.Text;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace hKursu
|
||||
{
|
||||
public class hLabel : Control
|
||||
{
|
||||
private string _text = "";
|
||||
private Font _font = new Font("Segoe UI", 9F);
|
||||
private Color _foreColor = Color.Black;
|
||||
private Color _shadowColor = Color.Gray;
|
||||
private int _shadowOffset = 2;
|
||||
private ContentAlignment _textAlign = ContentAlignment.TopLeft;
|
||||
private bool _autoSize = true;
|
||||
private int _maxWidth = 200;
|
||||
private TextRenderingHint _textRenderingHint = TextRenderingHint.AntiAliasGridFit;
|
||||
|
||||
// Kontur özellikleri
|
||||
private bool _drawOutline = false;
|
||||
private Color _outlineColor = Color.Black;
|
||||
private float _outlineWidth = 1.0f;
|
||||
|
||||
// 3D efekt özellikleri
|
||||
private TextEffect _textEffect = TextEffect.None;
|
||||
private Color _bevelHighlight = Color.White;
|
||||
private Color _bevelShadow = Color.Gray;
|
||||
private int _bevelDepth = 1;
|
||||
|
||||
public enum TextEffect
|
||||
{
|
||||
None,
|
||||
Bevel,
|
||||
Emboss,
|
||||
Engrave
|
||||
}
|
||||
public hLabel()
|
||||
{
|
||||
SetStyle(ControlStyles.SupportsTransparentBackColor |
|
||||
ControlStyles.AllPaintingInWmPaint |
|
||||
ControlStyles.UserPaint |
|
||||
ControlStyles.ResizeRedraw |
|
||||
ControlStyles.OptimizedDoubleBuffer, true);
|
||||
|
||||
BackColor = Color.Transparent;
|
||||
Size = new Size(200, 50); // Varsayılan boyut
|
||||
UpdateSize();
|
||||
}
|
||||
|
||||
// Properties
|
||||
[Browsable(true)]
|
||||
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
|
||||
public override string Text
|
||||
{
|
||||
get { return _text; }
|
||||
set
|
||||
{
|
||||
_text = value ?? "";
|
||||
UpdateSize();
|
||||
Invalidate();
|
||||
}
|
||||
}
|
||||
|
||||
[Browsable(true)]
|
||||
public override Font Font
|
||||
{
|
||||
get { return _font; }
|
||||
set
|
||||
{
|
||||
_font = value ?? new Font("Segoe UI", 9F);
|
||||
UpdateSize();
|
||||
Invalidate();
|
||||
}
|
||||
}
|
||||
|
||||
[Browsable(true)]
|
||||
public override Color ForeColor
|
||||
{
|
||||
get { return _foreColor; }
|
||||
set
|
||||
{
|
||||
_foreColor = value;
|
||||
Invalidate();
|
||||
}
|
||||
}
|
||||
|
||||
[Browsable(true)]
|
||||
[Category("Appearance")]
|
||||
[Description("Gölge rengi")]
|
||||
public Color ShadowColor
|
||||
{
|
||||
get { return _shadowColor; }
|
||||
set
|
||||
{
|
||||
_shadowColor = value;
|
||||
Invalidate();
|
||||
}
|
||||
}
|
||||
|
||||
[Browsable(true)]
|
||||
[Category("Appearance")]
|
||||
[Description("Gölge uzaklığı")]
|
||||
public int ShadowOffset
|
||||
{
|
||||
get { return _shadowOffset; }
|
||||
set
|
||||
{
|
||||
_shadowOffset = Math.Max(0, value);
|
||||
UpdateSize();
|
||||
Invalidate();
|
||||
}
|
||||
}
|
||||
|
||||
[Browsable(true)]
|
||||
[Category("Appearance")]
|
||||
public ContentAlignment TextAlign
|
||||
{
|
||||
get { return _textAlign; }
|
||||
set
|
||||
{
|
||||
_textAlign = value;
|
||||
Invalidate();
|
||||
}
|
||||
}
|
||||
|
||||
[Browsable(true)]
|
||||
[Category("Layout")]
|
||||
public override bool AutoSize
|
||||
{
|
||||
get { return _autoSize; }
|
||||
set
|
||||
{
|
||||
_autoSize = value;
|
||||
if (_autoSize) UpdateSize();
|
||||
Invalidate();
|
||||
}
|
||||
}
|
||||
|
||||
[Browsable(true)]
|
||||
[Category("Layout")]
|
||||
[Description("Maksimum genişlik")]
|
||||
public int MaxWidth
|
||||
{
|
||||
get { return _maxWidth; }
|
||||
set
|
||||
{
|
||||
_maxWidth = Math.Max(10, value);
|
||||
UpdateSize();
|
||||
Invalidate();
|
||||
}
|
||||
}
|
||||
|
||||
[Browsable(true)]
|
||||
[Category("Appearance")]
|
||||
[Description("Yazı tipi kalitesi")]
|
||||
public TextRenderingHint TextQuality
|
||||
{
|
||||
get { return _textRenderingHint; }
|
||||
set
|
||||
{
|
||||
_textRenderingHint = value;
|
||||
Invalidate();
|
||||
}
|
||||
}
|
||||
|
||||
// Kontur Properties
|
||||
[Browsable(true)]
|
||||
[Category("Appearance")]
|
||||
[Description("Kontur çizgisi çiz")]
|
||||
public bool DrawOutline
|
||||
{
|
||||
get { return _drawOutline; }
|
||||
set
|
||||
{
|
||||
_drawOutline = value;
|
||||
Invalidate();
|
||||
}
|
||||
}
|
||||
|
||||
[Browsable(true)]
|
||||
[Category("Appearance")]
|
||||
[Description("Kontur rengi")]
|
||||
public Color OutlineColor
|
||||
{
|
||||
get { return _outlineColor; }
|
||||
set
|
||||
{
|
||||
_outlineColor = value;
|
||||
Invalidate();
|
||||
}
|
||||
}
|
||||
|
||||
[Browsable(true)]
|
||||
[Category("Appearance")]
|
||||
[Description("Kontur kalınlığı")]
|
||||
public float OutlineWidth
|
||||
{
|
||||
get { return _outlineWidth; }
|
||||
set
|
||||
{
|
||||
_outlineWidth = Math.Max(0.1f, value);
|
||||
Invalidate();
|
||||
}
|
||||
}
|
||||
|
||||
// 3D Efekt Properties
|
||||
[Browsable(true)]
|
||||
[Category("Appearance")]
|
||||
[Description("3D metin efekti")]
|
||||
public TextEffect Effect
|
||||
{
|
||||
get { return _textEffect; }
|
||||
set
|
||||
{
|
||||
_textEffect = value;
|
||||
Invalidate();
|
||||
}
|
||||
}
|
||||
|
||||
[Browsable(true)]
|
||||
[Category("Appearance")]
|
||||
[Description("Bevel aydınlatma rengi")]
|
||||
public Color BevelHighlight
|
||||
{
|
||||
get { return _bevelHighlight; }
|
||||
set
|
||||
{
|
||||
_bevelHighlight = value;
|
||||
Invalidate();
|
||||
}
|
||||
}
|
||||
|
||||
[Browsable(true)]
|
||||
[Category("Appearance")]
|
||||
[Description("Bevel gölge rengi")]
|
||||
public Color BevelShadow
|
||||
{
|
||||
get { return _bevelShadow; }
|
||||
set
|
||||
{
|
||||
_bevelShadow = value;
|
||||
Invalidate();
|
||||
}
|
||||
}
|
||||
|
||||
[Browsable(true)]
|
||||
[Category("Appearance")]
|
||||
[Description("Bevel derinliği")]
|
||||
public int BevelDepth
|
||||
{
|
||||
get { return _bevelDepth; }
|
||||
set
|
||||
{
|
||||
_bevelDepth = Math.Max(1, value);
|
||||
Invalidate();
|
||||
}
|
||||
}
|
||||
|
||||
// Ana çizim metodu
|
||||
protected override void OnPaint(PaintEventArgs e)
|
||||
{
|
||||
if (string.IsNullOrEmpty(_text))
|
||||
return;
|
||||
|
||||
Graphics g = e.Graphics;
|
||||
|
||||
// Yazı tipi kalitesi ayarları
|
||||
g.SmoothingMode = SmoothingMode.HighQuality;
|
||||
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
|
||||
g.CompositingQuality = CompositingQuality.HighQuality;
|
||||
g.TextRenderingHint = _textRenderingHint;
|
||||
|
||||
Rectangle textBounds = GetTextBounds();
|
||||
|
||||
// 3D efektler
|
||||
if (_textEffect != TextEffect.None)
|
||||
{
|
||||
Draw3DText(g, textBounds);
|
||||
}
|
||||
|
||||
// Gölge efekti çiz (sadece efekt yoksa)
|
||||
if (_shadowOffset > 0 && _textEffect == TextEffect.None)
|
||||
{
|
||||
Rectangle shadowBounds = new Rectangle(
|
||||
textBounds.X + _shadowOffset,
|
||||
textBounds.Y + _shadowOffset,
|
||||
textBounds.Width,
|
||||
textBounds.Height);
|
||||
|
||||
using (SolidBrush shadowBrush = new SolidBrush(_shadowColor))
|
||||
{
|
||||
DrawWrappedText(g, _text, _font, shadowBrush, shadowBounds, false);
|
||||
}
|
||||
}
|
||||
|
||||
// Ana metin çiz
|
||||
using (SolidBrush textBrush = new SolidBrush(_foreColor))
|
||||
{
|
||||
DrawWrappedText(g, _text, _font, textBrush, textBounds, _drawOutline);
|
||||
}
|
||||
}
|
||||
|
||||
// 3D efekt çizimi
|
||||
private void Draw3DText(Graphics g, Rectangle bounds)
|
||||
{
|
||||
switch (_textEffect)
|
||||
{
|
||||
case TextEffect.Bevel:
|
||||
DrawBevelText(g, bounds);
|
||||
break;
|
||||
case TextEffect.Emboss:
|
||||
DrawEmbossText(g, bounds);
|
||||
break;
|
||||
case TextEffect.Engrave:
|
||||
DrawEngraveText(g, bounds);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private void DrawBevelText(Graphics g, Rectangle bounds)
|
||||
{
|
||||
// Highlight (sol üst)
|
||||
Rectangle highlightBounds = new Rectangle(
|
||||
bounds.X - _bevelDepth, bounds.Y - _bevelDepth,
|
||||
bounds.Width, bounds.Height);
|
||||
using (SolidBrush highlightBrush = new SolidBrush(_bevelHighlight))
|
||||
{
|
||||
DrawWrappedText(g, _text, _font, highlightBrush, highlightBounds, false);
|
||||
}
|
||||
|
||||
// Shadow (sağ alt)
|
||||
Rectangle shadowBounds = new Rectangle(
|
||||
bounds.X + _bevelDepth, bounds.Y + _bevelDepth,
|
||||
bounds.Width, bounds.Height);
|
||||
using (SolidBrush shadowBrush = new SolidBrush(_bevelShadow))
|
||||
{
|
||||
DrawWrappedText(g, _text, _font, shadowBrush, shadowBounds, false);
|
||||
}
|
||||
}
|
||||
|
||||
private void DrawEmbossText(Graphics g, Rectangle bounds)
|
||||
{
|
||||
// Koyu gölge (sol üst)
|
||||
Rectangle darkBounds = new Rectangle(
|
||||
bounds.X - _bevelDepth, bounds.Y - _bevelDepth,
|
||||
bounds.Width, bounds.Height);
|
||||
using (SolidBrush darkBrush = new SolidBrush(_bevelShadow))
|
||||
{
|
||||
DrawWrappedText(g, _text, _font, darkBrush, darkBounds, false);
|
||||
}
|
||||
|
||||
// Açık highlight (sağ alt)
|
||||
Rectangle lightBounds = new Rectangle(
|
||||
bounds.X + _bevelDepth, bounds.Y + _bevelDepth,
|
||||
bounds.Width, bounds.Height);
|
||||
using (SolidBrush lightBrush = new SolidBrush(_bevelHighlight))
|
||||
{
|
||||
DrawWrappedText(g, _text, _font, lightBrush, lightBounds, false);
|
||||
}
|
||||
}
|
||||
|
||||
private void DrawEngraveText(Graphics g, Rectangle bounds)
|
||||
{
|
||||
// Açık gölge (sol üst)
|
||||
Rectangle lightBounds = new Rectangle(
|
||||
bounds.X - _bevelDepth, bounds.Y - _bevelDepth,
|
||||
bounds.Width, bounds.Height);
|
||||
using (SolidBrush lightBrush = new SolidBrush(_bevelHighlight))
|
||||
{
|
||||
DrawWrappedText(g, _text, _font, lightBrush, lightBounds, false); // false
|
||||
}
|
||||
|
||||
// Ana metin koyu renkte
|
||||
_foreColor = Color.FromArgb(128, _foreColor);
|
||||
}
|
||||
|
||||
// Metin sarma ve çizim
|
||||
private void DrawWrappedText(Graphics g, string text, Font font, Brush brush, Rectangle bounds, bool drawOutline)
|
||||
{
|
||||
StringFormat sf = GetStringFormat();
|
||||
|
||||
if (drawOutline && _outlineWidth > 0)
|
||||
{
|
||||
// Kontur çizmek için GraphicsPath kullan
|
||||
using (GraphicsPath path = new GraphicsPath())
|
||||
{
|
||||
path.AddString(text, font.FontFamily, (int)font.Style,
|
||||
g.DpiY * font.Size / 72, bounds, sf);
|
||||
|
||||
// Kontur çiz
|
||||
using (Pen outlinePen = new Pen(_outlineColor, _outlineWidth))
|
||||
{
|
||||
outlinePen.LineJoin = LineJoin.Round;
|
||||
g.DrawPath(outlinePen, path);
|
||||
}
|
||||
|
||||
// İçini doldur
|
||||
g.FillPath(brush, path);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
g.DrawString(text, font, brush, bounds, sf);
|
||||
}
|
||||
|
||||
sf.Dispose();
|
||||
}
|
||||
|
||||
// Metin hizalama formatı
|
||||
private StringFormat GetStringFormat()
|
||||
{
|
||||
StringFormat sf = new StringFormat();
|
||||
sf.FormatFlags = StringFormatFlags.LineLimit;
|
||||
sf.Trimming = StringTrimming.Word;
|
||||
|
||||
// Yatay hizalama
|
||||
switch (_textAlign)
|
||||
{
|
||||
case ContentAlignment.TopLeft:
|
||||
case ContentAlignment.MiddleLeft:
|
||||
case ContentAlignment.BottomLeft:
|
||||
sf.Alignment = StringAlignment.Near;
|
||||
break;
|
||||
case ContentAlignment.TopCenter:
|
||||
case ContentAlignment.MiddleCenter:
|
||||
case ContentAlignment.BottomCenter:
|
||||
sf.Alignment = StringAlignment.Center;
|
||||
break;
|
||||
case ContentAlignment.TopRight:
|
||||
case ContentAlignment.MiddleRight:
|
||||
case ContentAlignment.BottomRight:
|
||||
sf.Alignment = StringAlignment.Far;
|
||||
break;
|
||||
}
|
||||
|
||||
// Dikey hizalama
|
||||
switch (_textAlign)
|
||||
{
|
||||
case ContentAlignment.TopLeft:
|
||||
case ContentAlignment.TopCenter:
|
||||
case ContentAlignment.TopRight:
|
||||
sf.LineAlignment = StringAlignment.Near;
|
||||
break;
|
||||
case ContentAlignment.MiddleLeft:
|
||||
case ContentAlignment.MiddleCenter:
|
||||
case ContentAlignment.MiddleRight:
|
||||
sf.LineAlignment = StringAlignment.Center;
|
||||
break;
|
||||
case ContentAlignment.BottomLeft:
|
||||
case ContentAlignment.BottomCenter:
|
||||
case ContentAlignment.BottomRight:
|
||||
sf.LineAlignment = StringAlignment.Far;
|
||||
break;
|
||||
}
|
||||
|
||||
return sf;
|
||||
}
|
||||
|
||||
// Metin sınırlarını hesapla
|
||||
private Rectangle GetTextBounds()
|
||||
{
|
||||
int availableWidth = _autoSize ? _maxWidth : Width;
|
||||
int extraSpace = Math.Max(_shadowOffset, _bevelDepth) + (int)_outlineWidth;
|
||||
availableWidth -= extraSpace * 2;
|
||||
|
||||
Rectangle bounds = new Rectangle(extraSpace, extraSpace,
|
||||
Math.Max(1, availableWidth), Height - extraSpace * 2);
|
||||
|
||||
return bounds;
|
||||
}
|
||||
|
||||
// Boyut güncelleme
|
||||
private void UpdateSize()
|
||||
{
|
||||
if (!_autoSize || string.IsNullOrEmpty(_text) || IsDisposed)
|
||||
return;
|
||||
|
||||
try
|
||||
{
|
||||
using (Graphics g = CreateGraphics())
|
||||
{
|
||||
StringFormat sf = GetStringFormat();
|
||||
SizeF textSize = g.MeasureString(_text, _font, _maxWidth, sf);
|
||||
sf.Dispose();
|
||||
|
||||
int extraSpace = Math.Max(_shadowOffset, _bevelDepth) + (int)_outlineWidth;
|
||||
|
||||
Size newSize = new Size(
|
||||
(int)Math.Ceiling(textSize.Width) + extraSpace * 2,
|
||||
(int)Math.Ceiling(textSize.Height) + extraSpace * 2
|
||||
);
|
||||
|
||||
if (Size != newSize)
|
||||
{
|
||||
Size = newSize;
|
||||
}
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
// CreateGraphics bazen başarısız olabilir
|
||||
}
|
||||
}
|
||||
|
||||
protected override void OnResize(EventArgs e)
|
||||
{
|
||||
base.OnResize(e);
|
||||
Invalidate();
|
||||
}
|
||||
|
||||
protected override void SetBoundsCore(int x, int y, int width, int height, BoundsSpecified specified)
|
||||
{
|
||||
if (_autoSize && (specified & BoundsSpecified.Size) != BoundsSpecified.None)
|
||||
{
|
||||
// AutoSize açıkken sadece konum değişikliklerine izin ver
|
||||
base.SetBoundsCore(x, y, Width, Height, BoundsSpecified.Location);
|
||||
}
|
||||
else
|
||||
{
|
||||
base.SetBoundsCore(x, y, width, height, specified);
|
||||
}
|
||||
}
|
||||
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing)
|
||||
{
|
||||
_font?.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user