- GroupBoxの枠線の色を変更したい
- GroupBoxの枠線を非表示にしたい
って結構やりたい場面は多いと思います。
本記事ではこの2つの方法を紹介します。
【残念】GroupBoxの枠線の色・枠線非表示はプロパティからは変更できない
まず、まっさきにプロパティを見に行くと思います。
でも残念ながら、プロパティには枠線の色を変更する項目は無いんです…。
じゃあどうするの??
という訳で、次項で紹介していきます。
【自作】GroupBoxのユーザーコントローラを作成する
できないなら、自分でコントローラを作っちゃおう!という訳です。
少し面倒ではありませんが、標準のコントローラーでできないなら仕方ありません。
最終的には、こんな感じでGroupBoxの枠線の色を変更することができます!もちろん枠線を非表示にすることもできます!
ユーザーコントロールの作成方法
ユーザーコントロールって何?という方もいるかもしれませんね。
標準のコントローラの機能をちょっと拡張して自分好みのコントロールを作成する!というような感じです。
今回の場合だと標準のGroupBoxをベースに、一部機能を追加(枠線の色を変更できる機能を追加)して新しいコントロールを作る!というわけです。
まずは、ソリューションエクスプローラーでプロジェクトを選択して右クリック→新しい項目を追加します。
ユーザーコントロールを選択して、ファイルを作成します。
そしたら、追加したユーザコントロールファイルのソースコードを表示します。
ソースコードは以下の通り実装します。
※4行目のnamespaceは自分の環境に合わせてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | using System.Drawing; using System.Windows.Forms; namespace Sample2 { class GroupBoxEx : GroupBox { /// <summary> /// コンストラクタ /// </summary> public GroupBoxEx() { // ダブルバッファリングを有効 SetStyle(ControlStyles.DoubleBuffer, true); // グループボックスの描画をオーナードローにする SetStyle(ControlStyles.UserPaint, true); } /// <summary> /// 枠線。 /// </summary> private Color _borderColor = Color.Black; /// <summary> /// 枠線 /// </summary> public Color BorderColor { get { return this._borderColor; } set { this._borderColor = value; } } /// <summary> /// OnPaintイベント /// </summary> /// <param name="e">イベントデータ</param> protected override void OnPaint(PaintEventArgs e) { // テキストサイズを取得 Size tTextSize = TextRenderer.MeasureText(this.Text, this.Font); // グループボックスの領域を取得 Rectangle tBorderRect = e.ClipRectangle; // テキストを考慮(グループボックス枠線がテキスト(高さ)の真ん中に来るように)して枠を描画 tBorderRect.Y += tTextSize.Height / 2; tBorderRect.Height -= tTextSize.Height / 2; ControlPaint.DrawBorder(e.Graphics, tBorderRect, this._borderColor, ButtonBorderStyle.Solid); // テキストを描画 Rectangle tTextRect = e.ClipRectangle; tTextRect.X += 6; // テキストの描画開始位置(X)をグループボックスの領域から6ドットずらす tTextRect.Width = tTextSize.Width; tTextRect.Height = tTextSize.Height; e.Graphics.FillRectangle(new SolidBrush(this.BackColor), tTextRect); e.Graphics.DrawString(this.Text, this.Font, new SolidBrush(this.ForeColor), tTextRect); } } } |
※こちらのstackoverflowの記事[icon name="external-link" class="" unprefixed_class=""]を参考にさせて頂きました。
これにより、BorderColorというプロパティを持った、新しいGroupBoxユーザコントロールが作成できました!
ユーザーコントロールを画面に配置して使ってみる!
ツールボックス(配置したいコントロールを選択するリスト)から、先ほど作成した新しいGroupBoxを選択します。
正しくユーザーコントロールが作成できていると、以下のようにユーザーコントロールが追加されます。これを選びます。
その後は、通常のボタンなどのコントロールと同様に画面に配置します。
※左側が通常のGroupBox、右側が作成したGroupBox
追加したGroupBoxのプロパティを見てみると、あったあった!「BorderColor」の項目が!
ここで希望する色に変更すればOKです!
※ここでは「OrangeRed」を選択しています。
もし枠線を非表示にさせたい、という場合はBorderColorで「Transparent」を選択してあげます。
すると、以下の右側のように枠線が非表示になります!
まとめ
- GroupBoxの枠線の色変更・枠線非表示はプロパティからはできない!
- 枠線の色変更・枠線非表示にしたい場合はユーザーコントロールを作る!