2011-01-19 65 views
1

我有一個包含多個分隔線和麪板的窗體。中間是一個以TWebBrowser設置爲與alClient對齊的面板。設置爲alClient的TWebBrowser在客戶端區域更改時不會調整大小

以前這個工作很好。但是,在使用Internet Explorer 8的Windows 7上,瀏覽器調整不正確。其他一切(即面板)都是正確的尺寸,而不是網絡瀏覽器。有時當你點擊進入瀏覽器時,或者當你滾動瀏覽器的時候會跳到正確的大小。但這並不是100%的時間。

我試圖直接處理調整大小,並強制控件更改大小。我似乎無法找到一種能夠產生任何區別的方法(即.Invalidate; .Repaint; .Update;)TWebBrowser是包裝Internet Explorer控件的OLE控件(ActiveX)。關於如何進行調整大小的任何想法都會發生?

更新的背景:

我這個縮小到只有當我有我的父親改爲其網站另一個表單中子窗體發生。我的TWebBrowser控件位於子窗體上,我隨時可以使用它來顯示HTML文檔。

在我的父窗體中,我有一個網格,一個分割器和一個面板,網格設置爲對齊頂部和麪板集以對齊客戶端。我的子表單(稱爲THtmlViewer)將其父設置爲面板。 THtmlViewer窗體設置爲alClient並且子窗體上的TWebBrowser控件也設置爲對齊客戶端。

如果我在THtmlViewer窗體的窗體大小上做任何事情,我會遇到這個問題。任何直接在FormResize中或直接使用align屬性的東西。但是,如果我從父窗體調用我的調整大小,一切工作正常。

關鍵似乎是關閉THtmlViewer窗體中的調整大小代碼。如果我留下一個OnResize處理程序或對齊集,那麼它與父級中的操作無關,調整大小操作不正確。

我仍然困惑爲什麼這是必要的,爲什麼我不能強制它在正確的調整大小(THtmlViewer)更新。

另外,我還注意到,Windows 7上的Delphi 2007與IDE中的「歡迎頁面」有完全相同的問題。

我已經解決了該問題,方法是將子窗體的OnResize設置爲nil,然後從父窗口的OnResize處理程序中調用我的內部ForceResize。我仍然希望從THtmlViewer表單處理這一切,並接受讓我避免這種攻擊的答案。

回答

0

我會嘗試像

  • 改變WebBrowser1.Align到alLeft,
  • 設置WebBrowser1.Width到WebBrowser1.Width - 1和
  • 重新設置WebBrowser1.Align爲alClient
在OnResize處理程序中的

+1

我更新了一些更詳細的問題。事實證明,這些來自「父」形式的調用將起作用,但是在我的嵌套形式中,OnResize處理程序中沒有任何內容似乎正常工作。 – 2011-01-24 21:48:39

1

也許對於這個問題,同樣的解決方案的工作原理:Resize problem using AcroPDF in Delphi

在onResize受到:

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

由於某種原因,如果我嘗試使用我的Web瀏覽器控件調用Focus控件,我會收到異常。我有一個不尋常的設置嵌套窗體,可能會導致問題。我重新父母形式,而不是使用框架。集中控制可能會奏效,但我無法證實。我找到了一個不同的解決方案,所以我沒有試圖得到這個工作。 – 2011-01-24 21:15:01

2

要調整控件時,其容器的尺寸改變,你還有其他兩個選項除了使用「公正」 align屬性:

  • 使用不帶Align屬性的Anchors屬性,即將Align屬性設置爲alCustom或alNone,然後設置t他根據您的需求定位。由於「對齊」屬性對於設置「錨點」來說是短暫的,所以這取決於相同的對齊處理,因此在您的情況下可能無法正常工作。

  • 爲TWebBrowser所在的容器的OnResize事件提供一個處理程序,並手動將TWebBrowser的高度和寬度設置爲容器的高度和寬度(可根據容器中的任何邊距進行調整)。

這就是說,我沒有Windows7,所以我不能擔保,這不會帶來更多的麻煩。

如果您的TWebBrowser在滾動或點擊時跳轉到正確的大小,則表示控件尺寸正確,從未收到或處理消息以實際響應更改。

這可能是因爲重新對齊控件試圖防止不必要的重新繪製和遞歸,並以某種方式混淆了。使用OnResize方法可能會獲得更好的結果,因爲它「直接與TWebBrowser對話」。

重繪對於Invalidate和Update來說是「簡單」的簡寫,除非控件的ControlStyle中有csOpaque,在這種情況下,繪畫看起來更直接。所以你可以嘗試擺弄TWebBrowser的透明屬性和/或它所在的容器。

如果一切都失敗了,你可以嘗試直接發送一個WM_PAINT(或類似的)到TWebBrowser。對於TWebBrowser的OnResize事件或它所在的容器的實例。 TWebBrowser的WM_Paint處理程序調用OleDraw,它使用ClientRect直接與ActiveX進行通信,當從OnResize事件調用時,它應具有正確的維度。

+0

發送WM_PAINT消息沒有任何影響。當控件知道它的新尺寸時,我可以看到面板的顏色改變顏色,但WebBrowser控件的實際內容仍然只在舊尺寸內繪製。 – 2011-01-24 21:47:05

1

我有類似的問題。

通過將TPanel放在TWebBrowser的下面並將網頁瀏覽器對齊到alClient來解決。

相關問題