そこで、Panelクラスの利用を考えます。Panelクラスは元々は、コントロールのコレクションをグループ化するためのものです。
フォーム上に、ツールバー、ステータスバー、パネルを作ります。これで、フォームのクライアント領域を完全に覆い尽くします。
これには、PanelクラスのDockプロパティをDockStyle.Fillに設定しておきます。 これで、フォームのサイズが変更になっても大丈夫です。
また、PanelクラスのAutoScrollプロパティをtrueにしておくと、自動的にスクロールバーが表示されます。ただし、直接Panelクラスに文字等を表示してはうまくいきません。
これを解消するためには、Panelの上にLabelを貼り付けます。
LabelクラスのAutoSizeプロパティをtrueにしておくと、サイズが自動調整されます。
LabelのTextプロパティに表示したい文字列を指定します。
さて、この章で作るプログラムを先に見ておきます。
メニュー、ツールバー、ステータスバーを持っています。
ステータスバーには、現在時刻が表示されています。 メニューから、何も選択されていないと「待機中」と表示されます。
メニュー項目が選択されると、その説明がステータスバーに表示されます。
メニュー項目が実行されたり、ボタンを押したりすると、その内容が表示されます。
表示しきれないときは、スクロールバーが出現します。
ツールバー・ボタンにマウスをポイントすると、ツールチップが出ます。
ツールバーボタンは、フラットにしたり、文字を右に表示したりできます。
では、プログラムを見てみましょう。
// toolbar03.cs using System; using System.Drawing; using System.Windows.Forms; class toolbar03 : Form { MenuItem miFile, miEnd, miEdit, miView, miSearch, miOpen, miCut, miDelete, miHelp, miFlat, miNormal, miRight, miUnder; ToolBar tb; ToolBarButton tbbOpen, tbbCut, tbbDelete, tbbSearch, tbbHelp; StatusBar sb; StatusBarPanel sbp0, sbp1, sbp2; Panel pnl; String str = ""; Font font; Label label; public static void Main() { Application.Run(new toolbar03()); } public toolbar03() { Text = "猫でもわかるC#プログラミング"; BackColor = SystemColors.Window; MakeMenu(); MakePanel(); MakeToolbar(); MakeStatusbar(); Timer timer = new Timer(); timer.Interval = 500; timer.Tick += new EventHandler(timer_Tick); timer.Start(); miNormal.Enabled = false; miUnder.Enabled = false; } void timer_Tick(object sender, EventArgs e) { DateTime dt = DateTime.Now; String strtime = String.Format("{0:00}:{1:00}:{2:00}", dt.Hour, dt.Minute, dt.Second); sbp2.Text = strtime; } void MakeMenu() { MainMenu mm = new MainMenu(); Menu = mm; miFile = new MenuItem(); miFile.Text = "ファイル(&F)"; mm.MenuItems.Add(miFile); miOpen = new MenuItem(); miOpen.Text = "開く(&O)"; miOpen.Click += new EventHandler(miOpen_Click); miOpen.Select += new EventHandler(miOpen_Select); miFile.MenuItems.Add(miOpen); miEnd = new MenuItem(); miEnd.Text = "終了(&X)"; miEnd.Click += new EventHandler(miEnd_Click); miEnd.Select += new EventHandler(miEnd_Select); miFile.MenuItems.Add(miEnd); miEdit = new MenuItem(); miEdit.Text = "編集(&E)"; mm.MenuItems.Add(miEdit); miCut = new MenuItem(); miCut.Text = "切り取り(&T)"; miCut.Click += new EventHandler(miCut_Click); miCut.Select += new EventHandler(miCut_Select); miEdit.MenuItems.Add(miCut); miDelete = new MenuItem(); miDelete.Text = "削除(&D)"; miDelete.Click += new EventHandler(miDelete_Click); miDelete.Select += new EventHandler(miDelete_Select); miEdit.MenuItems.Add(miDelete); miSearch = new MenuItem(); miSearch.Text = "検索(&F)"; miSearch.Click += new EventHandler(miSearch_Click); miSearch.Select += new EventHandler(miSearch_Select); miEdit.MenuItems.Add(miSearch); miView = new MenuItem(); miView.Text = "表示(&V)"; mm.MenuItems.Add(miView); miFlat = new MenuItem(); miFlat.Text = "フラット"; miFlat.Click += new EventHandler(miFlat_Click); miFlat.Select += new EventHandler(miFlat_Select); miView.MenuItems.Add(miFlat); miNormal = new MenuItem(); miNormal.Text = "従来型"; miNormal.Click += new EventHandler(miNormal_Click); miNormal.Select += new EventHandler(miNormal_Select); miView.MenuItems.Add(miNormal); miRight = new MenuItem(); miRight.Text = "文字の右側表示"; miRight.Click += new EventHandler(miRight_Click); miRight.Select += new EventHandler(miRight_Select); miView.MenuItems.Add(miRight); miUnder = new MenuItem(); miUnder.Text = "文字の下方表示"; miUnder.Click += new EventHandler(miUnder_Click); miUnder.Select += new EventHandler(miUnder_Select); miView.MenuItems.Add(miUnder); miHelp = new MenuItem(); miHelp.Text = "ヘルプ"; miHelp.Click += new EventHandler(miHelp_Click); mm.MenuItems.Add(miHelp); } void MakePanel() { pnl = new Panel(); pnl.Parent = this; pnl.BackColor = Color.Yellow; pnl.Dock = DockStyle.Fill; pnl.AutoScroll = true; pnl.BorderStyle = BorderStyle.Fixed3D; font = new Font("MS ゴシック", 20); label = new Label(); label.Parent = pnl; label.AutoSize = true; label.Font = font; } void MakeToolbar() { tb = new ToolBar(); tb.Parent = this; ImageList iList = new ImageList(); Bitmap btm = new Bitmap(GetType(), "toolbar03.tool03.bmp"); iList.Images.AddStrip(btm); iList.TransparentColor = Color.Red; tb.ImageList = iList; tb.ShowToolTips = true; tb.ButtonClick += new ToolBarButtonClickEventHandler(tb_ButtonClick); tbbOpen = new ToolBarButton(); tbbOpen.Text = "開く"; tbbOpen.ToolTipText = "ファイルを開きます"; tbbOpen.Tag = miOpen; tbbOpen.ImageIndex = 0; tb.Buttons.Add(tbbOpen); tbbCut = new ToolBarButton(); tbbCut.Text = "切り取り"; tbbCut.ToolTipText = "切り取ります"; tbbCut.Tag = miCut; tbbCut.ImageIndex = 1; tb.Buttons.Add(tbbCut); tbbDelete = new ToolBarButton(); tbbDelete.Text = "削除"; tbbDelete.ToolTipText = "削除します"; tbbDelete.Tag = miDelete; tbbDelete.ImageIndex = 2; tb.Buttons.Add(tbbDelete); tbbSearch = new ToolBarButton(); tbbSearch.Text = "検索"; tbbSearch.ToolTipText = "検索します"; tbbSearch.Tag = miSearch; tbbSearch.ImageIndex = 3; tb.Buttons.Add(tbbSearch); tbbHelp = new ToolBarButton(); tbbHelp.Text = "ヘルプ"; tbbHelp.ToolTipText = "ヘルプを表示します"; tbbHelp.Tag = miHelp; tbbHelp.ImageIndex = 4; tb.Buttons.Add(tbbHelp); } void MakeStatusbar() { sb = new StatusBar(); sb.Parent = this; sb.ShowPanels = true; sbp0 = new StatusBarPanel(); sbp0.AutoSize = StatusBarPanelAutoSize.Contents; sb.Panels.Add(sbp0); sbp0.Text = "待機中..."; sbp1 = new StatusBarPanel(); sbp1.AutoSize = StatusBarPanelAutoSize.Spring; sb.Panels.Add(sbp1); sbp2 = new StatusBarPanel(); sbp2.AutoSize = StatusBarPanelAutoSize.Contents; sb.Panels.Add(sbp2); } void miOpen_Select(object sender, EventArgs e) { sbp0.Text = "ファイルを開きます"; } void miEnd_Select(object sender, EventArgs e) { sbp0.Text = "このプログラムを終了します"; } void miCut_Select(object sender, EventArgs e) { sbp0.Text = "切り取ります"; } void miDelete_Select(object sender, EventArgs e) { sbp0.Text = "削除します"; } void miSearch_Select(object sender, EventArgs e) { sbp0.Text = "検索します"; } void miFlat_Select(object sender, EventArgs e) { sbp0.Text = "ツールバーボタンをフラットにします"; } void miNormal_Select(object sender, EventArgs e) { sbp0.Text = "ツールバーボタンを従来型にします"; } void miRight_Select(object sender, EventArgs e) { sbp0.Text = "ボタンの文字を右側に表示します"; } void miUnder_Select(object sender, EventArgs e) { sbp0.Text = "ボタンの文字を下方に表示します"; } void miOpen_Click(object sender, EventArgs e) { str += "開くが選択されました\n"; label.Text = str; } void miEnd_Click(object sender, EventArgs e) { Close(); } void miCut_Click(object sender, EventArgs e) { str += "切り取りが選択されました\n"; label.Text = str; } void miDelete_Click(object sender, EventArgs e) { str += "削除が選択されました\n"; label.Text = str; } void miSearch_Click(object sender, EventArgs e) { str += "検索が選択されました\n"; label.Text = str; } void miFlat_Click(object sender, EventArgs e) { tb.Appearance = ToolBarAppearance.Flat; miFlat.Enabled = false; miNormal.Enabled = true; } void miNormal_Click(object sender, EventArgs e) { tb.Appearance = ToolBarAppearance.Normal; miFlat.Enabled = true; miNormal.Enabled = false; } void miRight_Click(object sender, EventArgs e) { tb.TextAlign = ToolBarTextAlign.Right; miUnder.Enabled = true; miRight.Enabled = false; } void miUnder_Click(object sender, EventArgs e) { tb.TextAlign = ToolBarTextAlign.Underneath; miUnder.Enabled = false; miRight.Enabled = true; } void miHelp_Click(object sender, EventArgs e) { str += "ヘルプが選択されました\n"; label.Text = str; } void tb_ButtonClick(object sender, ToolBarButtonClickEventArgs e) { ToolBarButton tbb = e.Button; MenuItem mi = (MenuItem)tbb.Tag; mi.PerformClick(); } protected override void OnMenuComplete(EventArgs e) { base.OnMenuComplete(e); sbp0.Text = "準備中..."; } }さて、黄色く見えているのは、PanelのBackColorです。Labelはどういう状態になっているのか知りたいときは、LabelのBackColorを別な色に指定するとよくわかります。
これは、LabelのBackColorを青にしてみました。
ちょっと長いですが、順番に見ていくと、どうということもありませんね。
Update 31/May/2007 By Y.Kumei