问题标签 [mdi]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
32150 浏览

c# - 更改 MDI 表单的背景

如何在 C# 中更改 MDI FORM 的背景颜色?

我使用背景颜色属性更改了它,但颜色没有更改。

我应该怎么做才能执行此任务?

0 投票
2 回答
1532 浏览

.net - MDI 子窗体调用,而不是生成

我有一个 MDI 表单,里面有 3 个嵌套的子级。截至目前,它所能做的就是显示一个新表单。例如:每次按下菜单按钮时,都会创建新的子窗体(Form1)。现在,如果我第二次或随后按下相同的菜单按钮,则会创建一个的Form1,它会出现在前一个的上方。

我想要的是每次触发事件处理程序(父表单上的菜单 item_click),而不是生成一个完全“新”的子表单(弹出一个新窗口),而是拉起适当的子表单连接到触发器。

我想这就像重用一个对象。

任何帮助将不胜感激。

这是我正在使用的代码示例:

0 投票
1 回答
838 浏览

visual-c++ - MDI : 选项卡上的文件名

我有一个最初没有打开主窗口的 MDI 应用程序。当您单击文件并选择新建时,它会打开一个带有默认文件名的新选项卡。

我的应用程序应该像这样工作,当您单击文件并选择新建时,会出现一个对话框,询问您要创建的文件的名称。单击“确定”后,您在文本框中输入的名称应显示在选项卡上。

如何在选项卡上设置名称?

谢谢。

0 投票
1 回答
2935 浏览

winforms - MDI WinForm 应用程序和重复子窗体内存泄漏

这是一个 WinForm MDI 应用程序问题(.net framework 3.0)。它将在 C# 中进行描述。抱歉,它有点长,因为我试图让事情尽可能清楚。

我有一个 MDI 应用程序。在某些时候,我发现一个 MDI 子表单从未发布过。有一个菜单可以创建 MDI 子窗体并显示它。当 MDI 子窗体关闭时,它应该被销毁,并且它所占用的内存应该还给 .net。但令我惊讶的是,这不是真的。所有 MDI 子窗体实例都保存在内存中。这显然是“内存泄漏”。好吧,这不是 .net 中的真正泄漏。只是我认为封闭形式应该是死的,但不知何故,至少有一个来自外部世界的未知参考仍然与封闭形式联系在一起。

我在网上阅读了一些文章。有人说,当 MDI 子窗体关闭时,我应该取消所有事件处理程序的连接,否则某些事件处理程序可能会使我的窗体保持活动状态。有人说应该在关闭表单之前清理 DataBindings,否则 DataBindings 将添加对某些全局 Hashtable 的引用,从而使我的表单保持活动状态。

我的表格包含很多东西。许多事件处理程序和许多 DataBindings 和许多 BindingSources 以及一些包含用户控件和 HelpProvider 的可疑控件。我创建了一个大方法,从所有相关控件中取消连接所有事件处理程序,清除所有 DataBindings 和 DataSources。HelpProvider 和用户控件被小心处理。

最后,我发现,我不必清除 DataBindings 和 DataSources。事件处理程序肯定会导致问题。而MDI的表单结构也有所贡献。

在我的实验中,我发现,如果你创建一个 MDI 子窗体,即使你关闭它,内存中仍然会有一个实例。参考来自主窗体的 PropertyStore。这意味着,除非主窗体关闭(应用程序结束),否则内存中总会有一个 MDI 子窗体实例。好消息是,无论您打开和关闭子窗体多少次,都只会出现一个实例,而不是大的“泄漏”。

当涉及到事件处理程序时,事情变得更加棘手。我必须解决这个问题,我表单上的所有事件处理程序都是匿名事件处理程序。这是一个示例代码:

wherebtnSave_Click也是 MDI 子窗体中的一个方法。对于各种控件和各种类型的事件,上述情况总是如此。对我来说,这是一个双向循环引用。btnSave 通过事件处理程序保持对 MDI 子窗体的引用。MDI 子窗体保留 btnSave 实例的引用。再次对我来说,这种双向循环引用不应该对.net 的垃圾收集器造成任何问题。这意味着我不必在处理表单时显式取消连接事件:

但事实并非如此。对于某些事件处理程序,它们是安全的。忽略它们不会导致任何重复实例。对于其他一些事件处理程序,它们会导致一个实例保留在内存中(与MDI表单结构类似的效果,但这次是由挂起的事件处理程序引起的)。对于其他一些事件处理程序,它们将导致在内存中打开每个实例。我对这三种类型的事件处理程序之间的差异感到非常困惑。控件的创建方式相同,事件的附加方式相同。有什么区别?(不要告诉我是事件处理方法有所不同。)任何人都有这种有线场景的经验并且对我有答案吗?非常感谢。

