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
Le lien capture d'écran est cassé. –
Le lien a été mis à jour maintenant. – Shady