C # MDI - как предотвратить полосу прокрутки? - PullRequest
1 голос
/ 27 октября 2011

Лучше всего показывать с изображением, я могу перетащить формы с края родительского объекта MDI, и появятся полосы прокрутки.

Скорее всего, дочерние формы будут привязаны к области родительской формы.

Я закончил поиски решения (на многие из них ответили 2+ года назад, так что я надеюсь, что они устарели), и встречаются только люди, проверяющие координаты на мероприятии Move ... Отлично, но что, если у меня есть 20 форм .. или 100 форм.Я не могу закодировать их все, это немного глупо.Конечно, где-то есть свойство, которое я могу просто установить в родительской форме.

MDI Scrollbar problem

Ответы [ 3 ]

1 голос
/ 27 октября 2011

вы можете сделать что-то вроде этого ...

Step!: Вам нужно создать базовую форму (например, пользовательский элемент управления)

и поместите этот код в эту форму

 namespace Controls
 {
  public partial class BaseForm : Form
  {
    public BaseForm()
    {
      InitializeComponent();
      StartPosition = FormStartPosition.WindowsDefaultLocation;
      MaximizeBox = false;
      Width = 806;
      //Width = 850;
      //Height = 760;
      Height = 730;
      //Width = 790;
      //Height = 617;
    }


    protected override void WndProc(ref Message m)
    {
      const int WM_SYSCOMMAND = 0x0112;
      const int SC_MOVE = 0xF010;
      //ShowScrollBar(this.Handle, (int)ScrollBarDirection.SB_BOTH, false);
      switch (m.Msg)
      {
        case WM_SYSCOMMAND:
          int command = m.WParam.ToInt32() & 0xfff0;
          if (command == SC_MOVE)
            return;
          break;
      }
      base.WndProc(ref m);
    }
  }
}

и затем в каждой форме нужно указывать вот так ...

public partial class childform : BaseForm
{
   .......
}

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

  • минимальный размер 0,0

  • макс. Сикз также 0,0

  • начальная позиция - расположение окон по умолчанию

  • состояние окна - нормальное

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

1 голос
/ 30 октября 2011

Шаг 1: Вы должны создать новый класс, унаследованный от класса NativeWindow, и переопределить его метод WndProc.

Шаг 2: В форме MDI создайте новый объект этого нового класса и передайте элемент управления MDIClient его конструктору.

Код шага 1:

  internal class MyNativeMDIclient : NativeWindow
    {
        private MdiClient mdiClient;

        public MyNativeMDIclient(MdiClient parent)
        {
            mdiClient = parent;
            ReleaseHandle();
            AssignHandle(mdiClient.Handle);            
        }
        internal void OnHandleDestroyed(object sender, EventArgs e)
        {
            ReleaseHandle();
        }
        private const int SB_BOTH = 3;
        [DllImport("user32.dll")]
        private static extern int ShowScrollBar(IntPtr hWnd, int wBar, int bShow);
        protected override void WndProc(ref Message m)
        {
            ShowScrollBar(m.HWnd, SB_BOTH, 0 /*false*/);
            base.WndProc(ref m);
        }
    }

Код шага 2:

  foreach (Control control in this.Controls)
            {
                if (control is MdiClient)
                {
                    MyNativeMDIclient nw = new MyNativeMDIclient(control);
                    break;
                }
            }
0 голосов
/ 27 октября 2011

Вы всегда можете переопределить функцию перемещения в родительском классе, а затем все ваши формы наследуются от этого класса.

Нет волшебного API / свойства (о котором я знаю, прошу прощения, если я ошибаюсь), чтобы сказать родителю MDI заблокировать дочерние элементы в его пределах.

...