Windows Forms - полосы прокрутки MdiClient не отображаются автоматически, как ожидалось - PullRequest
1 голос
/ 19 сентября 2009

Я пишу приложение Windows Forms на C #, с помощью которого можно запускать некоторые утилиты Windows (например, приглашение CMD, редактор реестра, Просмотр событий и т. Д.) И помещать их в элемент управления 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

Ответы [ 2 ]

1 голос
/ 19 сентября 2009

Без скриншота сложно сказать, но я думаю, что способ создания 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 голосов
/ 07 октября 2009

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

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

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

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

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

Надеюсь, это поможет

Джош

...