Элементы управления в форме контейнера приходят на дочернюю форму? - PullRequest
3 голосов
/ 26 января 2011

В форме контейнера у меня есть меню и кнопки для открытия других форм. enter image description here

Здесь я сталкиваюсь с проблемой, когда открываю любую форму, эти баттлы и этикетки появляются поверх вновь открытой формы. enter image description here

Пожалуйста, подскажите, как мне справиться с этой проблемой? Я хочу открыть новую форму и сохранить эти элементы управления формы контейнера на заднем плане.

Ответы [ 8 ]

5 голосов
/ 22 февраля 2012

У меня тоже такая же проблема. Я получил альтернативное решение, как описано ниже:

  1. Вставить таймер управления
  2. Я добавил элементы управления в контейнер панели
  3. И сделал следующее

    private void timer1_Tick(object sender, EventArgs e)
    {
        if ((int)MdiChildren.GetLength(0) > 0)
        {
            panel1.Visible = false;
        }
        else
        {
            panel1.Visible = true;
        }
    }
    
4 голосов
/ 26 января 2011

Мне кажется, я вижу, что ты сделал.Вы используете MDI, и вы помещаете метки меню и кнопки в родительскую форму MDI.Вы что-то сделали с окном клиента MDI, оно обычно темно-серое.Может быть, вы выяснили, как изменить его BackColor или изменили цвет системы Windows.Да, ваш снимок экрана это результат.Проблема заключается в том, что клиентские формы MDI связаны с клиентским окном MDI.Это заставляет их показывать позади элементов управления, которые вы накладываете на родительскую форму.

Обходного пути для этого нет, вам придется изменить свой интерфейс.Чтобы сохранить MDI, поместите Panel в родительскую форму и установите для ее свойства Dock значение Left.Переместите элементы управления меню на это.Окно клиента MDI теперь будет уменьшаться, занимая оставшуюся часть родительской формы.И дочерние формы будут ограничивать себя в этой области.К сожалению, вам придется реорганизовать меню, чтобы оно занимало гораздо меньше места на панели.

4 голосов
/ 26 января 2011

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

Посмотрите на это Артикул и это .

особенно это:

Родительская форма не может содержать никаких элементов управления. >

Редактировать: Добавлена ​​дополнительная информация

1 голос
/ 17 февраля 2014

Основной трюк здесь - рассматривать дочерние формы как элементы управления.Вы создадите дочернюю форму, как и любой другой элемент управления.Когда вы используете этот метод, вы должны установить его TopLevel в false, иначе он не будет работать.

Для создания дочерней формы используются следующие строки кода:

Form childForm = new Form(); //initialize a child form

childForm.TopLevel = false; //set it's TopLevel to false

Controls.Add(childForm); //and add it to the parent Form
childForm.Show(); //finally display it

childForm.BringToFront(); //use this it there are Controls over your form.

подробнее здесь

1 голос
/ 26 января 2011

@ Ханс Пассант имеет правильный ответ, но вы также можете решить свою проблему, вообще не используя формы MDI.Некоторые параметры:

  • Использовать отдельные формы: иметь форму меню, обычно большую / развернутую, и запускать дочерние формы перед ней, устанавливая их свойство Parent для формы меню, или
  • Используйте одну форму, но с док-библиотекой (в прошлом я использовал DockPanel Suite ).По сути, это повторное внедрение форм MDI с дополнительными функциями.Это небольшая работа для запуска, но она может позволить вам создать несколько хороших пользовательских интерфейсов.

Однако оба этих варианта потребуют значительных изменений в вашем коде пользовательского интерфейса.

0 голосов
/ 09 марта 2016

У меня была эта проблема, и я решил ее следующим образом:

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

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
    [DllImport("user32.dll", SetLastError = true)]
    static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

    Form2 F2;
    public Form1()
    {
        InitializeComponent();
        F2 = new Form2();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        Panel P1 = new Panel();
        P1.Location = new Point(0, 0);
        P1.Height = this.Height;
        P1.Width = this.Width;
        P1.BackColor = Color.Transparent;
        this.Controls.Add(P1);

        SetParent(F2.Handle, P1.Handle);
        F2.Owner = this;

        F2.Show();
    }
}
0 голосов
/ 26 января 2011

Вызовите BringToFront () для каждой дочерней формы после их отображения.Кроме того, подключите его к методу OnLoad каждой дочерней формы:

childForm.OnLoad += (s, e) => (s as Form).BringToFront();
0 голосов
/ 26 января 2011

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

Если оно должно быть внутри этой главной формы и одного из этих элементов управления, то вы собираетесьдолжны установить Z-порядок этого.Для этого нет никакого свойства, поэтому вам придется взглянуть на вызов Win32 API, SetWindowPos:

[DllImport("user32.dll", EntryPoint = "SetWindowPos")]
public static extern bool SetWindowPos(
int hWnd, // window handle
int hWndInsertAfter, // placement-order handle
int X, // horizontal position
int Y, // vertical position
int cx, // width
int cy, // height
uint uFlags); // window positioning flags


const uint SWP_NOSIZE = 0x1;
const uint SWP_NOMOVE = 0x2;
const uint SWP_SHOWWINDOW = 0x40;
const uint SWP_NOACTIVATE = 0x10;

И назвать это примерно так:

SetWindowPos((int)form.Handle,   // that form
             (int)insertAfter.Handle,  // some other control
             0, 0, 0, 0,
             SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW | SWP_NOACTIVATE);
...