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