2009-09-18 4 views
1

Я пишу приложение форм Windows на C#, в котором могут быть запущены некоторые утилит Windows (например, приглашение CMD, редактор реестра, средство просмотра событий и т. Д.) И помещены в элемент управления MdiClient на основная форма.Windows Forms - полосы прокрутки MdiClient не отображаются автоматически, как ожидалось

Все работает отлично, за исключением того, что полосы прокрутки в элементе управления MdiClient автоматически не появляются, когда дочернее окно выходит за границы MdiClient. Если дочерние окна были оконными формами, то я знаю, что полосы прокрутки MdiClient будут автоматически отображаться так, как ожидалось. Я пробовал много вещей, включая некоторые сложные обходные пути. И я начинаю думать, что должно быть что-то, что я полностью игнорирую.

Я приложил некоторые примеры кода ниже:

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; 
    } 
} 

На скриншоте ниже показано, что, когда окно CMD перемещается так, его границы находятся за пределами границ MDICLIENT нет полосы прокрутки:

Пожалуйста, просмотрите эту ссылку для изображения: http://picasaweb.google.com/lh/photo/75rMVJMCWRg_s_DFF6LmNg?authkey=Gv1sRgCIKRlsu8xuDh8AE&feat=directlink

Любая помощь будет очень признательна!

Спасибо, Shady

+0

Ссылка скриншот сломана. –

+0

Ссылка была обновлена. – Shady

ответ

1

Без скриншота трудно сказать, но я думаю, что путь вы создаете MDIParanet является слишком сложным.

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); 
    } 

Если вам нужен клиент, вы можете отфильтровать его из элементов управления.

Другой проблемой может быть установка MDIChild как TOP_MOST, я не думаю, что это хорошая комбинация.

+0

Вот изображение: http://picasaweb.google.com/lh/photo/75rMVJMCWRg_s_DFF6LmNg?authkey=Gv1sRgCIKRlsu8xuDh8AE&feat=directlink Я попытался не использовать HWND_TOPMOST и до сих пор нет полосы прокрутки появляется в родительском окне. Я не уверен, что делать с вашим отрывком кода. Все, что я вижу, если код для MdiClient закомментирован, и этот.IsMdiContainer был добавлен. Я пробовал добавить this.IsMdiContainer без успеха. – Shady

+0

Мой код был неполным, только «настройка» MDI способ был более безопасным. Обратите внимание, что при установке родителя Cmd Windows они, вероятно, не попадают в список управления Клиентом. Если часть логики MDI обрабатывается WinForms, это может быть проблемой. –

+0

Если кто-то может предоставить рабочий пример окна CMD, являющегося дочерним элементом Windows Form, и для полос прокрутки в родительском окне, чтобы вести себя так, как ожидалось, это было бы оценено. Полосы прокрутки - единственная проблема, с которой я сталкиваюсь. – Shady

0

Я проводил некоторое тестирование, и он работает нормально для меня, поскольку у меня есть Autoscroll = true в свойствах форм.

Кроме того, я заметил, если увеличить форму и переместить окно командной строки, чтобы сказать, в правом нижнем углу, что не будет показывать полосы прокрутки, это только, когда вы уменьшаете форму мимо командных окон (см скриншоты ниже)

Скриншот 1 http://picasaweb.google.com/lh/photo/rfwm-S8y06Fl3HFNshgj3g?feat=directlink

Скриншот 2 http://picasaweb.google.com/lh/photo/y6qkN9Jj19vDGFNkTuL4FQ?feat=directlink

Кроме того, вы можете установить на форме в свойствах AutoScrollMinSize, так что у вас всегда есть полосы прокрутки в форме меньше, чем размер, установленный

Надежда, что помогает

Джоша

+0

«Кроме того, я заметил, что если вы увеличите форму и переместите командное окно, чтобы сказать нижнее право, оно не будет отображать полосы прокрутки, это произойдет, только когда вы уменьшите форму за окнами команд (см. Скриншоты ниже)» Это это моя проблема. Я пытаюсь найти решение с помощью AutoScollMinSize, но это непросто. Любые другие советы будут очень благодарны. – Shady

+0

Привет Shady, думал и имел несколько идей, просто хотел проверить, чего вы пытаетесь достичь? Вы хотите, чтобы полоса прокрутки появлялась, как только нижняя правая часть дочерней формы проходит в нижнем правом углу родительской формы? Josh –

+0

Я бы хотел, чтобы полосы прокрутки появлялись всякий раз, когда дочерняя форма выходит за рамки любой границы родительской формы (сверху, справа, слева и внизу). В настоящее время у меня есть таймер, который изменяет размер родительской формы два раза в секунду (увеличивает ширину на 1px, а затем уменьшает ширину на 1px), и это заставляет появляться полосы прокрутки. Но это не то, что я надеялся сделать, конечно. – Shady

Смежные вопросы