0

ツールボックス型のものを作っています。モードレス ダイアログは画面の上部に配置して選択オプションを提供する必要があり、メイン フォームは押されたボタンに基づいてオプションを実行する必要があります。メイン フォームのモードレス ダイアログでどのボタンが選択されているかを確認するにはどうすればよいですか??

4

1 に答える 1

0

各ボタンに接続されたモードレス ダイアログにイベント ハンドラーがあります。ボタンがクリック/トグルされると、このイベント ハンドラーが起動し、ボタンがクリック/トグルされたことを通知します。

次に、この通知を親ウィンドウに転送することをお勧めします。これを行うには、メイン フォームでイベント ハンドラーを呼び出し、現在選択されているボタンの識別子をイベント引数の一部として渡します。ここで唯一注意が必要なのは、メイン フォームでイベント ハンドラーを呼び出すために、フローティング パレット フォームがメイン フォームへの参照を維持する必要があることです。これは手動で行うことができますが、その必要はありません。なぜなら、フローティング パレットは常にメイン ダイアログによって所有されている必要があるからです (実際に Z オーダーでその上にフローティングするようにするため)。フローティング パレットを使用してメイン ダイアログへの参照を取得するOwner財産。メイン フォームの型にキャストし、イベントを発生させます。メイン フォーム クラスに定義されたイベント ハンドラ関数で、必要に応じてイベントを処理します。

メイン フォームで通知を受け取る必要がない場合は、フローティング パレット フォームで状態を追跡し、それが何であるかを知る必要があるときにメイン フォームから読み取ることができます。これには、メイン フォームがフローティング パレットへの参照を保持する必要があります。これを行う最も簡単な方法は、フローティング パレット フォームのインスタンスを含むメイン フォーム クラスのメンバ変数を持つことです。とにかくこれが最良の設計であり、メイン フォームからフローティング パレットのデータにアクセス/設定する機能が容易になります。オブジェクト指向設計の匂いだと言う人もいるかもしれませんが、これら 2 つのオブジェクト実際には非常に緊密に結合されているため、これは実際には問題ではありません。

上記のいくつかの場所で、「モードレスフォーム」を「フローティングパレット」と呼んでいることに気付くでしょう。これは、あなたが説明しているデザインが、ツールを選択できるフローティング パレット ウィンドウを備えた Photoshop などの複雑なアプリケーションでは、実際にはかなり一般的なシナリオであるためです。Paint.NET (C# で記述) もまさにこれを行い、おそらく、私が説明したようにそれを実装しています。

新しい C# プログラマーをつまずかせる最大のことは、クラスとクラスのインスタンスの違いを理解することです。クラスは抽象オブジェクトです。オブジェクトの作成に必要なすべての情報が含まれています。インスタンスは実際のオブジェクトそのものです。各クラス タイプには 1 つのクラス定義しかありませんが、各クラス タイプの複数のインスタンス/オブジェクトが存在する可能性があります。たとえば、 という名前のメイン フォーム クラスがあるとしますMainForm。これには、メイン フォームのすべてのコード (イベント、プロパティ、メソッドなど) が含まれます。これはクラスです。メインフォームを実際に表示または操作するには、そのインスタンスを作成する必要がありますMainFormクラス。初心者のプログラマーが抱える問題は、クラスのインスタンス(オブジェクト)ではなく、クラス自体のプロパティにアクセスしたり、関数を呼び出そうとしたりすることです。これが、フローティング パレットへの参照を維持する必要があることを慎重に述べている理由です。これは、フローティング パレット フォーム クラスの特定のインスタンスを意味します。この違いを理解していることを確認してください。詳細については、C# (またはその他のオブジェクト指向言語) でのプログラミングに関するお気に入りのテキストを参照してください。

于 2016-11-27T11:29:20.387 に答える