0

我有一个非常奇怪的问题。我在Win7平台上使用D2007。

我的应用程序在第一台 Win7 机器(我的)上运行良好,但 UI 无法在第二台 Win7 系统(三星平板电脑)上正确刷新。

我在平板电脑上使用远程调试。经过长时间的评估和调试后,我发现WM_SIZE我的一个框架没有启动。每个框架都包含在她的父级和Align = alClient.

在我的机器上,这条消息发送得很好,当然,用户界面也有正确的行为。

Windows Unit 的哪个外部函数发送 WM_Size 消息代码?


我将更详细地解释这个问题。

当应用程序最大化或调整大小时,我看到两台 Win7 机器之间的 UI 刷新行为有所不同。

某些帧的大小已正确调整,但其中一个未正确调整。结构如下:

MainForm -> 一些框架 -> PageControl -> TabSheet -> Frame1 -> Frame2。

注意 :

  • 我的 UI 在大多数计算机上都能正常运行。

  • 我使用标准的windows机制

在此结构中,直到包含 TabSheet 的所有帧都被调整大小,但 Frame1 没有。帧是在运行时创建的。

因为我知道 TabSheet 的名称,所以我可以在断点处停下来查看 WMSize。

我在其中使用了一些条件断点TWinControl.AlignControls并抓住了Frame1.

使用断点Classes.StdWndProc,我可以跟踪发送到的消息Frame1.Handle

当一切正常时:

  • $0046 : WM_WINDOWPOSCHANGING

  • $0083 : WM_NCCALCSIZE

  • $0085 : WM_NCPAINT

  • $0014 : WM_ERASEBKGND

  • $0047 : WM_WINDOWPOSCHANGED

  • $0005 : WM_SIZE

当调整大小失败时:

  • $0046 : WM_WINDOWPOSCHANGING

  • $0085 : WM_NCPAINT

  • $0014 : WM_ERASEBKGND

  • $0047 : WM_WINDOWPOSCHANGED

因为,代码是相同的,操作系统在这两种情况下都是 Win7,我不明白这个问题。我只知道这两条消息WM_NCCALCSIZE,并且WM_SIZE在第二种情况下从未发送过。

这就是我寻找返回WM_SIZE响应的函数的原因。

4

2 回答 2

0

WM_SIZE 在大小改变后发送到窗口。这意味着系统会在更改大小后自动将 WM_SIZE 发送到您的框架。要更新您的框架,我建议调用以下之一:+ UpdateWindow API + YourFrame.Invalidate 或 YourFrame.Repaint

于 2013-02-01T08:56:20.610 回答
0

我给你我的回复,我不能在星期五发布。后来我发现问题似乎来自Win7 / VCL D2007的一个错误。我尝试使用用 DXE3 编译的 exe 来解决问题。

于 2013-02-04T07:05:37.337 回答