ToolStripPanelにCopyrightを描画する

アセンブリに埋め込まれているCopyright情報は、Aboutダイアログに等に表示することが多いが、フォーム上に常時見せておきたいというリクエストもよくある。コード例はToolStripPanelだが、Paintイベントハンドラを持つコントロールであれば、なんでもいけるだろう。

描画にはGDI+ではなく、.NET2.0から追加された、TextRendererクラスを使用している。

ToolStripPanel toolstripPanel = new ToolStripPanel();
form.Controls.Add(toolstripPanel);
toolstripPanel.Dock = DockStyle.Top;
toolstripPanel.Paint += new PaintEventHandler(
    delegate(Object sender, PaintEventArgs e)
        {
            string copyright = GetAppCopyRight();
            Size textSize = TextRenderer.MeasureText(
                  e.Graphics
                , copyright
                , toolstripPanel.Font);
            Rectangle rect = new Rectangle(
                  toolstripPanel.ClientRectangle.Width - textSize.Width
                , toolstripPanel.Top
                , textSize.Width, textSize.Height);
            TextRenderer.DrawText(
                e.Graphics
                , GetAppCopyRight()
                , toolstripPanel.Font
                , e.ClipRectangle
                , SystemColors.ControlText
                , TextFormatFlags.Right);
        });

〜
public static string GetAppCopyRight()
{
    Assembly mainAssembly = Assembly.GetEntryAssembly();
    string appCopyright = "";
    object[] CopyrightArray =
      mainAssembly.GetCustomAttributes(
        typeof(AssemblyCopyrightAttribute), false);
    if (CopyrightArray != null && CopyrightArray.Length > 0)
    {
        appCopyright =
          ((AssemblyCopyrightAttribute)CopyrightArray[0]).Copyright;
    }
    return appCopyright;
}

こんな時も匿名デリゲートは有難い。昔であればこれ位の改修でもカスタムコントロールを作っていただろうが、その必要は無いのだ。

9/21:修正

このままではクリップ領域に描画するため、他のウインドウに隠れた場合に描画が崩れることが判ったので、コントロールのClientRectangleベースで描画するよう変更した。