0

ウィンドウを「長方形」形式で注文する必要があります。つまり、ウィンドウが 6 つある場合は 2x3 の長方形で注文され、ウィンドウが 5 つある場合は 2x3 で注文されますが、最後のウィンドウがなければ、ウィンドウが 9 つある場合は 3x3 で注文されます。しかし、座標に問題があります - 子ウィンドウは mdiparent ウィンドウの範囲外です。(img)

Java の mdi アプリケーションで使用したのと同じアルゴリズムを使用しました

for(int i=0;i<a;i++)
    for(int j=0;j<b;j++)
         try{
             indfr.get(counter).setLocation(i*theDesktop.getWidth()/a,j*theDesktop.getHeight()/b);
             indfr.get(counter).setSize(theDesktop.getWidth()/a,theDesktop.getHeight()/b);
             counter++;
            }catch (IndexOutOfBoundsException exc){ break;}

どこでindfr - arralist of JInternalFrames、そしてtheDesktop - JDesktopPane

C# のアルゴリズム

for (int i = 0; i < a; i++)
    for (int j = 0; j < b; j++)
            try
            {
                list[counter].SetDesktopLocation(i*list[counter].MdiParent.Width/a, j*list[counter].MdiParent.Height/b);
                list[counter].Size = new Size(list[counter].MdiParent.Width/a, list[counter].MdiParent.Height/b);
                counter++;
            }
            catch (IndexOutOfRangeException)
            {
                break;
            }

どこのリスト -Form[] list = this.MdiChildern;

座標の何が問題になっていますか? (PSはアルゴリズム全体ではありませんが、ウィンドウが注文するメインループです)

ここに画像の説明を入力

4

2 に答える 2

3

問題の行は、tryブロック内の行です。

list[counter].SetDesktopLocation(i*list[counter].MdiParent.Width/a, j*list[counter].MdiParent.Height/b);
list[counter].Size = new Size(list[counter].MdiParent.Width/a, list[counter].MdiParent.Height/b);
counter++;

すべての境界線を含む、画面上のフォームの合計サイズを返すForm.Widthとをチェックしています。子ウィンドウは親フォームのクライアント領域内にのみ配置できるため、代わりにプロパティを照会する必要があります。これは、フォームのサイズから境界線とタイトル バーを引いたものとして定義されます。つまり、子を配置できるフォームの領域です。Form.HeightClientSize

try代わりに、ブロックを次のように書き換えます。

list[counter].SetDesktopLocation(i*list[counter].MdiParent.ClientSize.Width/a, j*list[counter].MdiParent.ClientSize.Height/b);
list[counter].Size = new Size(list[counter].MdiParent.ClientSize.Width/a, list[counter].MdiParent.ClientSize.Height/b);
counter++;

catchそして、そのばかげた空のブロックを取り除きます。例外がスローされたときに行っているのがbreaking だけの場合、例外をキャッチしても意味がありません。必要に応じて、次の例外ハンドラーまでバブルアップし、グローバル ハンドラーまでバブルアップします。具体的な処理方法を知っている例外のみをキャッチします。を取得するべきではありません。取得したIndexOutOfRangeException場合、それはコードのバグです。修正できるように、それについて知りたいと考えています。つまり、例外を飲み込まないということです。


Office アシスタントの Clippy が Stack Overflow に登場!しかし、ここで Clippy をチャネリングするとしたら、MDI children をタイル化しようとしているようです。

その場合、一連のforループを記述して、子のサイズと位置を手動で設定するよりも簡単な方法があります。代わりに、親 MDI フォームでForm.LayoutMdiメソッドを呼び出して、MdiLayout列挙値の 1 つを指定するだけです。この場合、おそらく または のいずれかがMdiLayout.TileHorizontal必要MdiLayout.TileVerticalです。

WinForms は、子ウィンドウを希望どおりに自動的に配置します。

于 2012-05-14T23:16:25.170 に答える
2

「最後のウィンドウなしで」5 つのフォームに対して 2x3 をレイアウトすることを指定します。これは、最後のフォームが通常表示される空のスペースが必要であることを意味すると思いますか? その場合、これは役に立ちませんが、それがあまり重要でない場合は、.NET Windows フォームの標準部分である Form.LayoutMDI メソッドを使用できます。

LayoutMdi(MdiLayout.TileVertical);

違いは、上記のシナリオでは空きスペースが残らないことです。空きスペースを利用するために、2 つのウィンドウが大きく表示されます。とにかく試してみて、うまくいくかどうかを確認してください。

于 2012-05-14T23:26:02.473 に答える