.NET Frameworkでお手軽SplitButton・その1

 Visual Studio 2008で提供されるVisual C++向けライブラリ「MFC 9.0」では追加されることになりましたが、.NET Frameworkではまだまだ搭載されそうにない、ボタンを押すと拡張メニューが表示されるスプリットボタン。今回は.NET Framework 2.0既存のクラスを用いて簡単にスプリットボタンを作成する方法をご紹介します。

1:チェックボックスの派生クラスを作成
ドロップダウンメニューが表示されているときはボタンをへこます処理をボタンスタイルのチェックボックスで行います。
checkbox.cs
public class AnchorButton : CheckBox
{
    public AnchorButton()
    {
        his.Appearance = Appearance.Button;
    }
}
2:三角マークを描画
 コンボボックスでみられる、下向きの三角矢印はGraphics.FillPorygon()といった線画ではなく、この記号は実は文字。システム標準搭載の「Marlett」というフォントの「6」をGraphics.DrawString()で描画すると、この記号が表示されるのです。

 派生したクラス内に以下のメソッドをオーバーライドさせ、1行目に「base.OnPaint()」を入れておけば、ベースとなるボタンの描画はシステムが勝手にやってくれるので、実装する側は分割線と三角記号を描画するコードだけ記述すればOKです。
drawtri.cs
protected override void OnPaint(PaintEventArgs pevent)
{
    base.OnPaint(pevent);

    Rectangle rc = ClientRectangle;
    rc.X = rc.Right - rc.Height;
    rc.Width = ClientRectangle.Right - rc.Left;

    Graphics g = pevent.Graphics;

    // 三角マークの描画
    SolidBrush brush = new SolidBrush(SystemColors.ControlText);
    StringFormat sf = StringFormat.GenericDefault;
    sf.Alignment = StringAlignment.Center;
    sf.LineAlignment = StringAlignment.Center;

    Font font = new Font("Marlett", Font.Size);
    SizeF sz = g.MeasureString("6", font);
    g.DrawString("6", font, brush,
         rc.Left + (rc.Width - sz.Width) / 2.0f,
         2 + rc.Top + (rc.Height - sz.Height) / 2.0f);
    brush.Dispose();

    // 分割線の描画
    Pen pen = new Pen(SystemColors.ControlDark);
    g.DrawLine(pen, rc.X, rc.Top + 4, rc.X, rc.Bottom - 4);
    pen.Dispose();
}
後編は次回にて紹介。
2007/10/24