1

ここに画像の説明を入力

"People" は MDI の親フォームです "New" は MDI の子フォームです

「New」が「People」のエッジの外にドラッグされるのを止めるにはどうすればよいですか?

そのコードはうまく機能していることがわかりました

    protected override void OnMove(EventArgs e)
    {
        //
        // Get the MDI Client window reference
        //
        MdiClient mdiClient = null;
        foreach (Control ctl in MdiParent.Controls)
        {
            mdiClient = ctl as MdiClient;
            if (mdiClient != null)
                break;
        }
        //
        // Don't allow moving form outside of MDI client bounds
        //
        if (Left < mdiClient.ClientRectangle.Left)
            Left = mdiClient.ClientRectangle.Left;
        if (Top < mdiClient.ClientRectangle.Top)
            Top = mdiClient.ClientRectangle.Top;
        if (Top + Height > mdiClient.ClientRectangle.Height)
            Top = mdiClient.ClientRectangle.Height - Height;
        if (Left + Width > mdiClient.ClientRectangle.Width)
            Left = mdiClient.ClientRectangle.Width - Width;
        base.OnMove(e);
    }
4

4 に答える 4

0

子の移動イベントでは、コードを使用して、現在の位置が目的の位置を超えているかどうかを検出できます。親ウィンドウの上、左、下、右の端を事前に設定しておく必要があります。

次のようなコード:

BufferWidth = 10; // 10 pixel buffer to edge
// ParentTop is the top Y co-ordinate of the parent window

if (this.location.Y > (ParentTop-BufferWidth))
{
    int LocX = this.Location.X;
    this.location = new Point(LocX, (ParentTop-BufferWidth));
}

それぞれの側でこれを繰り返す必要があります。親ウィンドウが移動したときにのみ変更されるため、事前にバッファを使用してエッジを計算することにより、コードをより合理化できます。

于 2012-07-06T13:18:41.170 に答える
0

MDI コンテナーのスクロール バーを非表示にする、サンプル コード:

internal sealed class NonScrollableWindow : NativeWindow
{
    private readonly MdiClient _mdiClient;

    public NonScrollableWindow(MdiClient parent)
    {
        _mdiClient = parent;
        ReleaseHandle();
        AssignHandle(_mdiClient.Handle);
    }
    internal void OnHandleDestroyed(object sender, EventArgs e)
    {
        ReleaseHandle();
    }
    private const int SB_BOTH = 3;
    [DllImport("user32.dll")]
    private static extern int ShowScrollBar(IntPtr hWnd, int wBar, int bShow);
    protected override void WndProc(ref Message m)
    {
        ShowScrollBar(m.HWnd, SB_BOTH, 0);
        base.WndProc(ref m);
    }
}

使用法 (mdi 親ロード イベントで)、

 foreach (MdiClient control in Controls.OfType<MdiClient>())
        {
            if (control != null)
            {
                new NonScrollableWindow(control);
                break;
            }
        }
于 2012-07-06T13:03:15.900 に答える
0

MDI 親フォームは、複数のフォームをカスケード表示するのと同じように、新しいフォームの種類を再配置します。ウィンドウを再配置するには、Form_Loadingイベント ハンドラで場所を設定する必要があります。

于 2012-07-06T12:35:33.667 に答える
0

子フォームの StartPosition を CenterParent に設定します

于 2012-07-06T12:36:51.840 に答える