2009-09-18 3 views
1

J'écris une application Windows Forms en C# dans laquelle certains utilitaires Windows peuvent être lancés (par exemple, invite CMD, éditeur de registre, Events Viewer, etc.) et placés dans un contrôle MdiClient sur la forme principale.Windows Forms - Les barres de défilement de MdiClient n'apparaissent pas comme prévu

Tout fonctionne très bien sauf que les barres de défilement dans le contrôle MdiClient n'apparaissent pas automatiquement lorsqu'une fenêtre enfant tombe au-delà des limites de MdiClient. Si les fenêtres enfants étaient des fenêtres, je sais que les barres de défilement de MdiClient apparaîtraient automatiquement comme prévu. J'ai essayé beaucoup de choses, y compris certaines solutions de contournement complexes .. et je commence à penser qu'il doit y avoir quelque chose que je suis complètement négliger.

Je joins quelques exemples de code ci-dessous:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Text; 
using System.Windows.Forms; 
using System.Diagnostics; 
using System.Threading; 
using System.Runtime.InteropServices; 

namespace MdiClient 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      System.Windows.Forms.MdiClient mdiClient = new System.Windows.Forms.MdiClient(); 
      mdiClient.Dock = DockStyle.Fill; 
      mdiClient.BackColor = Color.WhiteSmoke; 
      this.Controls.Add(mdiClient); 

      int processID = StartCMD(); 
      AddToMDIClient(processID, mdiClient.Handle); 
     } 

     private int StartCMD() 
     { 
      int processID = -1; 

      using (Process process = new Process()) 
      { 
       ProcessStartInfo startInfo = process.StartInfo; 
       startInfo.FileName = "cmd.exe"; 

       try 
       { 
        process.Start(); 
        processID = process.Id; 
       } 
       catch (Exception ex) 
       { 
        MessageBox.Show(ex.ToString()); 
       } 
      } 

      return processID; 
     } 
     private void AddToMDIClient(int processID, IntPtr mdiClientHandle) 
     { 
      try 
      { 
       Process process = Process.GetProcessById(processID); 

       int numberOfAttempts = 0; 
       while (string.IsNullOrEmpty(process.MainWindowTitle) && numberOfAttempts < 30)//max of 3 seconds 
       { 
        Thread.Sleep(100); 
        process.Refresh(); 

        numberOfAttempts++; 
       } 

       if (!string.IsNullOrEmpty(process.MainWindowTitle)) 
       { 
        SetWindowPos(process.MainWindowHandle, HWND_TOPMOST, 1, 1, 0, 0, TOPMOST_FLAGS); 

        SetParent(process.MainWindowHandle, mdiClientHandle); 
       } 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.ToString()); 
      } 
     } 

     [DllImport("user32.dll", SetLastError = true)] 
     public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, 
      int Y, int cx, int cy, uint uFlags); 

     [DllImport("user32.dll", SetLastError = true)] 
     public static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent); 

     public static readonly IntPtr HWND_TOPMOST = new IntPtr(-1); 
     public const UInt32 TOPMOST_FLAGS = /*SWP_NOMOVE | */SWP_NOSIZE; 

     public const UInt32 SWP_NOSIZE = 0x0001; 
    } 
} 

La capture d'écran ci-dessous montre que lorsque la fenêtre CMD est déplacé de sorte que ses frontières sont en dehors des frontières de l'MdiClient il n'y a pas de barres de défilement:

S'il vous plaît voir ce lien pour l'image: http://picasaweb.google.com/lh/photo/75rMVJMCWRg_s_DFF6LmNg?authkey=Gv1sRgCIKRlsu8xuDh8AE&feat=directlink

Toute aide serait grandement appréciée!

Merci, Shady

+0

Le lien capture d'écran est cassé. –

+0

Le lien a été mis à jour maintenant. – Shady

Répondre

1

Sans la capture d'écran, il est difficile de dire, mais je pense que la façon dont vous créez la MDIParanet est trop compliquée.

