none
Transparenter Label RRS feed

  • 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
    Mittwoch, 5. Januar 2011 17:43

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

     

    Mittwoch, 5. Januar 2011 18:38

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

     

    Mittwoch, 5. Januar 2011 18:38
  • 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.

    ProgressBar with Percentage

    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

    Montag, 24. Januar 2011 17:54