2011-05-03 2 views
6

Sto creando un'applicazione C# WinForms MDI. Ho una forma principale che contiene 4 altre forme al suo interno. Voglio essere in grado di spostare le forme figlio al di fuori della forma genitore (il loro valore FormBorderStyle è impostato su una barra di dimensioni considerevoli in modo che le finestre separate non compaiano sulla barra delle applicazioni per ogni finestra secondaria). Sono in grado di ottenere questo risultato utilizzando il seguente codice per il form principale:C# WinForms: come si impedisce di ridurre al minimo il modulo figlio quando la forma padre viene ridotta a icona?

using System; 
    using System.Collections.Generic; 
    using System.ComponentModel; 
    using System.Data; 
    using System.Drawing; 
    using System.Linq; 
    using System.Text; 
    using System.Windows.Forms; 

    namespace Prototype 
    { 
     public partial class MdiParent : Form 
     { 
      private FastEyeControl m_ControlForm; 
      private FastEyeLogWindow m_LogForm; 
      private FastEyeConfiguration m_ConfigurationForm; 
      private ROCOrderWindow m_OrderLogForm; 

      public MdiParent() 
      { 
       InitializeComponent(); 

       m_ControlForm  = new FastEyeControl(); 
       m_LogForm   = new FastEyeLogWindow(); 
       m_ConfigurationForm = new FastEyeConfiguration(); 
       m_OrderLogForm  = new ROCOrderWindow(); 
      } 

      private void MdiParent_Load(object sender, EventArgs e) 
      { 
       m_ControlForm.Show(this); 
       m_LogForm.Show(this); 
       m_ConfigurationForm.Show(this); 
       m_OrderLogForm.Show(this); 
      } 
     } 
    } 

Tuttavia, quando ho minimizzare il form padre, tutte le forme bambino ottenere ridotti al minimo e (come previsto). Esiste comunque la possibilità di evitare che i moduli figlio esterni alla finestra principale vengano ridotti a icona quando la finestra principale viene ridotta a icona? Fondamentalmente, voglio che l'utente sia in grado di ridimensionare e spostare le singole forme figlio al di fuori della forma genitore, se lo desidera (come sganciare una barra degli strumenti in Visual Studio.NET e posizionarla in un altro monitor da qualche parte). Grazie per l'aiuto!

+0

Ottima domanda. Non ho la risposta, ma ci penserò. Questo è sicuramente uno scenario interessante. – IAmTimCorey

+0

Hai provato a rimuovere "questo" dalla chiamata Show()? (Mostrare il modulo senza un genitore.) –

+0

Sì, ma poi succede che i moduli figlio sono posizionati dietro la finestra genitore all'avvio. Voglio che le forme figlio siano sempre di fronte alla forma genitore. – Andrew

risposta

1

OK ho preso a lavorare:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.Diagnostics; 

namespace Prototype 
{ 
    public partial class MdiParent : Form 
    { 
     private FastEyeControl m_ControlForm; 
     private FastEyeLogWindow m_LogForm; 
     private FastEyeConfiguration m_ConfigurationForm; 
     private ROCOrderWindow m_OrderLogForm; 

     private Point m_ControlFormLocation; 
     private Point m_LogFormLocation; 
     private Point m_ConfigurationFormLocation; 
     private Point m_OrderLogFormLocation; 

     public MdiParent() 
     { 
      InitializeComponent(); 

      m_ControlForm  = new FastEyeControl(); 
      m_LogForm   = new FastEyeLogWindow(); 
      m_ConfigurationForm = new FastEyeConfiguration(); 
      m_OrderLogForm  = new ROCOrderWindow(); 

      m_ControlFormLocation = new Point(0, 25); 
      m_LogFormLocation = new Point(0, 405); 
      m_ConfigurationFormLocation = new Point(550, 25); 
      m_OrderLogFormLocation = new Point(0, 630); 
     } 

     private void MdiParent_Load(object sender, EventArgs e) 
     { 
      DockForm(m_ControlForm, m_ControlFormLocation); 
      DockForm(m_LogForm, m_LogFormLocation); 
      DockForm(m_ConfigurationForm, m_ConfigurationFormLocation); 
      DockForm(m_OrderLogForm, m_OrderLogFormLocation); 
     } 

     private void exitToolStripMenuItem_Click(object sender, EventArgs e) 
     { 
      this.Close(); 
     } 

     private void DockForm(Form form, Point location) 
     { 
      form.TopLevel = false; 
      form.Location = location; 

      if (! this.Controls.Contains(form)) 
      { 
       this.Controls.Add(form); 
      } 

      form.Visible = true; 
     } 

     private void UndockForm(Form form) 
     { 
      if (this.Controls.Contains(form)) 
      { 
       this.Controls.Remove(form); 
      } 

      form.TopLevel = true; 
      form.Visible = true; 
     } 

     private void DockOrUndockForm(Form form, Point location) 
     { 
      if (this.Controls.Contains(form)) 
      { 
       UndockForm(form); 
      } 
      else 
      { 
       DockForm(form, location); 
      } 
     } 

     private void ToggleDockingOrDockForm(Form form, Point location) 
     { 
      if (form.Visible) 
      { 
       DockOrUndockForm(form, location); 
      } 
      else 
      { 
       DockForm(form, location); 
      } 
     } 

     private void fastEyeControlToolStripMenuItem_Click(object sender, EventArgs e) 
     { 
      ToggleDockingOrDockForm(m_ControlForm, m_ControlFormLocation); 
     } 

     private void fastEyeLogToolStripMenuItem_Click(object sender, EventArgs e) 
     { 
      ToggleDockingOrDockForm(m_LogForm, m_LogFormLocation); 
     } 

     private void fastEyeConfigurationToolStripMenuItem_Click(object sender, EventArgs e) 
     { 
      ToggleDockingOrDockForm(m_ConfigurationForm, m_ConfigurationFormLocation); 
     } 

     private void rOCOrderLogToolStripMenuItem_Click(object sender, EventArgs e) 
     { 
      ToggleDockingOrDockForm(m_OrderLogForm, m_OrderLogFormLocation); 
     } 
    } 
} 

È questo il codice di sicurezza?

1

Penso che dovremo spostarci da finestre di proprietà/genitori/mdi, e dovremo invece renderle tutte finestre di primo livello sconosciute, in "parallelo" l'una all'altra. E poi scrivi la tua logica per collegare una finestra all'altra.

1

Non si è effettivamente creata un'applicazione MDI, non si imposta la proprietà MdiParent dei moduli figlio. Dovrebbe essere chiaramente visibile, è possibile spostare il modulo figlio al di fuori dei limiti del modulo principale.

Le finestre di proprietà sono state create utilizzando il sovraccarico Show (proprietario). Ciò significa che saranno sempre in cima alla finestra principale. E anche minimizzato quando minimizzi la finestra principale.

Basta chiamare il metodo Show() invece (nessun argomento).