.NET 小物置き場

影付きラベル

更新日時 : 2008/10/10 17:40
.NET Framework 2.0 以降で動作します。

影付きのラベルです。
デザインモードで使用します。
AutoSize プロパティがまだ実装されていないので、手動で大きさを調整する必要があります。

このコードは、ソリューションエクスプローラから、
プロジェクトに新しい「ユーザーコントロール」を追加して、
ユーザーコントロールのソースの中に貼り付けて使ってください。
そうすることで、 Form のデザイン時のツールボックスに ShadowLabel コントロールが出現します。

namespace をプロジェクトで使われている名前に変更してから使用してください。



・使用例
影の色をいろいろ変えてみました。
影っていうか、何ピクセルかずらして同じものを描いてるだけなんですけどね…w




ソースコード
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;

namespace Hikipuro.Forms
{
	[Description("影付きラベル")]
	public partial class ShadowLabel : UserControl
	{
		/// <summary>
		/// ラベルから見た影の左右の位置
		/// </summary>
		private int shadowLeft = 2;

		/// <summary>
		/// ラベルから見た影の上下の位置
		/// </summary>
		private int shadowTop = 2;

		/// <summary>
		/// ラベルの影の色
		/// </summary>
		private Color shadowColor = Color.White;

		/// <summary>
		/// ラベルの文字
		/// </summary>
		private string labelText = "Label";

		//---------------------------------------------------------------------
		#region "デザイン時外部公開プロパティ"
		[Category("Appearance")]
		[Browsable(true)]
		[Description("ラベルから見た影の左右の位置")]
		public int ShadowLeft
		{
			get
			{
				return shadowLeft;
			}
			set
			{
				shadowLeft = value;
				Refresh();
			}
		}

		[Category("Appearance")]
		[Browsable(true)]
		[Description("ラベルから見た影の上下の位置")]
		public int ShadowTop
		{
			get
			{
				return shadowTop;
			}
			set
			{
				shadowTop = value;
				Refresh();
			}
		}

		[Category("Appearance")]
		[Browsable(true)]
		[Description("ラベルの影の色")]
		public Color ShadowColor
		{
			get
			{
				return shadowColor;
			}
			set
			{
				shadowColor = value;
				Refresh();
			}
		}

		[Category("Appearance")]
		[Browsable(true)]
		[Description("ラベルの文字")]
		public string LabelText
		{
			get
			{
				return labelText;
			}
			set
			{
				labelText = value;
				Refresh();
			}
		}

		#endregion
		//---------------------------------------------------------------------

		/// <summary>
		/// コンストラクタ
		/// </summary>
		public ShadowLabel()
		{
			InitializeComponent();
		}

		/// <summary>
		/// Paint イベントのオーバーロード
		/// </summary>
		/// <param name="e"></param>
		protected override void OnPaint(PaintEventArgs e)
		{
			Graphics g = e.Graphics;

			// 描画品質設定
			SetSmoothMode(g);

			// ボタンの文字列描画
			DrawText(g, shadowLeft, shadowTop, shadowColor);
			DrawText(g, 0, 0, this.ForeColor);
		}

		//---------------------------------------------------------------------
		#region "プライベートメソッド"

		/// <summary>
		/// 描画品質設定
		/// </summary>
		private void SetSmoothMode(Graphics g)
		{
			g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
			//g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
			g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
		}


		/// <summary>
		/// ボタンの文字列を描画
		/// </summary>
		/// <param name="g"></param>
		/// <returns></returns>
		private void DrawText(Graphics g, int offsetX, int offsetY, Color color)
		{
			// 描画領域の設定
			Rectangle rectangle = new Rectangle(this.Padding.Left + offsetX,
												this.Padding.Top + offsetY,
												this.Width - this.Padding.Left - this.Padding.Right,
												this.Height - this.Padding.Top - this.Padding.Bottom);

			// 文字列が描画領域に収まるように調整
			StringBuilder sb = new StringBuilder();
			StringBuilder sbm = new StringBuilder();

			foreach (char c in labelText)
			{
				sbm.Append(c);
				Size size = TextRenderer.MeasureText(sbm.ToString(), this.Font);

				if (size.Width > rectangle.Width - this.Font.Size)
				{
					sbm.Remove(sbm.Length - 1, 1);
					sbm.Append(c);
					sbm.AppendLine("");
					sb.Append(sbm.ToString());
					sbm = new StringBuilder();
				}
			}
			sb.Append(sbm.ToString());

			// 調整済みの文字列を描画
			TextRenderer.DrawText(g,
				sb.ToString(),
				this.Font,
				rectangle,
				color,
				TextFormatFlags.HorizontalCenter | TextFormatFlags.VerticalCenter);

		}

		#endregion
		//---------------------------------------------------------------------

	}
}