2012-10-15 23 views
1

我有一個面板。使用'Windows'-like菜單管理面板內的窗口

我在裏面添加了WinForms。添加的WinForms將TopLevel和Visible屬性設置爲FALSE和TRUE。

我可以做一個panel.SetChildIndex(WinForm1,0)將WinForm1放在前面。

我沒有設法做的是跟蹤面板的實際ChildIndex

這個想法是讓按鈕在面板內部打開窗體,當面板打開一個新按鈕時,會添加到Windows菜單中。

就像在VS Project上打開許多文件一樣,您可以轉到Window菜單並選擇一個。另外,如果通過單擊頁面來更改活動頁面,則「窗口」菜單會自動更新並檢查實際活動頁面。

我想要做到這一點,但與面板容器。我已經成功完成了,但不是the Window menu auto-updates and checks the actual active page部分。

BringToFront()SetChildIndex(form, index)被調用時,是不是發生了一個事件?任何情況下,當我點擊面板內的另一個表單並且它變成「活動的」時?或者我可以在活動形式更改時跟蹤更改的面板的某些屬性?

回答

1

發現當面板內的窗體關閉時,面板的Controls屬性被重新索引,其中索引零是獲取新焦點的窗體。現在我有辦法在關閉另一個窗體時檢查前面的窗體,面板中的窗口管理已完成。

打算把源代碼,也許它可以幫助別人:)

請注意,我使用的是RadRibbonForm,標準面板,面板內RadForms。 Rad's來自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; 
    } 
2

它是從here

採取當控制的ZORDER被chaged佈局操作總是在控制的容器控制執行 。

當我訂閱了容器的佈局事件,並呼籲 BringToFront(),這表明我控制,改變其 ZORDER(LayoutEventArgs.AffectedControl)和改變性質 (LayoutEventArgs.AffectedProperty)。

+0

只是更有用。斯蒂爾,有一個大問題......如果我「關閉」表單呢? 'AffectedControl'不會給我前面的實際表單。我無法找到在「面板」前面獲得實際表單的方法。只是讓我遠離完美xD! – mishamosher

+0

@mishamosher:我建議你在不同的有意義的問題上解決你的問題,然後一個一個地問他們。這裏你的問題是在BringToFront()或SetChildIndex(form,index)被調用時沒有觸發事件嗎?在這裏你得到了答案。我認爲這個問題已經在這裏完成了。 – jams

+0

這裏有很多問題,不僅如此。在另一個線程上做出未回答的問題。感謝'佈局'提示,這太棒了! – mishamosher