コンテナフォームには、フォームを開くためのメニューとボタンがあります。
ここで、フォームを開くと、これらのボタンとラベルが新しく開いたフォームに来るという問題に直面しています。
この問題を管理する方法を教えてください。新しいフォームを開き、これらのコンテナー フォームのコントロールをその背景に保持したいと考えています。
私も同じ問題を抱えています。以下に説明する代替ソリューションを取得しました。
そして、次のことを行いました
private void timer1_Tick(object sender, EventArgs e)
{
if ((int)MdiChildren.GetLength(0) > 0)
{
panel1.Visible = false;
}
else
{
panel1.Visible = true;
}
}
私はあなたがしたことを見たと思います。MDI を使用しており、メニュー ラベルとボタンを MDI 親フォームに配置します。MDI クライアント ウィンドウで何かを行いました。通常は濃い灰色です。おそらく、BackColor を変更する方法や、Windows のシステム カラーを変更する方法を理解したことがあるでしょう。はい、あなたのスクリーンショットが結果です。問題は、MDI クライアント フォームが MDI クライアント ウィンドウの親になっていることです。これにより、親フォームに配置したコントロールの背後に表示されます。
これに対する回避策はありません。UI を変更する必要があります。MDI を保持するには、親フォームに Panel を配置し、その Dock プロパティを Left に設定します。その上にメニュー コントロールを移動します。MDI クライアント ウィンドウが縮小され、親フォームの残りの部分が占有されます。そして、子フォームはその領域に制限されます。ちょっと面倒なのは、メニューを再編成して、パネル内で使用できるはるかに小さいスペースに合わせなければならないことです。
@Hans Passantには正しい答えがありますが、MDIフォームをまったく使用しないことで問題を解決することもできます. いくつかのオプション:
Parent
プロパティをメニュー フォームに設定してその前に子フォームを起動します。ただし、どちらも UI コードを大幅に変更する必要があります。
子フォームを表示した後、各子フォームでBringToFront()を呼び出します。または、各子フォームのOnLoadメソッドにフックします。
childForm.OnLoad += (s, e) => (s as Form).BringToFront();
そのフォームは、他の子コントロールの兄弟であるかのように見えます。そのウィンドウの子として開く必要がありますか? そのメイン フォームの子ウィンドウではなく、非モーダル ダイアログ ボックスのようにすることはできませんか?
そのメイン フォームとそれらのコントロールの兄弟内にある必要がある場合は、その 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);
とてもシンプル
mdi フォームの後に新しいフォーム (frm_chiled_mdi) を作成し、必要に応じて装飾します (ボタン、画像、ラベルなど)。
MDI フォーム ロードにロードする
MDI Form Load Coding..
Dim frm As New frm_chiled_mdi
frm.MdiParent = Me
frm.Show()
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
私はこの問題を抱えていて、このように解決しました:
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();
}
}