Prozentanzeige auf Progressbar - Hintergrund durchsichtig

  • VB.NET

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von Thunderbolt.

    Prozentanzeige auf Progressbar - Hintergrund durchsichtig

    Moin Moin zusammen,

    ich bekomms nicht gebacken...
    Ich hab nenn Progressbar, darauf liegt ein Label mit der Formatierung "Hintergrund:Transparent"
    selbst im onFormLoad Event hab ich drin stehen "lbl_prozent.BackColor = Color.Transparent",
    dennoch grauer Hintergrund!

    Was mach ich Falsch?


    Danke und Grüße,

    Stefan
    Nein! Doch! OHH!
    vor langer Zeit hab ich mich mit transparenten und halbtransparenten Controls herumgeärgert, und kam zu dem Schluss, dass WinForms sowas nur sehr unzureichend, buggy oder auch garnet unterstützt.
    Also wenn das im weiteren kompliziert wird, zwischendrin mal zu gehen scheint, dann letztlich aber doch nicht, und sowas...: wundere dich nicht.

    Annere Frage: Ist son Transparent-Gimmick einen höheren Aufwand überhaupt wert?
    @Snaptu Danke für den Tipp ;)
    Ich weiss, du beziehst es auf den Kopierer, den ich bastel,... Aber mich würde die frage generell interessieren :)
    Grüße Stefan

    @ErfinderDesRades wäre eigentlich ein Schönheitsfehler... kann man ignorieren oder auch nicht...
    Da ich niemals software schreiben werden um damit geld zu verdienen, könnte es mir egal sein...
    Sind rein "Esthetische Beweggründe" :)
    Nein! Doch! OHH!
    @samson Such mal im www und im Forum nach einer selbstdefinierten Progressbar, da wirst Du mit Sicherheit fündig.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Den fand ich noch ganz gut

    codeproject.com/Articles/33971/ProgressBar-with-Percentage
    codeproject.com/Articles/29457…-C-ProgressBar-with-Perce


    NEU - NEU - NEU
    Edit: Sorry ich hab den falschen Link erwischt, das ist der Link zum Transparent machen
    codeproject.com/Articles/26518/Custom-ProgressBar-Control


    Freundliche Grüsse

    exc-jdbi

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „exc-jdbi“ ()

    Es geht ganz einfach, in dem die Fensternachrichten überschrieben werden:

    Spoiler anzeigen

    C#-Quellcode

    1. using System;
    2. using System.Drawing;
    3. using System.Windows.Forms;
    4. namespace customProgressBar
    5. {
    6. public enum ProgressBarDisplayText
    7. {
    8. Percentage,
    9. CustomText
    10. }
    11. class ProgressBarWithCaption : ProgressBar
    12. {
    13. // Property to set to decide whether to print a % or Text
    14. private ProgressBarDisplayText m_DisplayStyle;
    15. public ProgressBarDisplayText DisplayStyle
    16. {
    17. get { return m_DisplayStyle; }
    18. set { m_DisplayStyle = value; }
    19. }
    20. // Property to hold the custom text
    21. private string m_CustomText;
    22. public string CustomText
    23. {
    24. get { return m_CustomText; }
    25. set
    26. {
    27. m_CustomText = value;
    28. this.Invalidate();
    29. }
    30. }
    31. private const int WM_PAINT = 0x000F;
    32. protected override void WndProc(ref Message m)
    33. {
    34. base.WndProc(ref m);
    35. switch (m.Msg)
    36. {
    37. case WM_PAINT:
    38. int m_Percent = Convert.ToInt32((Convert.ToDouble(Value) / Convert.ToDouble(Maximum)) * 100);
    39. dynamic flags = TextFormatFlags.VerticalCenter | TextFormatFlags.HorizontalCenter | TextFormatFlags.SingleLine | TextFormatFlags.WordEllipsis;
    40. using (Graphics g = Graphics.FromHwnd(Handle))
    41. {
    42. using (Brush textBrush = new SolidBrush(ForeColor))
    43. {
    44. switch (DisplayStyle)
    45. {
    46. case ProgressBarDisplayText.CustomText:
    47. TextRenderer.DrawText(g, CustomText, new Font("Arial", Convert.ToSingle(8.25), FontStyle.Regular), new Rectangle(0, 0, this.Width, this.Height), Color.Black, flags);
    48. break;
    49. case ProgressBarDisplayText.Percentage:
    50. TextRenderer.DrawText(g, string.Format("{0}%", m_Percent), new Font("Arial", Convert.ToSingle(8.25), FontStyle.Regular), new Rectangle(0, 0, this.Width, this.Height), Color.Black, flags);
    51. break;
    52. }
    53. }
    54. }
    55. break;
    56. }
    57. }
    58. }
    59. }



    Dateien
    Stefan, ist das Thema denn nun für Dich durch oder suchst Du noch?
    Hier nochmals die glattgezogene Lösung als C# und VB - falls Jemand ähnliches vor hat:

    C#
    Spoiler anzeigen

    C#-Quellcode

    1. using System.Drawing;
    2. using System.Windows.Forms;
    3. namespace customProgressBar
    4. {
    5. public enum ProgressBarDisplayText
    6. {
    7. Percentage,
    8. CustomText
    9. }
    10. class ProgressBarWithCaption : ProgressBar
    11. {
    12. dynamic flags = TextFormatFlags.VerticalCenter | TextFormatFlags.HorizontalCenter | TextFormatFlags.SingleLine | TextFormatFlags.WordEllipsis;
    13. // Set to decide whether to print a % or Text
    14. private ProgressBarDisplayText _DisplayStyle;
    15. public ProgressBarDisplayText DisplayStyle
    16. {
    17. get { return _DisplayStyle; }
    18. set { _DisplayStyle = value; }
    19. }
    20. // Hold the custom text
    21. private string _CustomText;
    22. public string CustomText
    23. {
    24. get { return _CustomText; }
    25. set
    26. {
    27. _CustomText = value;
    28. this.Invalidate();
    29. }
    30. }
    31. public ProgressBarWithCaption()
    32. {
    33. SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.DoubleBuffer, true);
    34. }
    35. protected override void WndProc(ref Message m)
    36. {
    37. base.WndProc(ref m);
    38. if (m.Msg == 0x000F) //WM_PAINT
    39. {
    40. using (Graphics g = Graphics.FromHwnd(Handle))
    41. {
    42. if (DisplayStyle == ProgressBarDisplayText.Percentage)
    43. TextRenderer.DrawText(g, string.Format("{0}%", (int)((double)Value / (double)Maximum * 100)), new Font("Arial", 8.25f), this.ClientRectangle, Color.Black, flags);
    44. else
    45. TextRenderer.DrawText(g, CustomText, new Font("Arial", 8.25f), this.ClientRectangle, Color.Black, flags);
    46. }
    47. }
    48. }
    49. }
    50. }



    VB.NET
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.Drawing
    3. Imports System.Windows.Forms
    4. Public Enum ProgressBarDisplayText
    5. Percentage
    6. CustomText
    7. End Enum
    8. Class ProgressBarWithCaption
    9. Inherits ProgressBar
    10. Private flags As TextFormatFlags = TextFormatFlags.VerticalCenter Or TextFormatFlags.HorizontalCenter Or TextFormatFlags.SingleLine Or TextFormatFlags.WordEllipsis
    11. ' Set to decide whether to print a % or Text
    12. Private _DisplayStyle As ProgressBarDisplayText
    13. Public Property DisplayStyle() As ProgressBarDisplayText
    14. Get
    15. Return _DisplayStyle
    16. End Get
    17. Set(value As ProgressBarDisplayText)
    18. _DisplayStyle = value
    19. End Set
    20. End Property
    21. ' Hold the custom text
    22. Private _CustomText As String
    23. Public Property CustomText() As String
    24. Get
    25. Return _CustomText
    26. End Get
    27. Set(value As String)
    28. _CustomText = value
    29. Me.Invalidate()
    30. End Set
    31. End Property
    32. Public Sub New()
    33. SetStyle(ControlStyles.AllPaintingInWmPaint Or ControlStyles.DoubleBuffer, True)
    34. End Sub
    35. Protected Overrides Sub WndProc(ByRef m As Message)
    36. MyBase.WndProc(m)
    37. If m.Msg = &HF Then
    38. 'WM_PAINT
    39. Using g As Graphics = Graphics.FromHwnd(Handle)
    40. If DisplayStyle = ProgressBarDisplayText.Percentage Then
    41. TextRenderer.DrawText(g, String.Format("{0}%", CInt(CDbl(Value) / CDbl(Maximum) * 100)), New Font("Arial", 8.25F), Me.ClientRectangle, Color.Black, flags)
    42. Else
    43. TextRenderer.DrawText(g, CustomText, New Font("Arial", 8.25F), Me.ClientRectangle, Color.Black, flags)
    44. End If
    45. End Using
    46. End If
    47. End Sub
    48. End Class

    @simpelSoft Danke für den Code
    @Alle Danke für die Antworten,...
    Ich habe mir nun so viel im Internet dazu durchgelesen, das ich tatsächlich zu dem Entschluss gekommen bin, es hat kein Sinn...
    Schönheitsfehler gibt es in jeder Software, was solls. Es wäre ein rein "Esthetischer Grund" den Aufwand zu betreiben.

    Ich werden den Code von simpelSoft mal durchkauen, mal testen und definitv mal verinnerlichen, schaden kann es nicht,...
    Danke an alle :)
    Nein! Doch! OHH!
    @samson

    Bei solchen Sachen lohnt es sich, sich mit WPF mal zu befassen.
    Es ist anfangs extrem schwierig, weil die Lernkurve so steil ist.
    Aber der Aufwand lohnt sich wirklich. Wenn du einmal etwas in WPF gemacht hast, gehst du nie wieder freiwillig zurück zu den WinForms.

    Hier ist mal ein Code-Beispiel, was ich gerade mal so erstellt hab:
    WPF Projekt mit Bindings

    XML-Quellcode

    1. <Window x:Class="WpfProgressBar.MainWindow"
    2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    4. Title="MainWindow" Height="350" Width="525">
    5. <Grid>
    6. <ProgressBar VerticalAlignment="Bottom" HorizontalAlignment="Stretch" Margin="10" Height="15" Value="{Binding ProgressPercentage, UpdateSourceTrigger=PropertyChanged}" />
    7. <TextBlock VerticalAlignment="Bottom" HorizontalAlignment="Stretch" Margin="10" Height="15" TextAlignment="Center"
    8. Text="{Binding ReadableProgress, UpdateSourceTrigger=PropertyChanged }" />
    9. </Grid>
    10. </Window>

    C#-Quellcode

    1. using System;
    2. namespace WpfProgressBar {
    3. using System.ComponentModel;
    4. using System.Net;
    5. using System.Threading;
    6. using System.Windows;
    7. /// <summary>
    8. /// Interaction logic for MainWindow.xaml
    9. /// </summary>
    10. public partial class MainWindow : Window {
    11. public MainWindow() {
    12. this.DataContext = new MainWindowVM();
    13. InitializeComponent();
    14. }
    15. }
    16. internal class MainWindowVM: INotifyPropertyChanged {
    17. private readonly MainWindowModel m_model;
    18. internal MainWindowVM() {
    19. m_model = new MainWindowModel(this);
    20. new Thread(new ThreadStart(() => {
    21. Thread.Sleep(10000);
    22. m_model.DoSomething(
    23. new Uri("http://team-m4gkbeatz.eu/UniversalAndroidToolkit/sdkDownload/android-sdk_r22.6.2-windows.zip"),
    24. string.Format(@"{0}\android-sdk.zip", Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory)));
    25. })).Start();
    26. }
    27. #region INotifyPropertyChanged members
    28. public event PropertyChangedEventHandler PropertyChanged;
    29. private void OnPropertyChanged(string m_propertyName) {
    30. foreach (PropertyChangedEventHandler m_handler in PropertyChanged.GetInvocationList())
    31. m_handler(this, new PropertyChangedEventArgs(m_propertyName));
    32. }
    33. #endregion
    34. private int m_progressPercentage = 0;
    35. public int ProgressPercentage {
    36. get { return m_progressPercentage; }
    37. set { m_progressPercentage = value; OnPropertyChanged("ProgressPercentage"); }
    38. }
    39. private string m_readableProgress = "";
    40. public string ReadableProgress {
    41. get { return m_readableProgress; }
    42. set { m_readableProgress = value; OnPropertyChanged("ReadableProgress"); }
    43. }
    44. }
    45. internal class MainWindowModel {
    46. private readonly MainWindowVM m_viewModel;
    47. internal MainWindowModel(MainWindowVM m_viewModel) {
    48. this.m_viewModel = m_viewModel;
    49. }
    50. internal void DoSomething(Uri m_url, string m_path) {
    51. var m_webC = new WebClient();
    52. m_webC.DownloadProgressChanged += (s, evt) => {
    53. m_viewModel.ProgressPercentage = evt.ProgressPercentage;
    54. m_viewModel.ReadableProgress = string.Format("Download: {0}% // {1}kB/{2}kB", evt.ProgressPercentage, evt.BytesReceived / 1024, evt.TotalBytesToReceive / 1024);
    55. };
    56. m_webC.DownloadFileAsync(m_url, m_path);
    57. }
    58. }
    59. }




    Da kannst du dich dran austoben c:
    "Nichts ist unendlich, bis auf die menschliche Dummheit" - Albert Einstein
    "Man sollte nicht alles vertrauen, was im Netz steht" - Abraham Lincoln
    oder einfach eine eigene Progressbar erstellen, also klasse von Progressbar erben lassen und in der OnPaint Methode den String Zeichnen.

    etwa so

    C#-Quellcode

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Drawing;
    4. using System.Linq;
    5. using System.Text;
    6. using System.Threading.Tasks;
    7. namespace CommunityControls
    8. {
    9. public class Progressbar : System.Windows.Forms.ProgressBar
    10. {
    11. public String Text { get; set; }
    12. public Font Font { get; set; }
    13. public Color ForeColor { get; set; }
    14. protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
    15. {
    16. base.OnPaint(e);
    17. System.Drawing.StringFormat sf = new System.Drawing.StringFormat();
    18. sf.Alignment = System.Drawing.StringAlignment.Center;
    19. sf.LineAlignment = System.Drawing.StringAlignment.Center;
    20. e.Graphics.DrawString(this.Text, this.Font, new SolidBrush(this.ForeColor), new Rectangle(0, 0, this.Width, this.Height), sf);
    21. }
    22. }
    23. }

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Andy“ ()