2008-11-28 49 views
1

Hiya - 由我的一位朋友指出你們。我有一個MDI應用程序(C#,Winforms,.NET 2.0,VS2005,DevExpress 8.2),我的一個表單行爲非常奇怪 - 沒有正確重繪自身,它與同一個表單類的另一個實例重疊。MDI兒童刷新/重新繪製問題(C#,Winforms,.NET 2.0,VS2005,DevExpress 8.2)

表單包含一個自定義控件(其中包含各種DevExpress控件),並從基本窗體繼承而來(它本身是繼承的)。

由於表單繼承問題(舊的栗子),在構造函數中有一些控制重新排列正在進行。

問題1(次要):除非重新調整窗體大小,否則此控件重新定位/調整大小似乎不起作用,所以在重新排列後我將寬度向上和向下微移一個像素。醜,哈克,我真的很喜歡不必這樣做。

問題2(主要): 如果顯示窗體,然後使用API​​調用SetParent附加到MDI窗體,當我顯示第二個實例時,兩個窗體的各個部分在它們重疊的位置未正確繪製 - 最重要的是落後於現有的 - 當表格移動時,這個問題變得更糟,使得它們基本上不可用。其他兒童形式(如果存在)的不同類型似乎不受影響...

停止按鈕:我已經確定它不必是2個子窗體的實例。只有一個問題還存在問題 - 主要是在表單的邊緣,比如正在刷新的區域比表單本身小。

如果使用子窗體的.MDIParent屬性設置父項,則不會發生此問題 - 但由於窗體可能由託管在非.Net應用程序中的控件顯示,因此我們無法執行此操作。此外,即使現有的(不同類型的)子項最大化,並且只能使用SetParent,我也需要顯示非最大化的子窗體。

我已經嘗試刷新()在這種類型的所有形式(我有一個控制器,它們的列表),但沒有喜悅。我試圖從具有相同繼承結構的基本應用程序中重現此效果,但我不能。顯然這是關於表單的東西 - 因爲我昨天從頭重新創建表單,它仍然是一樣的,它必須是代碼 - 但是什麼?

我不是最熱門的表格繪畫活動等,所以我錯過了什麼?

+0

你太......太大了,我咀嚼不了。 Prob1嘗試使用戶界面無效,以便重新繪製。和形式繼承...壞行爲。 – Gishu 2008-11-28 10:45:18

+0

我試過Invalidate() - 這只是Refresh(),但延遲到一個方便的點。刷新()似乎並沒有做很多好事。 表單繼承是一個好主意*。這是VS的實現sux。嘆。控制似乎沒問題,這就是我被誘惑的原因。 – kpollock 2008-11-28 11:54:12

回答

0

啊哈!

我在顯示錶單之前更改了代碼中的FormBorderStyle。我刪除了這條線,問題就消失了...

這會爲我做。 :-)

1

是的,這樣做。更改FormBorderStyle要求Windows窗體從頭開始重新創建窗口,現在在CreateWindowEx()調用中使用不同的樣式標誌。這將使它完全忘記您使用SetParent()P/Invoke設置的父項。還有很多其他的屬性會導致這種情況發生。通過在OnHandleCreated()方法的重載中進行這些調用來避免遇到的麻煩。

更好的是,通過將所有控件和邏輯放在UserControl中,完全避免SetParent()等麻煩的API。

0

我知道這是一個古老的線程,但我確實爲我解決了這個問題。這可能會幫助有類似問題的人。

我的問題: 我們有我們在通過分離器分離的父窗口中嵌入兩個外部應用程序的應用程序。它用於並排顯示來自兩個應用程序的信息。我們面臨的問題是兩個子窗口在父窗口上繪製得很好(使用SetParent,SetWindowLong和MoveWindow),但是在子窗口中移動或執行操作時,它們會產生繪畫/刷新問題(更具體,父面板將被拖到子窗口上)

在閱讀了大量有關嵌入窗口,SetParent問題的文章之後,MSDN頁面http://msdn.microsoft.com/en-us/library/windows/desktop/ms632600(v=vs.85).aspx給了我一個線索。

解決方案: 使用SetWindowLong函數(設置樣式)使用WS_CLIPCHILDREN風格 -

::SetWindowLong(hwnd, GWL_STYLE, WS_VISIBLE | WS_CLIPCHILDREN)); 

這個款式確實是它可以防止父窗口的重新繪製的子窗口所佔用的面積。這完全解決了我的問題。