2

我正在开发一个应用程序,该应用程序将其形式显示为一系列相互堆叠的模式窗口。所有表格都放置在屏幕的中心。当用户在屏幕上移动表单时,只有最上面的一个会移动,其他的留在中心并且不能移动,因为它们被最上面的对话框挡住了。

我正在尝试编写一个表单移动代码,它将所有表单移动到新位置,以及在当前非居中位置打开新表单的代码。

但是在执行后者时会发生一些奇怪的事情 - 使用其他表单的位置(最底部的表单)在非居中位置打开一个新表单。如果我以编程方式设置表单的 Location 属性,它的大小会发生变化 - 表单会变小。它的 Size 属性从 Designer GUI 中设置的 (240, 320) 更改为较小的 ClientSize (234, 294),它出现在 Designer 生成的代码中。我只在网上找到一篇引用这个问题的帖子,但没有答案。如果我单独保留 Location 属性,则表单会以原始大小正确显示。

表单的StartPosition设置为Manual,FormBorderStyle为FixedSingle,AutoScaleMode为DPI或Font(我不知道gow要设置这个)。

有任何想法吗?谢谢。

4

1 回答 1

3

我会回答我自己的问题。似乎该行为源于在操作系统尚未形成表单时设置 Location 属性,也就是说,它还没有创建句柄并且其 IsHandleCreated 为 False。我已经调试了.NET代码本身,并且有一个Debug.Assert调用,其中“不要在CreateHandle之前使用它”或类似的东西作为调用堆栈上某个有问题的代码周围的断言参数。这给了我第一个提示。

将代码放入 Form.Load 事件的事件处理程序中解决了这个问题。在 Load 触发时,句柄已经创建并且一切似乎都可以正常工作。

既然我知道了原因,我已经在网上搜索了“构造函数与加载事件处理程序初始化”,相关讨论暗示您需要将控件的处理推迟到加载。这有点道理,因为 .NET 控件是操作系统外部实体的包装器(并且需要创建这些实体才能使用),但同时没有意义,因为 Designer 代码似乎能够在句柄创建得很好。如果那有意义的话..

TLDR:推迟控制访问和使用,直到 Form.Load 事件触发。

于 2009-10-08T10:13:49.117 回答