この記事では、カスタム Windows フォーム コントロールを作成する方法について説明します。 この記事で開発した単純なコントロールは、コントロールの Text をコントロールの左、中央、または右に出力します。 テキストの配置は変更できます。 このコントロールでは、イベントの発生や処理は行われません。
この記事では、次の方法について説明します。
- テキストの水平方向の配置設定を処理するプロパティとフィールドを追加します。
-
OnTextChangedを使用してコントロールを無効にします。 - コントロールのサーフェイスにテキストを描画するコードを
OnPaintメソッドに指定します。
カスタム コントロールの追加
最初の手順では、プロジェクトにカスタム コントロールを追加します。
Visual Studio で、[ ソリューション エクスプローラー ] ウィンドウを見つけます。 プロジェクトを右クリックし、[ 追加>新しい項目] を選択します。
カスタム コントロールを検索して選択します。
ファイル名を FirstControl に設定し、[ 追加] を選択します。
コントロールの デザイン モードが表示されている場合は、コード ビューに切り替えます。 F7 キーを押すか、コード ビュー への切り替えリンクを選択します。
ヒント
ソリューション エクスプローラー ウィンドウでファイルを右クリックし、[コードの表示] を選択することもできます。
次のスニペットのように、カスタム コントロールのソース コードを確認する必要があります。
public partial class FirstControl : Control
{
public FirstControl()
{
InitializeComponent();
}
protected override void OnPaint(PaintEventArgs pe)
{
base.OnPaint(pe);
}
}
Public Class FirstControl
Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
MyBase.OnPaint(e)
'Add your custom paint code here
End Sub
End Class
プロパティを追加する
TextAlignmentという名前のコントロールに新しいプロパティを作成します。 このプロパティは、テキストがコントロールに描画される場所を調整します。
FirstControl クラスを使用して、次の手順を実行します。
_textAlignment型のHorizontalAlignmentという名前のフィールドを追加します。private HorizontalAlignment _textAlignment = HorizontalAlignment.Left;Private _textAlignment As HorizontalAlignment = HorizontalAlignment.Leftフィールドを
TextAlignmentという名前のプロパティでラップします。 プロパティを設定するときに、Invalidateメソッドを呼び出して、コントロール自体を強制的に再描画します。public HorizontalAlignment TextAlignment { get => _textAlignment; set { _textAlignment = value; Invalidate(); } }Public Property TextAlignment As HorizontalAlignment Get Return _textAlignment End Get Set(value As HorizontalAlignment) _textAlignment = value Invalidate() End Set End Property次の属性をプロパティに追加して、Visual Studio の [プロパティ] ウィンドウと統合します。
Category—プロパティに適用されるカテゴリ。Description—プロパティの説明。DefaultValue—プロパティの既定値。既定値を使用すると、デザイナーによってプロパティを リセット できます。 また、既定値がシリアル化されないため、プロパティを分離コードにシリアル化する必要があるタイミングを判断するのにも役立ちます。
[System.ComponentModel.Category("Alignment"), System.ComponentModel.Description("Specifies the alignment of text."), System.ComponentModel.DefaultValue(HorizontalAlignment.Left)] public HorizontalAlignment TextAlignment<System.ComponentModel.Category("Alignment"), System.ComponentModel.Description("Specifies the alignment of text."), System.ComponentModel.DefaultValue(HorizontalAlignment.Left)> Public Property TextAlignment As HorizontalAlignment
変更されたテキストを処理する
TextAlignment プロパティはInvalidateを呼び出して、コントロール自体を再描画します。 これにより、コントロールの Text をレンダリングするときに、正しい配置が即座に使用されるようになります。 ただし、 Text プロパティが変更された場合、 Text は Invalidateを呼び出さないため、何も更新されません。 ただし、このプロパティは OnTextChanged メソッドを呼び出します。オーバーライドして Invalidate を呼び出し、コントロール自体を強制的に再描画することができます。
FirstControl クラスを使用して、次の手順を実行します。
-
OnTextChangedメソッドをオーバーライドします。 -
base.OnTextChangedを呼び出して、コントロールのコンシューマーが期待するように、TextChangedイベントが発生するようにします。 -
Invalidateメソッドを呼び出して、強制的に再描画します。
コードは次のスニペットのようになります。
protected override void OnTextChanged(EventArgs e)
{
base.OnTextChanged(e);
Invalidate();
}
Protected Overrides Sub OnTextChanged(e As EventArgs)
MyBase.OnTextChanged(e)
Invalidate()
End Sub
コントロールを描画する
カスタム コントロールの最後の部分は描画です。
FirstControl クラスを使用して、次の手順を実行します。
テンプレートによって生成された
OnPaintメソッドを見つけます。 見つからない場合は、基底クラスからオーバーライド(上書き)します。StringFormatという名前の新しいstyle変数を作成します。StringFormat style = new();Dim style As New StringFormatSystem.Drawing.StringFormat型は、テキスト レイアウト情報をカプセル化し、配置へのアクセスを提供します。
TextAlignmentに基づいて、style.Alignmentプロパティを適切な値に設定します。style.Alignment = TextAlignment switch { // Map the HorizontalAlignment enum to the StringAlignment enum HorizontalAlignment.Left => StringAlignment.Near, HorizontalAlignment.Right => StringAlignment.Far, HorizontalAlignment.Center => StringAlignment.Center, // Default to Near alignment _ => StringAlignment.Near };'Map the HorizontalAlignment enum to the StringAlignment enum Select Case TextAlignment Case HorizontalAlignment.Left style.Alignment = StringAlignment.Near Case HorizontalAlignment.Right style.Alignment = StringAlignment.Far Case HorizontalAlignment.Center style.Alignment = StringAlignment.Center End SelectTextを使用してGraphics.DrawStringプロパティを描画します。// Create the brush and automatically dispose it. using SolidBrush foreBrush = new(ForeColor); // Call the DrawString method to write text. // Text, Font, and ClientRectangle are inherited properties. pe.Graphics.DrawString(Text, Font, foreBrush, ClientRectangle, style);'Create the brush and automatically dispose it. Using foreBrush As New SolidBrush(ForeColor) 'Call the DrawString method to write text. 'Text, Font, and ClientRectangle are inherited properties. e.Graphics.DrawString(Text, Font, foreBrush, ClientRectangle, style) End Using重要
Graphics.DrawStringメソッドは、テキストの色にBrushを使用します。Brushes使用後に廃棄する必要があります。Graphics.DrawString メソッドでは、文字列を描画するために、テキスト、フォント、色、および書式設定オプションを使用します。
base.OnPaintを呼び出して、Paintイベントが発生していることを確認します。base.OnPaint(pe);MyBase.OnPaint(e)コード ファイルを保存し、プロジェクトをコンパイルします。 プロジェクトのコンパイル後、Visual Designer を開くと、Visual Studio によってカスタム コントロールがツールボックス ウィンドウに追加されます。
コードは次のスニペットのようになります。
public partial class FirstControl : Control
{
private HorizontalAlignment _textAlignment = HorizontalAlignment.Left;
[System.ComponentModel.Category("Alignment"),
System.ComponentModel.Description("Specifies the alignment of text."),
System.ComponentModel.DefaultValue(HorizontalAlignment.Left)]
public HorizontalAlignment TextAlignment
{
get => _textAlignment;
set
{
_textAlignment = value;
Invalidate();
}
}
public FirstControl()
{
InitializeComponent();
}
protected override void OnTextChanged(EventArgs e)
{
base.OnTextChanged(e);
Invalidate();
}
protected override void OnPaint(PaintEventArgs pe)
{
StringFormat style = new();
style.Alignment = TextAlignment switch
{
// Map the HorizontalAlignment enum to the StringAlignment enum
HorizontalAlignment.Left => StringAlignment.Near,
HorizontalAlignment.Right => StringAlignment.Far,
HorizontalAlignment.Center => StringAlignment.Center,
// Default to Near alignment
_ => StringAlignment.Near
};
// Create the brush and automatically dispose it.
using SolidBrush foreBrush = new(ForeColor);
// Call the DrawString method to write text.
// Text, Font, and ClientRectangle are inherited properties.
pe.Graphics.DrawString(Text, Font, foreBrush, ClientRectangle, style);
base.OnPaint(pe);
}
}
Public Class FirstControl
Private _textAlignment As HorizontalAlignment = HorizontalAlignment.Left
<System.ComponentModel.Category("Alignment"),
System.ComponentModel.Description("Specifies the alignment of text."),
System.ComponentModel.DefaultValue(HorizontalAlignment.Left)>
Public Property TextAlignment As HorizontalAlignment
Get
Return _textAlignment
End Get
Set(value As HorizontalAlignment)
_textAlignment = value
Invalidate()
End Set
End Property
Protected Overrides Sub OnTextChanged(e As EventArgs)
MyBase.OnTextChanged(e)
Invalidate()
End Sub
Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
Dim style As New StringFormat
'Map the HorizontalAlignment enum to the StringAlignment enum
Select Case TextAlignment
Case HorizontalAlignment.Left
style.Alignment = StringAlignment.Near
Case HorizontalAlignment.Right
style.Alignment = StringAlignment.Far
Case HorizontalAlignment.Center
style.Alignment = StringAlignment.Center
End Select
'Create the brush and automatically dispose it.
Using foreBrush As New SolidBrush(ForeColor)
'Call the DrawString method to write text.
'Text, Font, and ClientRectangle are inherited properties.
e.Graphics.DrawString(Text, Font, foreBrush, ClientRectangle, style)
End Using
MyBase.OnPaint(e)
End Sub
End Class
関連コンテンツ
.NET Desktop feedback