C# Programming

StatusBar

開発環境: Visual Studio 2003

1.目次

2.目的

ステータスバーの中にプログレスバーを表示する方法について
.Net/C# eGroup で深川さんからおしえていただいた方法をまとめてみました。感謝!

元ネタはこちらです。
http://www.egroups.co.jp/message/dotnet-csharp/484

できあがりは、こんな感じ。
Image

3.参考

(1) .Net/C# eGroup No.484 スレッド  http://www.egroups.co.jp/message/dotnet-csharp/484

4.ステータスバーの作り方


手順説明
Step1Visual Studio でツールバーより StatusBar を貼り付ける。
Image
Step2コンパイルして実行すると、次のようになります。
statusBar1 の文字列は、ステータスバーのプロパティの Text で変更できます。
Image

これだけでは、味も素っ気も無いので、もうちょっと見た目を良くします。

手順説明
Step3StatusBar のプロパティで、SHowPanels を True にします。
そして、Panels プロパティのコレクションの右にある ... ボタンを押します。
Image
Step4すると、StatusBarPanel コレクションエディタが開くので、パネルを3つ追加します。
Image
Step5コンパイルして実行すると、次のようになります。
Image
Step6このままだと、ウィンドウをリサイズしてもステータスバーのパネルの大きさは変わりません。
ウィンドウをリサイズしたときに自動的にパネルの大きさを変えるには、StatusBar コレクションエディタで、
パネルの AutoSize プロパティで Sprint にすると、自動的にウィンドウのサイズまでパネルが広がってくれます。
また、Contents にすると、Panel の表示内容にしたがって、自動的にリサイズしてくれます。
Image
Step7statusBarPanel2 を AutoSize を Contents, StatusBarPanel3 を Sprint にした場合の実行結果です。
Image

5.ステータスバーの中にプログレスバーを表示する。

.Net/C# eGroup で深川さんからおしえていただいた方法をまとめてみました。感謝!
その方法について説明します。

元ネタはこちらです。
http://www.egroups.co.jp/message/dotnet-csharp/484
手順説明
Step8ツールバーより、ProgressBar を Drag & Drop します。場所はどこに配置してもOKです。
Image
Step9次に、StatusBarPanel コレクションエディタで、プログレスバーを配置したいパネルの Style を OwnerDraw にします。
ここでは、statusBarPanel3 の Style プロパティを OwnerDraw にします。
Image
Step10次に、ステータスバーの DrawItem イベントハンドラーに OnDrawItem を追加します。

Image
Step11この OnDrawItem は、ステータスバーの各パネルのオーナー描画が必要となった場合にコールされます。
そのときに、statusBarPanel3 のエリアに ProgressBar を表示してあげればOKです。
そこで、次のようなコードを OnDrawItem に追加します。
このとき、OwnerDraw を設定しているパネルすべてにこのイベントが発生するので、プログレスバーを追加するパネルの
ときだけ、パネルの位置にあわせてプログレスバーの境界を調整します。
        private void OnDrawItem(object sender,  
                System.Windows.Forms.StatusBarDrawItemEventArgs sbdevent)
        {
            if (sbdevent.Panel == this.statusBarPanel3)
            {
                StatusBar sb = (StatusBar)sender;
                Rectangle rect = sbdevent.Bounds;
                this.progressBar1.SetBounds(sb.Location.X + rect.X, sb.Location.Y + rect.Y, 
                    rect.Width, rect.Height);
            }
        }
Step12あとは、コンパイル&実行すると、次のようにステータスバーにプログレスバーが表示されます。
Image

6.ソースコード

2003/1/18 初版作成
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

namespace StatusBarTest
{
        /// <summary>
        /// Form1 の概要の説明です。
        /// </summary>
        public class Form1 : System.Windows.Forms.Form
        {
        private System.Windows.Forms.StatusBar statusBar1;
        private System.Windows.Forms.StatusBarPanel statusBarPanel1;
        private System.Windows.Forms.StatusBarPanel statusBarPanel2;
        private System.Windows.Forms.StatusBarPanel statusBarPanel3;
        private System.Windows.Forms.ProgressBar progressBar1;
                /// <summary>
                /// 必要なデザイナ変数です。
                /// </summary>
                private System.ComponentModel.Container components = null;

                public Form1()
                {
                        //
                        // Windows フォーム デザイナ サポートに必要です。
                        //
                        InitializeComponent();

                        //
                        // TODO: InitializeComponent 呼び出しの後に、コンストラクタ コードを追加してください。
                        //
                }

