Windows的哪个外部功能启动WM_SIZE?

时间:2013-02-01 08:03:23

标签: delphi vcl

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

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

我在平板电脑上使用远程调试。在经过长时间的评估和调试之后,我发现WM_SIZE没有被我的一个框架所推崇。每个框架都包含在其父级Align = alClient中。

在我的机器上,此消息已发送良好,当然,UI具有正确的行为。

Windows Unit的哪个外部功能发送WM_Size消息代码?


我将通过更多细节解释这个问题。

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

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

MainForm - >一些框架 - > PageControl - > TabSheet - >第1帧 - >式2。

请注意:

  • 我的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_NCCALCSIZEWM_SIZE

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

2 个答案:

答案 0 :(得分:0)

在更改大小后,WM_SIZE将发送到窗口。这意味着系统会在更改大小后自动将WM_SIZE发送到您的帧。要更新你的框架我建议打电话给其中一个: + UpdateWindow API + YourFrame.Invalidate 要么 YourFrame.Repaint

答案 1 :(得分:0)

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