1

パネルを持っています。

その中にWinFormsを追加します。追加された WinForms には、TopLevel および Visible プロパティが FALSE および TRUE に設定されています。

panel.SetChildIndex(WinForm1,0)WinForm1 を前面に出すことができます。

私ができなかったことはChildIndex、パネルの実際を追跡することです。

アイデアは、パネル内のフォームを開くボタンを用意し、パネルが開いたときに新しいボタンがWindowsメニューに追加されるようにすることです。

VS プロジェクトで多くのファイルが開いている場合のように、[ウィンドウ] メニューに移動して 1 つを選択できます。また、ページをクリックしてアクティブなページを変更すると、[ウィンドウ] メニューが自動更新され、実際のアクティブなページがチェックされます。

これをやりたいのですが、パネルコンテナを使用しています。私はすべてをやり遂げることができましたが、そのthe Window menu auto-updates and checks the actual active page部分はできませんでした。

BringToFront()またはSetChildIndex(form, index)呼び出されたときに発生するイベントはありませんか? パネル内にある別のフォームをクリックして「アクティブなフォーム」になったときのイベントはありますか? または、アクティブなフォームが変更されたときにその変更を追跡できるパネルのプロパティですか?

4

2 に答える 2

2

ここから取られる

コントロールの ZOrder が変更されると、レイアウト操作は常にコントロールのコンテナー コントロールで実行されます。

コンテナーの Layout イベントをサブスクライブして BringToFront() を呼び出すと、ZOrder(LayoutEventArgs.AffectedControl) と変更されたプロパティ (LayoutEventArgs.AffectedProperty) を変更したコントロールが表示されました。

于 2012-10-15T20:09:24.290 に答える
1

パネル内のフォームが閉じられると、Controlsパネルのプロパティが再インデックスされることがわかりました。ここで、インデックス 0 は新しいフォーカスを取得するフォームです。別のフォームを閉じたときに前にあるフォームを確認する方法ができたので、パネルでのウィンドウ管理は完了です。

ソースコードを載せるつもりです、多分それは誰かを助けることができます:)

RadRibbonForm、標準パネル、およびパネル内の RadForms を使用していることに注意してください。Rad は Telerik からのものです。これを standardWinForms で機能させるには、いくつか変更する必要がありますが、変更は最小限です。

また、フォームを表示するメニューを使用していません。代わりに、リボン メニューのページで RadButtonElement を使用しています。

AddRadFormWindowウィンドウを配置して自動的に管理するには、 を呼び出す必要があります。

ウィンドウを追加する例:

AddRadFormWindow(typeof (MyRadForm))

さて、ソース。RadRibbonForm のクラスのコード内にある必要があります。

public static class ExtensionsRadForm
{
    [DllImport("user32.dll")]
    private static extern int ShowWindow(IntPtr hWnd, uint msg);

    public static void Deminimize(this RadForm form)
    {
        if (form.WindowState == FormWindowState.Minimized)
            ShowWindow(form.Handle, 9);
    }
}

    private void RefreshButtonsChecks(string windowName)
    {
        if (windowName != null)
        {
            principalPanel.Controls[windowName].BringToFront();
        }
        if (principalPanel.Controls.Count > 0)
        {
            if (principalPanel.Controls.Cast<RadForm>().Any(radForm => radForm.WindowState != FormWindowState.Minimized))
            {
                foreach (RadItem item in radRibbonBarGroupOpenWindows.Items)
                {
                    var buttonBorder = ((RadButtonElement) item).BorderElement;
                    if (item.Name == panelPrincipal.Controls[0].Name + "Button")
                    {
                        buttonBorder.ForeColor = Color.LimeGreen;
                        buttonBorder.BottomColor = Color.LimeGreen;
                        buttonBorder.TopColor = Color.LimeGreen;
                        buttonBorder.LeftColor = Color.LimeGreen;
                        buttonBorder.RightColor = Color.LimeGreen;
                        principalPanel.Controls[0].Focus();
                    }
                    else
                    {
                        buttonBorder.ForeColor = Color.Transparent;
                        buttonBorder.BottomColor = Color.Transparent;
                        buttonBorder.TopColor = Color.Transparent;
                        buttonBorder.LeftColor = Color.Transparent;
                        buttonBorder.RightColor = Color.Transparent;
                    }
                }
            }
            else
            {
                foreach (RadItem item in radRibbonBarGroupAbiertas.Items)
                {
                    var buttonBorder = ((RadButtonElement)item).BorderElement;
                    buttonBorder.ForeColor = Color.Transparent;
                    buttonBorder.BottomColor = Color.Transparent;
                    buttonBorder.TopColor = Color.Transparent;
                    buttonBorder.LeftColor = Color.Transparent;
                    buttonBorder.RightColor = Color.Transparent;
                }
            }
        }
    }
