MDI表单内部是托管mdi子表单的客户端区域.我如何知道该区域有多大?到目前为止,我能想出的最好的方法是找到父级潜在客户区域的总大小(mdiparent.ClientRectangle),然后减去从客户区域带走的工具栏等组件的大小.有没有更好的办法?
我有一个MDI表格.在此MDI表单中,我可以使用以下命令打开一些子表单:
这是在 MainForm
Form1 f1 = new Form1;
f1.MdiParent = this; //this refers to MainForm (parent)
f1.Show();
Run Code Online (Sandbox Code Playgroud)
这按预期工作!
但是现在,当我处于子形式(Form1 - > f1)时,我想打开另一个形式作为孩子,MainForm但是当我使用this关键字时,它会受到影响f1.如何打开新表单f1并将其设置MdiParent为MainForm?
当用户试图打开已在MDIParent中打开的子表单时,我想避免多次出现我的子表单.避免这种情况的一种方法是禁用Controller(在我的情况下是BUTTON),但我也给了这个函数一个快捷键(Ctrl+ L).因此,如果用户键入Ctrl+ L,则会打开相同的子表单,并且我可以看到两个子表单都在MDI中.
private void leadsToolStripMenuItem_Click(object sender, EventArgs e)
{
frmWebLeads formWeblead = new frmWebLeads();
formWeblead.MdiParent = this;
formWeblead.WindowState = System.Windows.Forms.FormWindowState.Maximized;
formWeblead.Show();
}
Run Code Online (Sandbox Code Playgroud)
我想避免这种情况.我怎样才能做到这一点?

在图像中,您可以看到, 当用户第一次使用菜单(LEADS)打开并且第二次通过快捷键打开时,子表单名称 在线潜在客户被打开两次.我不希望这种情况发生.如果表单已经打开,应该避免打开另一个相同的表单......怎么做?
我要做的是在标记为mdi容器的表格上画一些玻璃.但是,只要设置了IsMdiContainer,表单就会在其控件列表中添加一个MdiClient.此时,父表单会发生一些事情 - 几乎就像深灰色面板停靠在MdiClient所在的整个表单上.
我接下来要做的是将MdiClient控件移开一点:
foreach(var c in Controls)
{
if(c is MdiClient)
{
var client = (MdiClient)c;
client.BackColor = Color.Red;
client.Dock = DockStyle.None;
client.Size = new Size(this.Width-100, this.Height);
break;
}
}
Run Code Online (Sandbox Code Playgroud)
然后,这使得实际的MdiClient区域变小,以便我们可以看到它背后的内容(托管子窗体的位),并且显然父窗体不是绘画或其他东西.
从这里可以看出:http://img525.imageshack.us/img525/8605/mdiglassproblem.png
我现在需要以某种方式获得MdiClient背后的区域(在玻璃部分呈现白色的深灰色部分)消失.
有任何想法吗?
PS - 在Vista中使用DwmExtendFrameIntoClientArea方法渲染Glass.
我试图在我的一个应用程序中实现一个简单的Web浏览器控件.这是为了帮助将Web应用程序集成到我正在创建的工具集中.
问题是,这个网络应用程序绝对喜欢弹出窗口....
当弹出窗口打开时,它会在IE窗口中打开,该窗口不是我的主窗口所属的MDI容器窗体的子窗口.
如何通过单击我的WebBrowser中的链接创建任何和所有弹出窗口作为我的MDI容器的子项(类似于设置窗体的MDIParent属性)?
提前致谢.
有没有办法轻易地平铺mdi父母的所有形式的孩子?我正在寻找Windows提供的大部分功能,平铺级联.有人知道一个简单的方法吗?
我试图在MDI父级上检测到我的MDI子窗体何时关闭,并做出相应的反应.在MDI子女关闭之前,MDI家长不应做任何事情.这是我的代码,我不确定我做错了什么,但我添加的表单关闭事件方法永远不会被调用...
如果不明显,则以下代码位于MDI父类中.
private void keyValidation()
{
if (Properties.Settings.Default.Unlock == true)
return;
else
{
menu.Enabled = false;
statusStrip.Enabled = false;
ValidationForm vf = new ValidationForm();
vf.MdiParent = this;
vf.Show();
vf.FormClosed += new FormClosedEventHandler(validationForm_FormClosed);
}
}
void validationForm_FormClosed(object sender, FormClosedEventArgs e)
{
MessageBox.Show("Got here");
if (Properties.Settings.Default.Unlock == true)
{
menu.Enabled = true;
statusStrip.Enabled = true;
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助!
我将图像绑定到GridView资源文件夹.当我加载该窗体时,图像将是bind.But当从MDIPARENT窗体Image 调用该窗体时将不会显示.我在下面附加图像和代码.
DataGridViewImageColumn ic = new DataGridViewImageColumn();
ic.HeaderText = "Payment";
ic.Image = null;
ic.Name = "cImg";
ic.Width = 50;
dtGrCustBal.Columns.Add(ic);
foreach (DataGridViewRow row in dtGrCustBal.Rows)
{
DataGridViewImageCell cell = row.Cells[10] as DataGridViewImageCell;
cell.Value = Properties.Resources.icon_payment_cash_small;
}
Run Code Online (Sandbox Code Playgroud)
CustomerBalance ChildCustBal = new CustomerBalance();
ChildCustBal.MdiParent = this;
ChildCustBal.Show();
Run Code Online (Sandbox Code Playgroud)
从MDI父级加载:
直接加载:

默认的MDI父控件有一个大的"桌面"区域,可以显示多个子窗体.用户可以将表单拖动到此桌面区域的边缘,以便大多数子表单不在屏幕上.(然后滚动条出现在MDI父级中)我不喜欢这个功能.有没有办法锁定桌面区域的边缘,以便子窗体保持完全可见?