...ing logging 4.0

はてなブログに移行しました。D言語の話とかいろいろ。

DFL: Splitter コントロールのサンプルコード

github.com

Splitter コントロールには最小幅を設定するプロパティがありますが、最大幅を設定するプロパティがないので、サンプルコードでは自前で実装しています。 方法は、Splitter の左又は上にあるパネルのサイズが変更されたときに、所定の最大幅を超えていたら、最大幅まで小さくするようにしています。 WInForms には最大幅を設定するプロパティがあるようですが、DFL には実装されていません(注釈とともにコメントアウントされている)。

使用上の注意としては、Splitter がどのコントロールにドッキングしているかが重要なので、コントロール(ここではパネル)をフォームに登録する順序に気をつけてください。

このサンプルコードでは、パネルに文字を描画するために、paint イベントハンドラに処理を書いています。 WinForms と同じ方法で文字などをコントロールに描画することができています。

import dfl;

version(Have_dfl) // For DUB.
{
}
else
{
    pragma(lib, "dfl.lib");
}

class MainForm : Form
{
    private Splitter _splitter1;
    private Splitter _splitter2;
    private Panel _panel1;
    private Panel _panel2;
    private Panel _panel3;

    this()
    {
        this.text = "Splitter example";
        this.size = Size(300, 300);

        _panel1 = new Panel();
        _panel1.dock = DockStyle.LEFT;
        _panel1.width = 100;
        _panel1.borderStyle = BorderStyle.FIXED_3D;
        _panel1.backColor = Color(255, 255, 255);
        _panel1.resize ~= (Control c, EventArgs e) {
            if (_panel1.width > 250)
            {
                _panel1.width = 250;
            }
        };
        _panel1.paint ~= (Control c, PaintEventArgs e) {
            Graphics g = e.graphics;
            string str = "min=25(default)\nmax=250";
            Font font = new Font("Meiryo UI", 10f);
            Color color = Color(0, 0, 0);
            Size size = g.measureText(str, font);
            g.drawText(str, font, color, Rect(0, 0, size.width, size.height));
        };
        _panel1.parent = this;

        _splitter1 = new Splitter();
        _splitter1.parent = this;

        _panel2 = new Panel();
        _panel2.dock = DockStyle.TOP;
        _panel2.height = 100;
        _panel2.borderStyle = BorderStyle.FIXED_3D;
        _panel2.backColor = Color(255, 255, 255);
        _panel2.resize ~= (Control c, EventArgs e) {
            if (_panel2.height > 120)
            {
                _panel2.height = 120;
            }
        };
        _panel2.paint ~= (Control c, PaintEventArgs e) {
            Graphics g = e.graphics;
            string str = "min=25(default)\nmax=120";
            Font font = new Font("Meiryo UI", 10f);
            Color color = Color(0, 0, 0);
            Size size = g.measureText(str, font);
            g.drawText(str, font, color, Rect(0, 0, size.width, size.height));
        };
        _panel2.parent = this;

        _splitter2 = new Splitter();
        _splitter2.dock = DockStyle.TOP;
        _splitter2.parent = this;

        _panel3 = new Panel();
        _panel3.dock = DockStyle.FILL;
        _panel3.borderStyle = BorderStyle.FIXED_3D;
        _panel3.backColor = Color(255, 255, 255);
        _panel3.parent = this;
    }
}

static this()
{
    Application.enableVisualStyles();
}

void main()
{
    Application.run(new MainForm());
}