2008-12-17 69 views
5

我已經創建被手動的東西創建像設置一個用戶控件的父防止它從透明

MyUserControl ctrl = new MyUserControl(); 

控制已被設計成具有簡單的用戶控制背景色= Color.Transparent並且工作正常,直到我將該控件的設置爲表單,此時它變爲表單的顏色。

可能聽起來像它的透明,但它所做的是隱藏表單上存在的所有控件。我並不是100%確定它的控制能夠獲得堅實的背景或其他發生在我將其掛起時發生的其他事情,這會阻止顯示其他控件。

基本上,如果你這樣做

  • 創建一個表單
  • 放置一個按鈕就可以了
  • 單擊處理程序的按鈕,你就以下

MyUserControl ctrl = new MyUserControl(); 
ctrl.Parent = this; 
ctrl.BackColor = Color.Transparent; 
ctrl.Size = this.Parent.ClientRectangle.Size; 
ctrl.Location = this.Parent.ClientRectangle.Location; 
ctrl.BringToFront(); 
ctrl.Show(); 

基本上我希望用戶控件覆蓋整個表單,同時在表單上顯示下層控件(因此爲透明背景)。我不想將它添加到窗體控件集合中,因爲它不是真的屬於窗體,它只是顯示在其他任何東西頂部

我試着做同樣的事情,但沒有設置父,但然後控制沒有表現出來。

謝謝!

編輯:如果我重寫UserControl中的OnPaintBackground方法,並防止背景被繪,那麼它的工作原理,然而,這與使用DrawImage,這是有道理的控制使用PNG圖像im繪畫的透明部分。

回答

6

Windows窗體並不真的支持透明控件。
您可以通過重寫控件的CreateParams屬性並設置自定義樣式(在Google上查找它)來解決此限制。
此外,您必須重寫您的控件的繪畫,以便不僅您的控件,而且父控件也重繪。原因是背景必須在您的控件繪製自己之前繪製。
最後,您應該重寫OnPaintBackground方法,以確保沒有背景被繪製。

很笨拙,並不完美,但它應該工作。

+0

你的意思是我應該在創建控制窗口時使用WS_CLIPCHILDREN標誌嗎? – TheCodeJunkie 2008-12-17 09:10:56