当客户区域更改时,对齐设置为alClient的TWebBrowser将不会调整大小

时间:2011-01-19 23:48:33

标签: delphi internet-explorer

我有一个带有几个分割器和面板的表单。中间是一个面板,最后设置了一个TWebBrowser来对齐alClient。

过去这种方法运作良好。但是,在带有Internet Explorer 8的Windows 7上,浏览器未正确调整大小。其他所有内容(即面板)都是正确的大小,而不是Web浏览器。有时当您点击浏览器时,或者更频繁地滚动浏览器时会跳转到正确的大小。但这并非100%的时间都会发生。

我正在尝试直接处理调整大小并强制控件改变大小。我似乎无法找到一个有所作为的方法(即.Invalidate; .Repaint; .Update;)

TWebBrowser是一个包含Internet Explorer控件的OLE控件(ActiveX)。关于如何进行调整大小的任何想法都会发生?

更新背景

我将此范围缩小到仅当我有一个子表单时,我将父表单更改为将表单放在另一个表单中。我的TWebBrowser控件是在我需要显示HTML文档时使用的子表单上。

在我的父窗体中,我有一个Grid,一个分割器和一个面板,网格设置为Align top,面板设置为对齐客户端。我的子窗体(称为THtmlViewer)将其父窗口设置为面板。 THtmlViewer表单设置为alClient,子表单上的TWebBrowser控件也设置为对齐客户端。

如果我在THMLViewer表单的大小调整表格中做了什么,我遇到了这个问题。任何直接在FormResize中或间接使用对齐属性的东西。但是,如果我从父表单调用我的调整大小,一切正常。

关键似乎是关闭THtmlViewer表单中的调整大小代码。如果我留下OnResize处理程序或对齐集,那么无论我在父对象中做什么都没关系,调整大小都没有正确完成。

我仍然感到困惑,为什么需要这样做以及为什么我不能强制它在正确的调整大小(THtmlViewer)中更新。

作为旁注,我还注意到Windows 7上的Delphi 2007与IDE中的“欢迎页面”存在完全相同的问题。

我通过添加一个方法将子表单的OnResize设置为nil然后从父表的OnResize处理程序调用我的内部ForceResize来解决这个问题。我仍然希望从THtmlViewer表单处理这一切,并接受一个让我避免这种黑客的答案。

4 个答案:

答案 0 :(得分:2)

要在容器更改大小时调整控件大小,除了使用“只是”Align属性之外,还有两个其他选项:

  • 使用不带Align属性的Anchors属性,即将Align属性设置为alCustom或alNone,然后根据需要设置锚点。由于Align属性是设置Anchors的简称,这取决于相同的对齐处理,因此在您的情况下可能不起作用。

  • 为TWebBrowser所在的容器的OnResize事件提供处理程序,并手动将TWebBrowser的高度和宽度设置为容器的高度和宽度(可选择根据容器中的任何边距进行调整)。 / p>

那就是说,我没有Windows7,所以我不能保证这不会花费更多的东西。

如果您的TWebBrowser在滚动或点击时跳转到正确的大小,则表示控件的大小正确,从未接收或处理过消息以实际响应更改。

这可能是因为重新排列控件试图防止不必要的重新绘制和递归,并以某种方式混淆了。然后使用OnResize方法可以获得更好的结果,因为它“直接与TWebBrowser对话”。

重绘是“只是”Invalidate和Update的简写,除非控件在其ControlStyle中有csOpaque,在这种情况下,绘画似乎更直接。因此,您可以尝试使用TWebBrowser的透明属性和/或它所在的容器。

如果所有其他方法都失败了,您可以尝试直接向TWebBrowser发送WM_PAINT(或类似)。例如,在TWebBrowser的OnResize事件或它所在的容器中。 TWebBrowser的WM_Paint处理程序调用OleDraw,它使用ClientRect直接与ActiveX通信,当从OnResize事件调用时,它应具有正确的尺寸。

答案 1 :(得分:1)

也许这个问题的解决方案有效:Resize problem using AcroPDF in Delphi

在OnResize中:

if Visible and (WebBrowser1 <> nil) then 
begin
  FocusControl(nil);
  FocusControl(WebBrowser1);
end;

答案 2 :(得分:1)

我有类似的问题。

通过在TPanel下方放置TWebBrowser“并将网络浏览器与alClient对齐来解决问题。

答案 3 :(得分:0)

我会尝试像

这样的东西
  • 将WebBrowser1.Align更改为alLeft,
  • 将WebBrowser1.Width设置为WebBrowser1.Width - 1和
  • 再次将WebBrowser1.Align设置为alClient

在OnResize处理程序中。