Benutzer mit den meisten Antworten
Transparenter Label

Frage
-
Hallo,
wie macht man einen Label zu einer ProgressBar durchsichtig!
Ich habe diesen Code gefunden:
Label1.BackColor = Color.Transparent Label1.Parent = ProgressBar1
Der funktioniert auch nicht!
Wie macht man das also? Oder geht das vielleicht garnicht?
asd4444b- Typ geändert asd4444b Mittwoch, 5. Januar 2011 17:46
Antworten
-
Hallo,
ich habe mir das jetzt einmal angesehen und ich finde die ProgressBar etwas unschön.
Generell ist es möglich, einfach Text auf das Control zu schreiben:
var graphics = progressBar1.CreateGraphics(); var font = new Font("Arial", (float)8.25, FontStyle.Regular); graphics.DrawString("Bla", font, Brushes.Black, new PointF(progressBar1.Width / 2 - 10, progressBar1.Height / 2 - 7)); graphics.Dispose(); font.Dispose();
Aber leider war dies in meinen Versuchen alles nicht so toll. Ich habe Paint Event ausprobiert als auch in der Form das OnPaint überschrieben, aber das funktionierte leider nicht wie gedacht.
Von daher würde ich Dir raten einfach ein eigenes Control zu basteln.
Mit den besten Grüßen,
Konrad
- Als Antwort markiert Robert Breitenhofer Montag, 24. Januar 2011 17:55
Alle Antworten
-
Hallo,
ich habe mir das jetzt einmal angesehen und ich finde die ProgressBar etwas unschön.
Generell ist es möglich, einfach Text auf das Control zu schreiben:
var graphics = progressBar1.CreateGraphics(); var font = new Font("Arial", (float)8.25, FontStyle.Regular); graphics.DrawString("Bla", font, Brushes.Black, new PointF(progressBar1.Width / 2 - 10, progressBar1.Height / 2 - 7)); graphics.Dispose(); font.Dispose();
Aber leider war dies in meinen Versuchen alles nicht so toll. Ich habe Paint Event ausprobiert als auch in der Form das OnPaint überschrieben, aber das funktionierte leider nicht wie gedacht.
Von daher würde ich Dir raten einfach ein eigenes Control zu basteln.
Mit den besten Grüßen,
Konrad
- Als Antwort markiert Robert Breitenhofer Montag, 24. Januar 2011 17:55
-
Hallo asd4444b,
Schau Dir mal auch das BackgroundWorker.ProgressChanged Event an. Vielleicht kann es Dir weiterhelfen.
Schau Dir mal den folgenden Link an. Vielleicht kann er Dir weiter helfen.
Beispiel in VB.NET mit Vererbung von ProgressBar mit überschreibendem WndProc damit man die WM_PAINT-Nachrichten abfängt („eigenes Control zu basteln“ wie Konrad Dir gesagt hat)
[VB.NET] BackgroundWorker auf Form1(Name: bw) (C# Quelle)
Imports System.Threading Public Class Form1 Private counter As Integer = 0 Const maximum As Integer = 500 Private fortschritt As New ProgressBarEx() Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load fortschritt.Width = 150 Controls.Add(fortschritt) bw.WorkerReportsProgress = True bw.RunWorkerAsync() End Sub Private Sub bw_ProgressChanged(ByVal sender As System.Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles bw.ProgressChanged fortschritt.Value = e.ProgressPercentage '// Hier bist Du im Haupt-UI-Thread End Sub Private Sub bw_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bw.DoWork While counter < maximum Dim prozentErledigt As Integer = System.Math.Max(System.Threading.Interlocked.Increment(counter), counter - 1) * 100 / maximum bw.ReportProgress(prozentErledigt) Thread.Sleep(5) '//Nicht notwendig, nur künstliche Verlangsamung End While End Sub Private Sub bw_RunWorkerCompleted(ByVal sender As System.Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles bw.RunWorkerCompleted MessageBox.Show("fertig! :-)") End Sub Public Class ProgressBarEx Inherits ProgressBar Private Const WM_PAINT As Short = &HF Public Shared _Paint As Boolean = True Public Sub New() MyBase.New() End Sub Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message) If (m.Msg = WM_PAINT) Then If _Paint Then MyBase.WndProc(m) Using g As Graphics = Graphics.FromHwnd(Me.Handle) Using sf As New StringFormat(StringFormatFlags.NoWrap) sf.Alignment = StringAlignment.Center sf.LineAlignment = StringAlignment.Center g.DrawString(Me.Value.ToString() + "%", Control.DefaultFont, Brushes.White, Me.ClientRectangle, sf) End Using End Using Else m.Result = IntPtr.Zero End If Else MyBase.WndProc(m) End If End Sub End Class End Class
Grüße,
Robert