以下に示すコントロール、横にラベルが付いた直線に興味があります。同様のコントロールを見つけようとしましたが、グループ ボックスの設定はありませんでした。そのため、代わりにそれを複製する高さ 2 の GroupBox を作成しました。
しかし、これを行うための実際のコントロールまたは設定はありますか? そして、実際のコントロールは何と呼ばれていますか?
Spy ++は、これらが実際には2つの別個のSTATIC
コントロールLabel
であることを示しています( WinFormsのaと同様)。
1つ目は、「ホームページ」という通常の静的テキストコントロールです。
2つ目は、3D線として描画するSS_ETCHEDHORZ
スタイルセットを持っています。残念ながら、このスタイルを設定する機能は、WinForms内からは公開されていません。
質問で指摘したように、コントロールを垂直方向に圧縮したり、コントロールのメソッドをGroupBox
オーバーライドしてクラスを使用して3D境界線を描画したりするなど、同様の外観を実現できるハック/回避策がいくつかあります。それらは機能しますが、私はそれらが好きではありませんでした。OnPaint
Label
ControlPaint
ただし、実際には自分でスタイルを設定して、SS_ETCHEDHORZ
ネイティブUIを正確に複製できるようにすることができます。これがまさにそれを行う小さなクラスです。プロジェクトに追加してコンパイルすると、ツールボックスに「HorizontalRule」という新しいコントロールが表示されます。他のコントロールと同じように使用してください。
public class HorizontalRule : Control
{
private const int FixedHeight = 2;
private const int WS_CHILD = 0x40000000;
private const int WS_VISIBLE = 0x10000000;
private const int SS_ETCHEDHORZ = 0x00000010;
private const int SS_ETCHEDVERT = 0x00000011;
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ClassName = "STATIC";
cp.Style = WS_CHILD | SS_ETCHEDHORZ;
if (this.Visible)
{
cp.Style |= WS_VISIBLE;
}
return cp;
}
}
protected override void SetBoundsCore(int x, int y, int width, int height, BoundsSpecified specified)
{
height = FixedHeight;
base.SetBoundsCore(x, y, width, height, specified);
}
}
また、CodeProjectで、より詳細な情報と追加のサンプルコードを見つけることができます。
私は数年前に同じ問題を抱えていましたが、目的のために線を引くだけでした。
実際、画像の必要な部分 (幅) を表示することであらゆる場合に使用できるように、十分に長い幅の固定線画像を 1 つ使用しました。
それ以来、このソリューションは私にとってうまくいきました。