4

コンテナフォームには、フォームを開くためのメニューとボタンがあります。 ここに画像の説明を入力

ここで、フォームを開くと、これらのボタンとラベルが新しく開いたフォームに来るという問題に直面しています。 ここに画像の説明を入力

この問題を管理する方法を教えてください。新しいフォームを開き、これらのコンテナー フォームのコントロールをその背景に保持したいと考えています。

4

10 に答える 10

5

私も同じ問題を抱えています。以下に説明する代替ソリューションを取得しました。

  1. タイマー コントロールを挿入する
  2. パネル コンテナーにコントロールを追加しました
  3. そして、次のことを行いました

    private void timer1_Tick(object sender, EventArgs e)
    {
        if ((int)MdiChildren.GetLength(0) > 0)
        {
            panel1.Visible = false;
        }
        else
        {
            panel1.Visible = true;
        }
    }
    
于 2012-02-22T10:44:08.520 に答える
4

それがMDIアプリケーションであり、親ウィンドウにコントロールを配置すると、作成された子ウィンドウの上にコントロールが表示されます。メニューは、親フォームではなく、子ウィンドウにも表示する必要があります。

この記事これを見てください。

特にこれ:

親フォームにはコントロールを含めることはできません。>>

編集:追加情報を追加

于 2011-01-26T19:51:26.717 に答える
4

私はあなたがしたことを見たと思います。MDI を使用しており、メニュー ラベルとボタンを MDI 親フォームに配置します。MDI クライアント ウィンドウで何かを行いました。通常は濃い灰色です。おそらく、BackColor を変更する方法や、Windows のシステム カラーを変更する方法を理解したことがあるでしょう。はい、あなたのスクリーンショットが結果です。問題は、MDI クライアント フォームが MDI クライアント ウィンドウの親になっていることです。これにより、親フォームに配置したコントロールの背後に表示されます。

これに対する回避策はありません。UI を変更する必要があります。MDI を保持するには、親フォームに Panel を配置し、その Dock プロパティを Left に設定します。その上にメニュー コントロールを移動します。MDI クライアント ウィンドウが縮小され、親フォームの残りの部分が占有されます。そして、子フォームはその領域に制限されます。ちょっと面倒なのは、メニューを再編成して、パネル内で使用できるはるかに小さいスペースに合わせなければならないことです。

于 2011-01-26T20:15:54.823 に答える
1

@Hans Passantには正しい答えがありますが、MDIフォームをまったく使用しないことで問題を解決することもできます. いくつかのオプション:

  • 別のフォームを使用する: 通常は大きな/最大化されたメニュー フォームを用意し、Parentプロパティをメニュー フォームに設定してその前に子フォームを起動します。
  • 単一のフォームを使用しますが、ドッキング ライブラリを使用します (過去にDockPanel Suiteを使用したことがあります)。これは基本的に、MDI フォームの再実装であり、追加機能を備えています。これを実行するには少し手間がかかりますが、優れた UI を構築することができます。

ただし、どちらも UI コードを大幅に変更する必要があります。

于 2011-01-26T20:49:47.647 に答える
0

子フォームを表示した後、各子フォームでBringToFront()を呼び出します。または、各子フォームのOnLoadメソッドにフックします。

childForm.OnLoad += (s, e) => (s as Form).BringToFront();
于 2011-01-26T19:49:19.737 に答える
0

そのフォームは、他の子コントロールの兄弟であるかのように見えます。そのウィンドウの子として開く必要がありますか? そのメイン フォームの子ウィンドウではなく、非モーダル ダイアログ ボックスのようにすることはできませんか?

そのメイン フォームとそれらのコントロールの兄弟内にある必要がある場合は、その 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);
于 2011-01-26T19:42:33.120 に答える
0

とてもシンプル

  1. mdi フォームの後に新しいフォーム (frm_chiled_mdi) を作成し、必要に応じて装飾します (ボタン、画像、ラベルなど)。

  2. MDI フォーム ロードにロードする

     MDI Form Load Coding..
    
     Dim frm As New frm_chiled_mdi        
     frm.MdiParent = Me
     frm.Show()
    
  3. frm_chiled_mdi のフォーム ロード コーディング

     Me.WindowState = FormWindowState.Maximized
     Me.BackgroundImageLayout = ImageLayout.Stretch
     Me.MaximizeBox = False
     Me.MinimizeBox = False
    
     Try
         Me.BackgroundImage = Image.FromFile(Application.StartupPath + "\\logo.jpg")
     Catch ex As Exception
     End Try
    
于 2020-12-29T01:57:38.060 に答える
0

私はこの問題を抱えていて、このように解決しました:

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();
    }
}
于 2016-03-09T13:47:53.780 に答える