private void PrincipalPanelLayout(object sender, LayoutEventArgs e)
    {
        RefreshButtonsChecks(null);
    }
private void RadButtonElementCloseAllWindowsClick(object sender, EventArgs e)
    {
        int limitButtons = radRibbonBarGroupOpenWindows.Items.Count;
        for (int index = 0; index < limitButtons; index++)
        {
            RadItem radItem = radRibbonBarGroupOpenWindows.Items[0];
            radItem.Dispose();
        }
        int limitControls = principalPanel.Controls.Count;
        for (int index = 0; index < limitControls; index++)
        {
            Control control = principalPanel.Controls[0];
            control.Dispose();
        }
        Update();
        GC.Collect();
    }
private void AddRadFormWindow(Type windowToAdd)
    {
        if (!principalPanel.Controls.ContainsKey(windowToAdd.Name))
        {
            var window = (RadForm) Activator.CreateInstance(windowToAdd);
            window.TopLevel = false;
            window.Visible = true;
            window.FormClosing += (method, args) =>
                                       {
                                           radRibbonBarGroupOpenWindows.Items[window.Name + "Button"].Dispose();
                                           GC.Collect();
                                       };
            window.Enter += (method, args) => RefreshButtonsChecks(window.Name);
            var closeMenuItem = new RadMenuItem("Close");
            closeMenuItem.MouseDown += (method, args) =>
                                           {
                                               panelPrincipal.Controls[window.Name].Dispose();
                                               radRibbonBarGroupOpenWindows.Items[window.Name + "Button"].Dispose();
                                           };
            var contextMenu = new RadContextMenu();
            contextMenu.Items.Add(closeMenuItem);
            var button = new RadButtonElement(window.Text) {Name = window.Name + "Button"};
            button.MouseDown += (method, args) =>
                                    {
                                        switch (args.Button)
                                        {
                                            case MouseButtons.Left:
                                                if (((RadForm) principalPanel.Controls[window.Name]).WindowState ==
                                                    FormWindowState.Minimized)
                                                    ((RadForm) principalPanel.Controls[window.Name]).Deminimize();
                                                principalPanel.Controls[window.Name].BringToFront();
                                                principalPanel.Controls[window.Name].Focus();
                                                break;
                                            case MouseButtons.Right:
                                                contextMenu.Show(MousePosition);
                                                break;
                                        }
                                    };
            radRibbonBarGroupOpenWindows.Items.Add(button);
            principalPanel.Controls.Add(window);
            principalPanel.Controls[window.Name].BringToFront();
            principalPanel.Controls[window.Name].Focus();
        }
        principalPanel.Controls[windowToAdd.Name].BringToFront();
        principalPanel.Controls[windowToAdd.Name].Focus();
        Update();
        GC.Collect();
    }
public Constructor()
    {
        panelPrincipal.Layout += PanelPrincipalLayout;
    }
于 2012-10-16T02:32:04.540 に答える