2014-03-27 107 views
4

我想創建一個應用程序,用戶可以在透明背景中移動三個標籤。如果一個標籤將位於另一個上面,則應該可見第二個標籤。 爲此目的我創建的自定義控制衍生物,因爲我想自定義標籤有一個透明的背景 - >等我經由的SetStyle()透明背景與多個控件

Public Class Customlabel 
    Inherits System.Windows.Forms.Control 

    Public Sub New() 
     MyBase.New() 
     Me.SetStyle(Windows.Forms.ControlStyles.UserPaint, True) 
     Me.SetStyle(Windows.Forms.ControlStyles.DoubleBuffer, True) 
     Me.SetStyle(Windows.Forms.ControlStyles.SupportsTransparentBackColor, True) 
     InitializeComponents() 
    End Sub 

    Private Sub InitializeComponents() 
     Me.Width = 100 
     Me.Height = 100 
    End Sub 

    Protected Overrides Sub OnPaint(e As PaintEventArgs) 
     MyBase.OnPaint(e) 
     e.Graphics.DrawString("Test", New System.Drawing.Font("Arial", 12), New System.Drawing.SolidBrush(Color.Black), New System.Drawing.Point(0, 0)) 
    End Sub 
End Class 

在主形式設置SupportsTransparentBackColors和UserPaint我創建的標籤作爲你可以看到:

Public Class Form1 

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
     Dim AB As Customlabel = New Customlabel 
     AB.Left = 20 
     AB.Top = 20 
     AB.Name = "one" 
     Me.Controls.Add(AB) 

     Dim AC As Customlabel = New Customlabel 
     AC.Left = 50 
     AC.Top = 20 
     AC.Name = "two" 
     Me.Controls.Add(AC) 

     Dim AD As Customlabel = New Customlabel 
     AD.Left = 70 
     AD.Top = 20 
     AD.Name = "three" 
     Me.Controls.Add(AD) 
    End Sub 

End Class 

儘管這一切的標籤就像繪製一個矩形沒有一個透明的背景和重疊CustomLabel是不可見的。如果我將標籤的父屬性設置爲窗體,背景僅相對於窗體透明。 (而不是其他CustomLabels)

有人有一個想法如何解決這個問題?

+1

你沒有改變任何東西,Label控件已經設置了這些樣式標誌。你試圖做的事通常是不可能的,透明是通過讓控件的Parent來繪製背景來模擬的。工作正常,但當然你不能看到介於兩者之間的控件,你只能看到父母。真正解決這個問題需要避免使用窗口的控件。像Telerik這樣的組件供應商專注於此。 WPF也是如此。 –

+0

謝謝你的回答!我會尋找WPF和Telerik。 – mookey

+0

如果您願意手動繪製容器上的控件內容,可以完成此操作。這是很多代碼。 –

回答

0

這可能不是一個好答案,但可能有效。 您可以使用具有透明背景的圖像。像.png或.gif等 然後你的圖像是你的文字。 你可以輕鬆地在Photoshop中做到這一點。 只是嘗試玩弄它,但我會畫我自己的項目。 但快速修復將使用透明圖像。

-1

過長; didnt讀

爲了使任何對象透明類型:

在窗體的情況下:

Me.TransparencyKey = BackColor 

要將其恢復正常:

Me.TransparencyKey = Transparent 
+0

如果你還沒有讀過這個問題,最好不要試圖對答案進行猜測。 –