                /// <summary>
                /// 使用されているリソースに後処理を実行します。
                /// </summary>
                protected override void Dispose( bool disposing )
                {
                        if( disposing )
                        {
                                if (components != null) 
                                {
                                        components.Dispose();
                                }
                        }
                        base.Dispose( disposing );
                }

                #region Windows Form Designer generated code
                /// <summary>
                /// デザイナ サポートに必要なメソッドです。このメソッドの内容を
                /// コード エディタで変更しないでください。
                /// </summary>
                private void InitializeComponent()
                {
            this.statusBar1 = new System.Windows.Forms.StatusBar();
            this.statusBarPanel1 = new System.Windows.Forms.StatusBarPanel();
            this.statusBarPanel2 = new System.Windows.Forms.StatusBarPanel();
            this.statusBarPanel3 = new System.Windows.Forms.StatusBarPanel();
            this.progressBar1 = new System.Windows.Forms.ProgressBar();
            ((System.ComponentModel.ISupportInitialize)(this.statusBarPanel1)).BeginInit();
            ((System.ComponentModel.ISupportInitialize)(this.statusBarPanel2)).BeginInit();
            ((System.ComponentModel.ISupportInitialize)(this.statusBarPanel3)).BeginInit();
            this.SuspendLayout();
            // 
            // statusBar1
            // 
            this.statusBar1.Location = new System.Drawing.Point(0, 72);
            this.statusBar1.Name = "statusBar1";
            this.statusBar1.Panels.AddRange(new System.Windows.Forms.StatusBarPanel[] {
                                                                                          this.statusBarPanel1,
                                                                                          this.statusBarPanel2,
                                                                                          this.statusBarPanel3});
            this.statusBar1.ShowPanels = true;
            this.statusBar1.Size = new System.Drawing.Size(292, 22);
            this.statusBar1.TabIndex = 0;
            this.statusBar1.Text = "statusBar1";
            this.statusBar1.DrawItem += new System.Windows.Forms.StatusBarDrawItemEventHandler(this.OnDrawItem);
            // 
            // statusBarPanel1
            // 
            this.statusBarPanel1.Text = "statusBarPanel1";
            // 
            // statusBarPanel2
            // 
            this.statusBarPanel2.AutoSize = System.Windows.Forms.StatusBarPanelAutoSize.Contents;
            this.statusBarPanel2.Text = "Contents";
            this.statusBarPanel2.Width = 62;
            // 
            // statusBarPanel3
            // 
            this.statusBarPanel3.AutoSize = System.Windows.Forms.StatusBarPanelAutoSize.Spring;
            this.statusBarPanel3.Style = System.Windows.Forms.StatusBarPanelStyle.OwnerDraw;
            this.statusBarPanel3.Text = "Spring";
            this.statusBarPanel3.Width = 114;
            // 
            // progressBar1
            // 
            this.progressBar1.Location = new System.Drawing.Point(64, 24);
            this.progressBar1.Name = "progressBar1";
            this.progressBar1.TabIndex = 1;
            this.progressBar1.Value = 50;
            // 
            // Form1
            // 
            this.AutoScaleBaseSize = new System.Drawing.Size(5, 12);
            this.ClientSize = new System.Drawing.Size(292, 94);
            this.Controls.AddRange(new System.Windows.Forms.Control[] {
                                                                          this.progressBar1,
                                                                          this.statusBar1});
            this.Name = "Form1";
            this.Text = "Form1";
            ((System.ComponentModel.ISupportInitialize)(this.statusBarPanel1)).EndInit();
            ((System.ComponentModel.ISupportInitialize)(this.statusBarPanel2)).EndInit();
            ((System.ComponentModel.ISupportInitialize)(this.statusBarPanel3)).EndInit();
            this.ResumeLayout(false);

        }
                #endregion

                /// <summary>
                /// アプリケーションのメイン エントリ ポイントです。
                /// </summary>
                [STAThread]
                static void Main() 
                {
                        Application.Run(new Form1());
                }

        private void OnDrawItem(object sender, System.Windows.Forms.StatusBarDrawItemEventArgs sbdevent)
        {
            if (sbdevent.Panel == this.statusBarPanel3)
            {
                StatusBar sb = (StatusBar)sender;
                Rectangle rect = sbdevent.Bounds;
                this.progressBar1.SetBounds(sb.Location.X + rect.X, sb.Location.Y + rect.Y, 
                    rect.Width, rect.Height);
            }
        }
        }
}