今度はC#めも

この記事は最終更新日から 21 年以上が経過しています。

さてさて、今日はC#。

あるコントロールの周りに枠を付けたいと思いました。

さて、どうしよう。

まず、Panelコントロールを置き、そのBorderStyleプロパティの値を、FixedSingleかFixed3Dにすることで、枠を作ります。
FixedSingleは実線の枠。Fixed3Dは凹んだように見える枠です。
そして、その中に目的のコントロールを置いて、DockプロパティをFillにすれば、はい完成。

なのですが、僕が作りたいのは出っ張って見える凸枠でした。
Panel以外にも、GroupBoxやLabelなど、色々試してみたのですが、どれも凹むだけで出っ張ってくれません。

こうなりゃ自分で描くかー!!
ってことで、Panelの描画部分をオーバーライドして、そこで自分で線を引くことにしました。

public class ConvexPanel : System.Windows.Forms.Panel
{
    private System.ComponentModel.Container components = null;

    public ConvexPanel() {
        InitializeComponent();
    }

    protected override void Dispose( bool disposing ) {
        if( disposing ) {
            if(components != null) {
                components.Dispose();
            }
        }
        base.Dispose( disposing );
    }

    private void InitializeComponent() {
        // ConvexPanel
        this.Name = "ConvexPanel";
        this.DockPadding.All = 1;   // 枠が隠れないように
    }

    protected override void OnPaint(PaintEventArgs e) {
        base.OnPaint (e);
        if (!this.Visible) return;

        Graphics g = e.Graphics;
        Pen pen;
        int r = this.ClientRectangle.Right - 1;
        int b = this.ClientRectangle.Bottom - 1;

        pen = new Pen(SystemColors.ControlLightLight);  // 光
        g.DrawLine(pen, 0, 0, r, 0);  // 上
        g.DrawLine(pen, 0, 0, 0, b);  // 左

        pen = new Pen(SystemColors.ControlDark);    // 影
        g.DrawLine(pen, r, 0, r, b);  // 右
        g.DrawLine(pen, 0, b, r, b);  // 下
    }
}

OnPaint より前の部分(InitializeComponent まで)は全部デザイナが勝手に作ってくれました。
らくちんらくちん。

で、これと同じようにスクロールバーもかっちょいいデザインに変更できないかな~って思ったんだけど、ダメでした。
どうもOnPaintメソッドが呼ばれないっぽい。
とはいえ完全自作はめんどっちぃし、もうちょっと研究してみるか。