#region Using
using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Data;
using System.Windows.Forms;
#endregion
namespace Wankuma.WindowsForms
{
///
/// 線を常に引くコントロール
///
public class WankumaLine : System.Windows.Forms.UserControl
{
#region public enum enum線パターン
///
/// 線の描画種類
///
public enum enum線パターン
{
///
/// 対角に線を引きます。\
///
対角バックスラッシュ,
///
/// 対角に線を引きます。/
///
対角スラッシュ,
///
/// 水平に線を引きます-
///
水平,
///
/// 垂直に線を引きます。|
///
垂直
}
#endregion
#region メンバ
#region private float _線幅;
///
/// 線幅のメンバ
///
private float _線幅;
#endregion
#region public float 線幅
///
/// 描画する線幅を指定する
///
[DefaultValue(1.0F)]
public float 線幅
{
set
{
if ( value < 1.0 )
{
this._線幅 = 1.0F;
}
else
{
this._線幅 = value;
}
}
get
{
return this._線幅;
}
}
#endregion
#region private enum線パターン _pattern;
///
/// 線のパターン
///
private enum線パターン _pattern;
#endregion
#region public enum線パターン 線パターン
///
/// 線のパターン
///
[DefaultValue(enum線パターン.対角バックスラッシュ)]
public enum線パターン 線パターン
{
set
{
this._pattern = value;
}
get
{
return this._pattern;
}
}
#endregion
#endregion
#region 自動生成
///
/// 必要なデザイナ変数です。
///
private System.ComponentModel.Container components = null;
///
/// コンストラクタ
///
public WankumaLine()
{
// この呼び出しは、Windows.Forms フォーム デザイナで必要です。
InitializeComponent();
// TODO: InitializeComponent 呼び出しの後に初期化処理を追加します。
SetStyle(ControlStyles.ResizeRedraw, true);
this._線幅 = 1.0F;
}
///
/// 使用されているリソースに後処理を実行します。
///
protected override void Dispose( bool disposing )
{
if( disposing )
{
if(components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region コンポーネント デザイナで生成されたコード
///
/// デザイナ サポートに必要なメソッドです。このメソッドの内容を
/// コード エディタで変更しないでください。
///
private void InitializeComponent()
{
//
// WankumaLine
//
this.Name = "WankumaLine";
}
#endregion
#endregion
#region protected override void OnPaint(PaintEventArgs e)
///
/// 描画処理
///
///
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint (e);
//線パターンにあわせて描画する。
if ( this._pattern == enum線パターン.水平 || this._pattern == enum線パターン.垂直 )
{
using ( SolidBrush sb = new SolidBrush(this.ForeColor) )
{
//xy等を調べる
float x = e.Graphics.VisibleClipBounds.X;
float y = e.Graphics.VisibleClipBounds.Y;
float width = e.Graphics.VisibleClipBounds.Width;
float height = e.Graphics.VisibleClipBounds.Height;
float width2 = x + this._線幅 > width ? width : x + this._線幅;
float height2 = y + this._線幅 > height ? height : y + this._線幅;
//線を描画する
//線パターンにあわせて描画する。
if ( this._pattern == enum線パターン.水平 )
{
//上辺
e.Graphics.FillRectangle(sb, x, y, width, height2);
}
else if ( this._pattern == enum線パターン.垂直)
{
//左辺
e.Graphics.FillRectangle(sb, x, y, x + width2, height);
}
}
}
else if ( this._pattern == enum線パターン.対角バックスラッシュ || this._pattern == enum線パターン.対角スラッシュ )
{
using ( Pen pen = new Pen(this.ForeColor, this._線幅) )
{
//線の端をスクエアにする
pen.StartCap = LineCap.Square;
//xy等を調べる
float x = e.Graphics.VisibleClipBounds.X;
float y = e.Graphics.VisibleClipBounds.Y;
float width = e.Graphics.VisibleClipBounds.Width;
float height = e.Graphics.VisibleClipBounds.Height;
//線パターンにあわせて描画する。
if ( this._pattern == enum線パターン.対角バックスラッシュ )
{
e.Graphics.DrawLine(pen, x, y, width, height);
}
else if ( this._pattern == enum線パターン.対角スラッシュ )
{
e.Graphics.DrawLine(pen, width, y, x, height);
}
}
}
}
#endregion
}//class
}//namespace