PSのレイヤーのようにVisualStudio2008 Form Designerで1つのパネルを非表示にするにはどうすればよいですか?それ以外の場合、ユーザーがクリックする必要のある複数の「画面」を設計するための別のより良い方法を誰かが推奨できますか?
3 に答える
あなたが説明するのはウィザードであり、Eric J.からのアプローチを調査することをお勧めします.
ただし、UI 内の同じスペースに複数のパネルを配置し、デザイナーでそれらを切り替えたい場合は、TabControl を使用して、TabControl のタブを非表示にします。これにより、設計時の UI の管理が容易になり、実行時にコードを簡単に切り替えてタブを切り替えることができます。
TabControl から派生する HiddenTabsControl という非常に単純なカスタム コントロールを作成しました。このクラスは WndProc のみをオーバーライドし、TabControl 基本クラスが他のすべてを処理できるようにします。あなたがする必要があるのは次のとおりです。
- プロジェクトに新しいアイテムを追加する
- カスタム コントロールを選択し、
- HiddenTabsControl のような名前を付けます。
- 基本クラスを TabControl に変更し、Constructor と Visual Studio が追加した OnPaint オーバーライドを削除します。
WndProc のこのオーバーライドをクラスにコピーします。
protected override void WndProc(ref Message m) { // Hide tabs by trapping the TCM_ADJUSTRECT message if (m.Msg == 0x1328 && !DesignMode) { m.Result = (IntPtr)1; } else { base.WndProc(ref m); } }
デザイナーでタブを変更し、UI を簡単に設計できるようになりました。また、必要に応じてコードでイベントを処理してタブを変更できます。Selected タブの変更は、次の方法で簡単に行うことができます。
this.hiddenTabsControl.SelectedTab = this.tabPageYouWantVisible;
タブを削除することの副作用の 1 つは、コントロールの構築時にタブが占有するスペースです。それらを削除すると、HiddenTabsControl が占有するスペースが縮小されて変化します。通常、HiddenTabsControl のアンカーを下に設定して、縮小しないようにします。
最近のプロジェクトでこのウィザードコードを使用したところ、うまく機能しました。
それはあなたが求めている基本的な経験を提供します。
もう 1 つのエレガントではありませんが手っ取り早い方法は、パネルを実行時まで親フォームに追加しないことです。そうすることで、設計者はコンパイル前にパネルがどこに属しているか分からず、パネルは表示されません。
たとえば、親フォームにコントロールを追加するコード ブロックを見つけます。
//this->Controls->Add(this->panel_X);
this->Controls->Add(this->tabControl);
this->Controls->Add(this->menuStrip_topMenu);
ステートメントをコメント化するか削除してから、フォームがロードされたときに発生するイベントのハンドルを見つけます。
this->Load += gcnew System::EventHandler(this, &MainForm::MainForm_Load);
次に、イベント ハンドラーの定義で、コントロールをフォームに追加します。
System::Void MainForm_Load(System::Object^ sender, System::EventArgs^ e) {
...
...
this->Controls->Add(this->panel_X);
}
これを行うことで望ましくない副作用を経験したことはありませんが、そうしない正当な理由がある場合は、聞いてみたいと思います.