所以现在,为了安全问题,我将不得不在处理表单时断开所有事件处理程序。这将是每个控件的一长串类似代码。是否有一种使用反射以递归方式从控件中删除事件的通用方法?性能问题呢?

这就是我的故事的结尾,我仍然在我的问题中间。如有任何帮助,我感谢您。

0 投票
1 回答
2979 浏览

c# - 创建选项卡式 MDI 界面

我正在使用 C# 2005 开发 Windows 应用程序。我打算使用选项卡容器来显示子表单。我使用了菜单条来显示菜单并设置了 MainMenu 表单的 IsMDIContainer = true 属性。MainMenu 表单还包含一个选项卡控件,我计划在选项卡控件中将所有子表单显示为 Tap Pages。

到目前为止,当用户选择菜单选项时,我已经能够添加标签页。但我不知道如何在标签页中显示子表单本身。

我在菜单点击事件中使用了以下代码。

如何在标签页中正确显示子表单?我不想要一个文件-> 新类型的应用程序,其中菜单单击事件显示相同的(空白)表单。我的菜单选项应该每个都显示一个独特/不同的形式。

谢谢你。

拉利特·库马尔·巴里克

0 投票
2 回答
2772 浏览

delphi - 使用整个客户区的子窗体?

我想显示一个将使用整个客户区的 MDI 子窗口,即。灰色部分不在任务窗格的右侧,并让子窗口显示其标题栏和边框:

http://img149.imageshack.us/img149/3204/delphimdichildwindowwit.jpg

这是代码,它不能按计划工作:

除了自己计算坐标(例如ClientWidth等)之外,有没有办法做到这一点?

谢谢你。

0 投票
1 回答
1146 浏览

c# - Mdiparent 上的 C# glass

我正在尝试在 mdiparent 上使用 DwmExtendFrameIntoClientArea 方法。

但是,玻璃无法正确渲染。这是我可以绕过的 mdiparent 的限制吗?如果表单未设置为 mdicontainer,则玻璃会完美呈现。玻璃区域涂成白色而不是玻璃。

0 投票
1 回答
3864 浏览

c# - 如何从父窗体标题栏中删除 MDI 子文本?C# .NET

我有一个充当 MDI 父表单的表单和几个其他表单作为 MDI 子表单。子窗口具有 FormBorderStyle.None 和 ControlBox = false,因此 MDI 子窗口中没有边框内容显示在 MDI 父窗口中。但是 MDI 子项在我的应用程序中最大化运行,在这种情况下,主窗体窗口标题文本始终包含子窗体文本,如下所示:

如何摆脱"- [Child title]"主标题栏中的部分?我看过 Form.Text 属性,它确实包含屏幕上可见的完整标题。但是将 Text 设置为其他内容只会更改第一部分,始终添加子标题并且不能以这种方式删除。尽管 .NET Reflector 并没有带来任何有趣的东西,但我还是简短地走了一圈。

0 投票
3 回答
16377 浏览

c# - 如何去除 MDI 父窗体上的灰色背景?

我想做的是在标记为 mdi 容器的表单上画一些玻璃。但是,一旦设置了 IsMdiContainer,表单就会将 MdiClient 添加到它的控件列表中。此时,父表单发生了一些事情——几乎就像一个深灰色面板停靠在 MdiClient 所在的整个表单上。

然后,我将执行以下操作以将 MdiClient 控件移开一点:

然后,这使得实际的 MdiClient 区域更小,因此我们可以看到它背后的内容(承载子窗体的位),并且很明显父窗体不是绘画或其他东西。

可以在这里看到:http: //img525.imageshack.us/img525/8605/mdiglassproblem.png

我现在需要以某种方式让 MdiClient 后面的区域(在玻璃部分呈现为白色的深灰色部分)消失。

有任何想法吗?

PS - 在 Vista 中使用 DwmExtendFrameIntoClientArea 方法渲染玻璃。

0 投票
4 回答
26765 浏览

c# - 如何在 mdiparent 窗口的中心加载 mdichild

大家好,

我有这段代码,其中使子窗口加载的窗口属性位于 mdiparent 的中心。

但不是让子窗口在中心弹出,而是在左侧加载。谁可以帮我这个事。请参考下面的截图。

我什至尝试在 vb 中做同样的事情。即使在那里我得到同样的错误。我认为 FormStartPosition.CenterParent 的属性是虚拟的。

替代文字 http://img13.imageshack.us/img13/7003/errorprb.jpg