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ベースで描画するよう変更した。