使用“Windows”菜单管理面板内的窗口

时间:2012-10-15 20:02:21

标签: c# winforms panel

我有一个小组。

我在其中添加WinForms。添加的WinForms将TopLevel和Visible属性设置为FALSE和TRUE。

我可以做panel.SetChildIndex(WinForm1,0)将WinForm1带到前面。

我无法做的是跟踪面板的实际ChildIndex

我们的想法是让按钮在面板内打开表单,当面板打开时,会在Windows菜单中添加一个新按钮。

在VS Project上打开许多文件时,您可以转到“窗口”菜单并选择一个。此外,如果您通过单击页面更改活动页面,则“窗口”菜单会自动更新并检查实际活动页面。

我想这样做,但是有一个面板容器。我已经成功完成了任务,但不是the Window menu auto-updates and checks the actual active page部分。

调用BringToFront()SetChildIndex(form, index)时是否触发了事件?当我点击面板内的另一个表格并成为“活动表格”时的任何事件?或者面板的某些属性,我可以跟踪活动表单更改时的更改?

2 个答案:

答案 0 :(得分:2)

取自here

  

当控件的ZOrder被操作时,总是执行布局操作   在控制的容器控制中。

     

当我订阅容器的Layout事件并调用时   BringToFront()它向我展示了Control改变了它   ZOrder(LayoutEventArgs.AffectedControl)和更改的属性   (LayoutEventArgs.AffectedProperty)。

答案 1 :(得分:1)

发现当面板内的表单关闭时,面板的Controls属性会重新编制索引,其中索引零是获取新焦点的表单。现在,当我关闭另一个时,我有办法检查前面的表单,完成了面板中的窗口管理。

要输入源代码,也许它可以帮助某人:)

请注意我在面板中使用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;
    }