private void Form1_Load(object sender, EventArgs e) 
    { 
     // System.Windows.Forms.MdiClient mdiClient = new System.Windows.Forms.MdiClient(); 
     // mdiClient.Dock = DockStyle.Fill; 
     // mdiClient.BackColor = Color.WhiteSmoke; 
     // this.Controls.Add(mdiClient); 

     this.IsMdiContainer = true; 

     int processID = StartCMD(); 
     AddToMDIClient(processID, mdiClient.Handle); 
    } 

Si vous avez besoin du client, vous pouvez le filtrer à partir des contrôles.

Un autre problème pourrait être de définir un MDIChild comme TOP_MOST, je ne pense pas que ce soit une bonne combinaison.

+0

Voici l'image: http://picasaweb.google.com/lh/photo/75rMVJMCWRg_s_DFF6LmNg?authkey=Gv1sRgCIKRlsu8xuDh8AE&feat=directlink J'ai essayé de ne pas utiliser HWND_TOPMOST et toujours pas de barres de défilement apparaissent dans la fenêtre parent. Je ne sais pas quoi faire de votre extrait de code. Tout ce que je vois si le code pour le MdiClient est commenté et this.IsMdiContainer a été ajouté. J'ai essayé d'ajouter this.IsMdiContainer sans succès. – Shady

+0

Mon code était incomplet, juste "mettre en place" MDI la façon nominale était plus sûr. Notez que lorsque vous définissez le parent de Windows Cmd, ils ne se retrouvent probablement pas dans la liste des contrôles du client. Si une partie de la logique MDI est gérée par WinForms, cela pourrait être le problème. –

+0

Si quelqu'un peut fournir un exemple de travail d'une fenêtre CMD étant un enfant d'un Windows Form en quelque sorte et pour que les barres de défilement dans la fenêtre parent se comportent comme prévu ce serait apprécié. Les barres de défilement sont le seul problème que j'ai. – Shady

0

J'ai fait quelques tests et cela fonctionne bien pour moi était long que j'ai Autoscroll = true dans les propriétés des formulaires.

Aussi, je remarqué si vous agrandissez le formulaire et déplacez la fenêtre de commande pour dire le bas à droite, il ne sera pas affiché les barres de défilement, il ne lorsque vous minimisez la forme devant les fenêtres de commande (voir les captures d'écran ci-dessous)

Screenshot 1 http://picasaweb.google.com/lh/photo/rfwm-S8y06Fl3HFNshgj3g?feat=directlink

Screenshot 2 http://picasaweb.google.com/lh/photo/y6qkN9Jj19vDGFNkTuL4FQ?feat=directlink

aussi, pouvez-vous mettre sur les propriétés AutoScrollMinSize, de sorte que vous avez toujours des barres de défilement de la forme sous la forme est plus petite que la taille de l'ensemble

espoir qui aide

Josh

+0

"De plus, j'ai remarqué que si vous agrandissez le formulaire et que vous déplacez la fenêtre de commande, les barres de défilement n'apparaîtront plus, vous n'aurez plus à afficher les barres de défilement." est ce que mon problème est. J'ai essayé de trouver une solution en utilisant AutoScollMinSize mais ce n'est pas facile .. D'autres conseils seraient grandement appréciés. – Shady

+0

Salut Shady, pensé et eu quelques idées, je voulais juste vérifier pour voir ce que vous essayez d'atteindre? Voulez-vous que les barres de défilement apparaissent dès que le coin inférieur droit du formulaire enfant dépasse le coin inférieur droit du formulaire parent? Josh –

+0

Je voudrais que les barres de défilement apparaissent à chaque fois que la forme enfant dépasse la bordure du formulaire parent (haut, droite, gauche et bas). Actuellement, j'ai une minuterie qui redimensionne le formulaire parent deux fois par seconde (incrémente la largeur de 1px puis diminue la largeur de 1px) et cela force les barres de défilement à apparaître. Mais ce n'est pas ce que j'espérais avoir à faire bien sûr. – Shady

Questions connexes