我有一个带有几个分割器和面板的表单。中间是一个面板,最后设置了一个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表单处理这一切,并接受一个让我避免这种黑客的答案。
答案 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)
我会尝试像
这样的东西在OnResize处理程序中。