連載
» 2005年05月13日 05時00分 公開

.NET TIPS:Windowsフォームでコントロールの配置や重なりを調整するには?

[一色政彦,デジタルアドバンテージ]
.NET TIPS
Insider.NET


「.NET TIPS」のインデックス

連載目次

 Windowsフォーム・デザイナでコントロールを追加していくと、意図どおりにレイアウト配置できなかったり、意図どおりの順番でコントロールを重ねられなかったりすることがある。

 例えば、次の画面例のように、左側にTreeViewコントロール(Docプロパティを「Left」に設定)、真ん中にSplitterコントロール、右側にListViewコントロール(Docプロパティを「Fill」に設定)を追加し、最後にStatusBarコントロールを追加すると、StatusBarコントロールが、フォームの最下部に配置されるのではなく、ListViewコントロールの下に配置されてしまう。

Windowsフォームで意図どおりのレイアウト配置ができていない例 Windowsフォームで意図どおりのレイアウト配置ができていない例
TreeViewコントロール(Docプロパティを「Left」に設定)、Splitterコントロール、ListViewコントロール(Docプロパティを「Fill」に設定)、StatusBarコントロールの順でコントロールを追加すると、StatusBarコントロールが、開発者が意図したようにフォームの最下部ではなく、ListViewコントロールの下に配置されてしまう。

 このようなレイアウトになってしまうのは、フォーム上のコントロールの「zオーダー」が正しくないためである。zオーダーとは、フォーム上のコントロールの視覚的な階層構造(=奥行き、z軸)における順番のことだ。これは、コントロールの移動順序を示す「タブ・オーダー」とは異なる(タブ・オーダーについては、「TIPS:Windowsフォームでタブ・オーダーを設定するには?」を参照されたい)。

 zオーダーは、フォームのControlsプロパティに(Addメソッドにより)追加されたコントロールの順番に等しい。例えば上の例で示したフォーム・レイアウトならば、次のようなコードにより、フォームに対してコントロールが追加されているはずだ(C#の場合。「this」はフォーム自身を表す)。

this.Controls.Add(this.statusBar1);
this.Controls.Add(this.listView1);
this.Controls.Add(this.splitter1);
this.Controls.Add(this.treeView1);


 このコードで最初に追加されたコントロールが最前面にあるコントロールとなり、最後が最背面のコントロールとなる。つまりこのコードでは、最前面にはStatusBarコントロールが配置され、最背面にはTreeViewコントロールが配置されていることになる。

 しかし実際には、ステータス・バーはフォーム上の最も基本的なパーツなので、最背面に配置されるべきだ。要するに上記のコードは、次のようなコードに書き換えなければならないわけだ。

this.Controls.Add(this.listView1);
this.Controls.Add(this.splitter1);
this.Controls.Add(this.treeView1);
this.Controls.Add(this.statusBar1);


 ご覧のとおり、このコード修正は、1行を単にカット&ペーストすれば済む程度なので、大した作業ではない。しかし、統合開発環境のVisual Studio .NET(以降、VS.NET)でコーディングを行っている場合には、このコード修正を行うことは難しい。というのも、このコードは、開発者がコード・エディタにより編集することが禁止されているInitializeComponentメソッド内に自動的に追加されるコードだからだ。

 従って、このzオーダーの変更は、フォーム・デザイナの機能を使って行う必要がある。

 フォーム・デザイナ上でこれを行うには、次の画面例のようにして[レイアウト]ツールバーの[最背面へ移動]ボタンをクリックするか、メニュー・バーから[書式]−[順序]−[最背面へ移動]を選択すればよい。なお逆に、コントロール(のzオーダー)を最前面に移動させるには、「最前面へ移動」を実行すればよい。

Windowsフォームで意図どおりのレイアウトに再配置した例 Windowsフォームで意図どおりのレイアウトに再配置した例
フォーム上のコントロールのzオーダーを変更するには、[レイアウト]ツールバーの[最背面へ移動]ボタンや[最前面へ移動]ボタンをクリックするか、メニュー・バーから[書式]−[順序]−[最背面へ移動]/[最前面へ移動]を選択すればよい。
  (1)[最前面へ移動]を実行すると、フォーム上のすべてのコントロールの最も前面に配置される。例えばほかのコントロールが重なって配置されているような場合でも、これを実行するとほかのコントロールよりも上に表示されるようになる。
  (2)[最背面へ移動]を実行すると、フォーム上のすべてのコントロールの最も背面に配置される。例えばほかのコントロールが重なって配置されているような場合、これを実行するとほかのコントロールの下に隠れて、コントロールの一部や全体が見えなくなってしまう。

 ちなみに、このようなコントロールのzオーダーの変更は、コントロールのメソッドを呼び出すことにより実行時にも可能だ。具体的には、次の2つのメソッドを使用する。

  • コントロールのBringToFrontメソッド:最前面へ移動する
  • コントロールのSendToBackメソッド:最背面へ移動する

 なお、本稿で紹介したzオーダーの変更方法では、一気に「最」背面や「最」前面に移動させることしかできない。「1つだけ」背面に移動や「1つだけ」前面に移動のような微調整はできないのだ。このように細かくzオーダーを調整する必要がある場合には、最背面に配置したいコントロールから順番にすべてのコントロールに対して「最前面へ移動」を実行していき、全コントロールのzオーダーを設定し直すとよいだろう。

カテゴリ:Windowsフォーム 処理対象:Windowsフォーム・デザイナ
関連TIPS:Windowsフォームでタブ・オーダーを設定するには?


「.NET TIPS」のインデックス

.NET TIPS

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。