これまでにタイトルバー、タブバー、エクスプローラーのスクロールバーなどなど色々弄ってきたのですが、別にオリジナルティを出したいわけではなく、できる限り Windows 標準の見た目で色を統一したいだけなんですよね。
カラーテーマもダークモードやハイコントラストテーマなんかにも対応したのですが、どうもステータスバーのグリップの色は変えられないみたいなのと、メモ帳なんかと見た目が若干違うので、今回ステータスバーのグリップの見た目と色を修正してみました。
メモ帳と.NET標準のステータスバーのグリップの違い
左が Windows10 のメモ帳のステータスバーのグリップで右が .NET 標準のグリップです。更に赤で塗っているのが、StatusStrip の SizeGripBounds プロパティで公開されているサイズ変更ハンドル(グリップ)の境界です。.NET の場合はグレーとホワイトの2色で構成されていています。
標準の描画が境界をはみ出すんかい!って思いましたが、あくまで境界なんでありなんでしょう…。ちなみに境界はデフォルトでは縦が22px、横が12pxのようです。
描画自体は ToolStripProfessionalRenderer クラスの OnRenderStatusStripSizingGrip メソッドで描画されています。
ステータスバーのグリップを変更する方法
ToolStripProfessionalRenderer を継承して、OnRenderStatusStripSizingGrip をオーバーライドして行います。今回はメモ帳のように変更してみました。
public class ProfessionalRenderer : ToolStripProfessionalRenderer {
private static Rectangle[] sizeGripRectangles = {
new Rectangle(10,4,2,2),
new Rectangle(7,7,2,2),
new Rectangle(7,4,2,2),
new Rectangle(4,10,2,2),
new Rectangle(4,7,2,2),
new Rectangle(4,4,2,2)};
/// <summary>
/// OnRenderStatusStripSizingGrip
/// </summary>
/// <param name="e"></param>
protected override void OnRenderStatusStripSizingGrip(ToolStripRenderEventArgs e) {
Graphics g = e.Graphics;
StatusStrip statusStrip = e.ToolStrip as StatusStrip;
if (statusStrip == null) {
return;
}
Rectangle[] rectangles = new Rectangle[sizeGripRectangles.Length];
for (int i = 0; i < sizeGripRectangles.Length; i++) {
Rectangle baseRect = sizeGripRectangles[i];
baseRect.X = e.ToolStrip.Width - baseRect.X;
baseRect.Y = e.ToolStrip.Height - baseRect.Y;
rectangles[i] = baseRect;
}
g.FillRectangles(SystemBrushes.ButtonShadow, rectangles);
}
}
変更後
左から順位にメモ帳、修正前、修正後の標準、ダークモード、ハイコントラストテーマのステータスバーのグリップです。変更する必要ある?って感じですが、より標準に近づきました。
おわりに
簡単にステータスバーのグリップも変更することができます。標準の見た目が気に入らない方はカスタマイズしてみるのはいかがでしょうか?
当然自作したWindows Forms 用のコントロールのステータスバーもカスタマイズ済みです。
コメント