gpt4 book ai didi

.NET 表单 - 设置位置更改大小

转载 作者:行者123 更新时间:2023-12-04 07:03:03 25 4
gpt4 key购买 nike

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

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

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

表单的StartPosition 设置为Manual,FormBorderStyle 设置为FixedSingle,AutoScaleMode 设置为DPI 或Font(不知道怎么设置)。

有任何想法吗?谢谢。

最佳答案

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

将代码放入 Form.Load 事件的事件处理程序中修复了该问题。在 Load 触发时,句柄已经创建,一切似乎都在运行。

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

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

关于.NET 表单 - 设置位置更改大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1535821/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com