C # .NET 3.5 में प्रगतिबार का रंग कैसे बदलें?


92

मैं अपनी प्रगति पट्टी पर दो चीजें करना चाहता हूं।

  1. हरे रंग को लाल रंग में बदलें।
  2. ब्लॉक निकालें और इसे एक रंग में बनाएं।

उन दो चीजों के बारे में कोई भी जानकारी मुझे आश्चर्य है कि कैसे पूरा करने के लिए महानता प्राप्त होगी!

धन्यवाद।

जवाबों:


83

चूंकि पिछले उत्तर दृश्य शैलियों के साथ काम नहीं करते हैं। आपको शायद अपनी कक्षा बनाने या प्रगति पट्टी का विस्तार करने की आवश्यकता होगी:

public class NewProgressBar : ProgressBar
{
    public NewProgressBar()
    {
        this.SetStyle(ControlStyles.UserPaint, true);
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        Rectangle rec = e.ClipRectangle;

        rec.Width = (int)(rec.Width * ((double)Value / Maximum)) - 4;
        if(ProgressBarRenderer.IsSupported)
           ProgressBarRenderer.DrawHorizontalBar(e.Graphics, e.ClipRectangle);
        rec.Height = rec.Height - 4;
        e.Graphics.FillRectangle(Brushes.Red, 2, 2, rec.Width, rec.Height);
    }
}

संपादित करें: प्रगति बार को पृष्ठभूमि के लिए दृश्य शैली का उपयोग करने के लिए अद्यतित कोड


2
इसके लिए धन्यवाद, यह कुछ ऐसा था जिसे मैं अपने समाधान में काम कर सकता था।
इरविन

यह वास्तव में अच्छा है, धन्यवाद। यह वास्तव में मुझे उस समय कुछ काम में मदद कर रहा था, जो इस समय मैं काम कर रहा था, हालांकि मैंने इसे पूरे नियंत्रण को बदलने के लिए बदल दिया, जबकि ई.क्लिप रेक्टेंगल द्वारा निर्दिष्ट क्षेत्र के बजाय हर बार। अन्यथा, नियंत्रण के केवल एक हिस्से को किसी अन्य विंडो या स्क्रीन के किनारे द्वारा अमान्य कर दिए जाने के बाद यह सही ढंग से नहीं हुआ।
मैट ब्लेन

@ मैट ब्लेन: क्या आप कृपया अपने संशोधन को उत्तर के रूप में संपादित कर सकते हैं? मेरा मानना ​​है कि आपके संपूर्ण समाधान में रुचि रखने वाले पर्याप्त लोग होंगे।
मारेक

@Marek ने आपकी टिप्पणी पर ध्यान दिया। मेरे पास उत्तर को संपादित करने के लिए पर्याप्त प्रतिनिधि नहीं है, इसलिए मैंने अपना पोस्ट किया। धन्यवाद। stackoverflow.com/questions/778678/…
मैट ब्लेन

3
मुझे एहसास है कि यह पुराना है; और मुझे एहसास है कि यह एक नट है (क्योंकि न्यूनतम लगभग हमेशा शून्य है); लेकिन चौड़ाई पैमाने का कारक (((दोहरा)) मूल्य - (डबल) न्यूनतम) / ((डबल) अधिकतम - (डबल) न्यूनतम) गुदा-मासिक रूप से सही होना चाहिए। :)
जेसी चिशोल्म

122

ठीक है, मुझे सभी उत्तरों और लिंक को पढ़ने में थोड़ा समय लगा। यहाँ है कि मैं उनमें से क्या निकला:

नमूना परिणाम

स्वीकृत उत्तर दृश्य शैलियों को अक्षम करता है, यह आपको रंग को किसी भी चीज़ को सेट करने की अनुमति देता है, लेकिन परिणाम स्पष्ट दिखता है:

enter image description here

निम्नलिखित विधि का उपयोग करके, आप इसके बजाय कुछ इस तरह प्राप्त कर सकते हैं:

enter image description here

कैसे

सबसे पहले, इसे शामिल करें यदि आपने नहीं किया है: using System.Runtime.InteropServices;

दूसरा, आप या तो यह नया वर्ग बना सकते हैं, या इसके कोड को किसी staticगैर-सामान्य वर्ग में डाल सकते हैं :

public static class ModifyProgressBarColor
{
    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
    static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr w, IntPtr l);
    public static void SetState(this ProgressBar pBar, int state)
    {
        SendMessage(pBar.Handle, 1040, (IntPtr)state, IntPtr.Zero);
    }
}

अब, इसका उपयोग करने के लिए, बस कॉल करें:

progressBar1.SetState(2);

सेटस्टेट में दूसरे पैरामीटर पर ध्यान दें, 1 = सामान्य (हरा); 2 = त्रुटि (लाल); 3 = चेतावनी (पीला)।

आशा करता हूँ की ये काम करेगा!


18
आपने एक एक्सटेंशन विधि बनाई है, इसलिए कॉल प्रगति होनी चाहिए ।Bar1.SetState (2); इसके अलावा, महान जवाब!
एडगर हर्नांडेज़

5
ध्यान दिया जाना चाहिए कि यह केवल विस्टा + पर उपलब्ध है। आप PBM_SETSTATE की खोज करके पूर्ण दस्तावेज़ देख सकते हैं ।
जिओफ

सुंदर! धन्यवाद
sapbucket

1
यह आश्चर्यजनक है, लेकिन यह आंशिक रूप से मेरी प्रगति पट्टी को तोड़ता है, यह कभी भी 100% तक नहीं भर पाएगा ....
नॉर्बर्ट बोरोस

1
public const uint PBM_SETSTATE = 0x0410; // 1040
आंद्रेई कैसुतस्की

37

यह सबसे स्वीकृत कोड का एक फ़्लिकर-मुक्त संस्करण है जिसे आप इस प्रश्न के उत्तर के रूप में पा सकते हैं। उन फतवा जवाबों के पोस्टरों का सारा श्रेय। धन्यवाद डस्टी, क्रिस, मैट, और जोश!

एक टिप्पणी में "ईंधन" के अनुरोध की तरह, मुझे भी एक ऐसे संस्करण की आवश्यकता थी जो थोड़ा और अधिक व्यवहार करे ... पेशेवर। यह कोड पिछले कोड की तरह शैलियों को बनाए रखता है, लेकिन एक ऑफस्क्रीन इमेज रेंडर और ग्राफिक्स बफरिंग जोड़ता है (और ग्राफिक्स ऑब्जेक्ट को ठीक से डिस्पोज़ करता है)।

परिणाम: सभी अच्छे, और कोई झिलमिलाहट नहीं। :)

public class NewProgressBar : ProgressBar
{
    public NewProgressBar()
    {
        this.SetStyle(ControlStyles.UserPaint, true);
    }

    protected override void OnPaintBackground(PaintEventArgs pevent)
    {
        // None... Helps control the flicker.
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        const int inset = 2; // A single inset value to control teh sizing of the inner rect.

        using (Image offscreenImage = new Bitmap(this.Width, this.Height))
        {
            using (Graphics offscreen = Graphics.FromImage(offscreenImage))
            {
                Rectangle rect = new Rectangle(0, 0, this.Width, this.Height);

                if (ProgressBarRenderer.IsSupported)
                    ProgressBarRenderer.DrawHorizontalBar(offscreen, rect);

                rect.Inflate(new Size(-inset, -inset)); // Deflate inner rect.
                rect.Width = (int)(rect.Width * ((double)this.Value / this.Maximum));
                if (rect.Width == 0) rect.Width = 1; // Can't draw rec with width of 0.

                LinearGradientBrush brush = new LinearGradientBrush(rect, this.BackColor, this.ForeColor, LinearGradientMode.Vertical);
                offscreen.FillRectangle(brush, inset, inset, rect.Width, rect.Height);

                e.Graphics.DrawImage(offscreenImage, 0, 0);
            }
        }
    }
}

अच्छी तरह से यह Microsoft से मूल कार्यान्वयन के सबसे करीब है।
याकूप ınyılmaz

1
एक ब्लॉकिंग ब्लॉक और कॉलिंग डिस्पोज़ होना वास्तव में थोड़ा बेमानी है। हालांकि शानदार जवाब।
केविन स्ट्रिकर

1
मुझे एहसास है कि यह पुराना है; और मुझे एहसास है कि यह एक नट है (क्योंकि न्यूनतम लगभग हमेशा शून्य है); लेकिन चौड़ाई पैमाने का कारक (((दोहरा)) मूल्य - (डबल) न्यूनतम) / ((डबल) अधिकतम - (डबल) न्यूनतम) गुदा-मासिक रूप से सही होना चाहिए। :)
जेसी चिशोल्म

जब मैं TextRenderer.DrawText () का उपयोग ऑफ़स्क्रीन में पाठ को आकर्षित करने के लिए करता हूं, तो स्क्रीन पर अंतिम परिणाम पिक्सेलेटेड दिखता है, और ठीक उसी फ़ॉन्ट का उपयोग करके लेबल की तरह नहीं। इस सब को सीधे e.Graphics में ऑफ़स्क्रीनइमेजर के बिना खींचना सही परिणाम देता है ... हालांकि कोई विचार क्यों?
जिज्ञासु

1
हाँ, मैंने बिना ब्लीच के कोशिश की। अंत में, मैंने अभी WPF में स्विच किया, इसलिए मुझे जो कुछ भी चाहिए वह बस में बनाया गया है।
CuriousGeorge

28

डिज़ाइनर में, आपको बस फ़ोरकॉलर प्रॉपर्टी को उस रंग में सेट करना होगा जो आपको पसंद है। रेड के मामले में, इसके लिए पूर्वनिर्धारित रंग है।

कोड में करने के लिए (C #) ऐसा करें:

pgs.ForeColor = Color.Red;

संपादित करें : ओह, हाँ, शैली को निरंतर पर सेट करें। कोड में, इस तरह:

pgs.Style = System.Windows.Forms.ProgressBarStyle.Continuous;

एक और संपादन: आपको उस पंक्ति को भी हटाने की आवश्यकता होगी जो Application.EnableVisualStyles()आपके Program.cs(या समान) से पढ़ती है । यदि आप ऐसा नहीं कर सकते क्योंकि आप चाहते हैं कि शेष एप्लिकेशन में दृश्य शैलियाँ हों, तो मैं सुझाव दूंगा कि आप स्वयं को नियंत्रित करें या WPF को आगे बढ़ाएँ क्योंकि WPF के साथ इस तरह की चीज़ आसान है। आप कोडप्लेक्स पर प्रगति पट्टी के स्वामी पर एक ट्यूटोरियल पा सकते हैं


3
अग्रभाग = लाल; बैककलर नीले =; शैली = निरंतर। कुछ भी नहीं बदला, इसके रहने की तरह मैंने इसे कभी नहीं छुआ
इवान प्रोडानोव

3
bah ... ठीक है, मैं समस्या देखता हूं। गुणों के साथ काम करने के लिए आपको दृश्य शैलियों को अक्षम करना होगा। यह शायद आपके द्वारा चयनित किसी भी विषय का उपयोग करके पेंटिंग है। Program.cs में एक पंक्ति है जो Application.EnableVisualStyles () को पढ़ती है। उस लाइन को हटा दें और यह काम करेगा। अन्यथा, आपको नियंत्रण को स्वयं पेंट करने की आवश्यकता होगी। दूसरा विकल्प WPF का उपयोग करना है (यदि यह एक संभावना है), क्योंकि यह आपको इस तरह का सामान वास्तव में आसानी से करने देता है।
डस्टब्युरवेल

कृपया मुझे "अपने द्वारा इसे कैसे पेंट करें" के बारे में अधिक जानकारी दें।
इवान प्रोडानोव

1
यहां एक प्रगति पट्टी के स्वामी पर एक ट्यूटोरियल है। एक टिप्पणी के लिए प्रक्रिया बहुत अधिक जटिल है। codeproject.com/KB/cpp/VistaProgressBar.aspx
dustyburwell

1
यह एक शर्म की बात है ।EnableVisualStyles () इस समाधान का प्रमुख हिस्सा है। दुर्भाग्य से यह अन्य सभी शैलियों को तोड़ता है।
mr.user1065741

16

मैट ब्लेन और क्रिस पर्सिचेती के जवाबों का उपयोग करते हुए मैंने एक प्रगति बार बनाया है जो अनंत रंग विकल्प की अनुमति देते समय थोड़ा अच्छा लगता है (मूल रूप से मैंने मैट के समाधान में एक पंक्ति को बदल दिया):

ProgressBarEx:

using System;
using System.Windows.Forms;
using System.Drawing;
using System.Drawing.Drawing2D;

namespace QuantumConcepts.Common.Forms.UI.Controls
{
    public class ProgressBarEx : ProgressBar
    {
        public ProgressBarEx()
        {
            this.SetStyle(ControlStyles.UserPaint, true);
        }

        protected override void OnPaint(PaintEventArgs e)
        {
            LinearGradientBrush brush = null;
            Rectangle rec = new Rectangle(0, 0, this.Width, this.Height);
            double scaleFactor = (((double)Value - (double)Minimum) / ((double)Maximum - (double)Minimum));

            if (ProgressBarRenderer.IsSupported)
                ProgressBarRenderer.DrawHorizontalBar(e.Graphics, rec);

            rec.Width = (int)((rec.Width * scaleFactor) - 4);
            rec.Height -= 4;
            brush = new LinearGradientBrush(rec, this.ForeColor, this.BackColor, LinearGradientMode.Vertical);
            e.Graphics.FillRectangle(brush, 2, 2, rec.Width, rec.Height);
        }
    }
}

उपयोग:

progressBar.ForeColor = Color.FromArgb(255, 0, 0);
progressBar.BackColor = Color.FromArgb(150, 0, 0);

परिणाम

आप अपनी पसंद के किसी भी ढाल का उपयोग कर सकते हैं!

डाउनलोड

https://skydrive.live.com/?cid=0EDE5D21BDC5F270&id=EDE5D21BDC5F270%21160&sc=documents#


2
मुझे एहसास है कि यह पुराना है; और मुझे एहसास है कि यह एक नट है (क्योंकि न्यूनतम लगभग हमेशा शून्य है); लेकिन चौड़ाई पैमाने का कारक (((डबल)) मूल्य - (डबल) न्यूनतम) / ((डबल) अधिकतम - (डबल) न्यूनतम) गुदा-मासिक रूप से सही होना चाहिए। :)
जेसी चिशोल्म

उत्तर w / आपके सुझाव को अपडेट किया।
जोश एम।

मुझे पता है कि यह पुराना है, लेकिन - यह कोड 4 की वैल्यू को हिट करने के बाद एक बार एरर करेगा, LinearGradientBrushरिक की चौड़ाई को 0. पढ़ने के कारण कोड में 4px की "पैडिंग" नहीं करना है और इसके बजाय इसे इसमें जगह दें एक पैनल या गद्दी के साथ कुछ (यदि आप एक सीमा चाहते हैं) और बनाने rec.Width = (int)((rec.Width * scaleFactor) - 4)मेंrec.Width = (int)(rec.Width * scaleFactor) + 1
MiDri

14

डस्टीबोरवेल के जवाब के लिए मॉडरेटटन। (मेरे पास इसे स्वयं संपादित करने के लिए पर्याप्त प्रतिनिधि नहीं है।) उनके जवाब की तरह, यह "विज़ुअल स्टाइल्स" के साथ काम करता है। आप जिस भी रूप में डिज़ाइन का दृश्य देखते हैं, आप प्रोग्रेसबार के फ़ोरकोलर प्रॉपर्टी को बस सेट कर सकते हैं।

using System;
using System.Windows.Forms;
using System.Drawing;

public class ProgressBarEx : ProgressBar
{
    private SolidBrush brush = null;

    public ProgressBarEx()
    {
        this.SetStyle(ControlStyles.UserPaint, true);
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        if (brush == null || brush.Color != this.ForeColor)
            brush = new SolidBrush(this.ForeColor);

        Rectangle rec = new Rectangle(0, 0, this.Width, this.Height);
        if (ProgressBarRenderer.IsSupported)
            ProgressBarRenderer.DrawHorizontalBar(e.Graphics, rec);
        rec.Width = (int)(rec.Width * ((double)Value / Maximum)) - 4;
        rec.Height = rec.Height - 4;
        e.Graphics.FillRectangle(brush, 2, 2, rec.Width, rec.Height);
    }
}

यह अग्रभूमि का रंग बदलने के लिए बहुत अच्छा काम करता है, लेकिन यह बहुत अधिक झिलमिलाहट करता है, जबकि डिफ़ॉल्ट प्रोग्रेसबार नियंत्रण नहीं करता है। कुछ पता है इसे कैसे हल करना है?
ईंधन

4
मुझे पता चला है कि फ़्लिकरिंग को कैसे हल किया जाए: यूज़र-डिफ़ाइंड प्रोग्रेसबेर के कंट्रोलस्लेट्स में डबल-बफ़रिंग जोड़ें, इस तरह: SetStyle (ControlStyles.UserPaint | ControlStyles.OptitizedDoubleBuffer, ...)।
ईंधन

मुझे एहसास है कि यह पुराना है; और मुझे एहसास है कि यह एक नट है (क्योंकि न्यूनतम लगभग हमेशा शून्य है); लेकिन चौड़ाई पैमाने का कारक (((डबल)) मूल्य - (डबल) न्यूनतम) / ((डबल) अधिकतम - (डबल) न्यूनतम) गुदा-मासिक रूप से सही होना चाहिए। :)
जेसी चिशोल्म

5

मैंने इसे एक स्थिर वर्ग में रखा।

  const int WM_USER = 0x400;
  const int PBM_SETSTATE = WM_USER + 16;
  const int PBM_GETSTATE = WM_USER + 17;

  [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
  static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

  public enum ProgressBarStateEnum : int
  {
   Normal = 1,
   Error = 2,
   Paused = 3,
  }

  public static ProgressBarStateEnum GetState(this ProgressBar pBar)
  {
   return (ProgressBarStateEnum)(int)SendMessage(pBar.Handle, PBM_GETSTATE, IntPtr.Zero, IntPtr.Zero);
  }

  public static void SetState(this ProgressBar pBar, ProgressBarStateEnum state)
  {
   SendMessage(pBar.Handle, PBM_SETSTATE, (IntPtr)state, IntPtr.Zero);
  } 

आशा करता हूँ की ये काम करेगा,

न घुलनेवाली तलछट


+1: मुझे लगता है कि यह वही है जो ज्यादातर लोग लाल रंग के होते हैं। यह एक त्रुटि स्थिति दिखा रहा है।
क्वांटम

3

आमतौर पर प्रगति पट्टी या तो थीम पर आधारित होती है या उपयोगकर्ता की रंग वरीयताओं का सम्मान करती है। इसलिए रंग बदलने के लिए आपको या तो दृश्य शैलियों को बंद करने की जरूरत है और ForeColorखुद पर नियंत्रण स्थापित करना है ।

ब्लॉक के बजाय निरंतर शैली के लिए आप Styleसंपत्ति सेट कर सकते हैं:

pBar.Style = ProgressBarStyle.Continuous;

2

संपादित करें

उन चीज़ों की आवाज़ के द्वारा आप XP थीम का उपयोग कर रहे हैं जिनमें हरे रंग का ब्लॉक आधारित प्रोग-बार है। अपने UI स्टाइल को विंडोज क्लासिक पर फ़्लिप करने का प्रयास करें और फिर से परीक्षण करें, लेकिन आपको अपने स्वयं के ऑनपैंट ईवेंट को लागू करने की आवश्यकता हो सकती है, जिसे आप सभी यूआई शैलियों में चाहते हैं।

या जैसा कि किसी और ने बताया, आपके आवेदन के लिए विजुअलसाइटल्स को अक्षम करें।

मूल

जहाँ तक मुझे पता है, प्रगति बार का प्रतिपादन विंडोज़ थीम शैली के साथ इनलाइन होता है जिसे आपने चुना है (win2K, xp, vista)

आप संपत्ति सेट करके रंग बदल सकते हैं

ProgressBar.ForeColor

मुझे यकीन नहीं है कि आप और भी बहुत कुछ कर सकते हैं ...

कुछ गुगली करता है

"चिकना" प्रगति पट्टी बनाने पर एमएस केबी से एक लेख यहाँ है

http://support.microsoft.com/kb/323116


@ ईयन, फॉरेकलर = लाल; बैककलर नीले =; शैली = निरंतर। कुछ भी नहीं बदला, इसका रहना जैसे मैंने इसे कभी नहीं छुआ।
इवान प्रोडानोव


2

ये सभी विधियां मेरे लिए काम करने में विफल हैं, लेकिन यह विधि आपको इसे रंग स्ट्रिंग में बदलने की अनुमति देती है।

कृपया ध्यान दें कि मुझे यह कोड StackOverflow पर कहीं और से मिला और इसे थोड़ा बदल दिया। मैं तब से भूल गया हूं कि मुझे यह कोड कहां मिला है और मैं इसे इसलिए लिंक नहीं कर सकता क्योंकि इसके लिए मुझे खेद है।

लेकिन वैसे भी मुझे उम्मीद है कि यह कोड किसी को मदद करता है यह वास्तव में मेरी मदद करता है।

private void ProgressBar_MouseDown(object sender, MouseButtonEventArgs e)
    {
        var converter = new System.Windows.Media.BrushConverter();
        var brush = (Brush)converter.ConvertFromString("#FFB6D301");
        ProgressBar.Foreground = brush;
    }

जहाँ "ProgressBar" नाम का उपयोग आपके स्वयं के प्रगति बार नाम के साथ किया जाता है। आप इस घटना को अन्य तर्कों के साथ भी ट्रिगर कर सकते हैं, बस यह सुनिश्चित करें कि इसके अंदर के कोष्ठक कहीं हैं।


अच्छा काम..मैं प्रकाश से अंधेरे तक जाने के लिए एक प्रगतिशील घटना के अंदर का उपयोग कर रहा हूँ ... + 1
BENN1TH

2

बदलें ColorऔरValue (तुरंत परिवर्तन)

डाल using System.Runtime.InteropServices;शीर्ष पर ...

के साथ बुलाना ColorBar.SetState(progressBar1, ColorBar.Color.Yellow, myValue);

मैंने देखा कि यदि आप बार का मान बदलते हैं (यह कितना बड़ा है) तो यह डिफ़ॉल्ट ग्रीन के अलावा किसी अन्य रंग में होने पर परिवर्तित नहीं होगा। मैंने user1032613 का कोड लिया और एक मान विकल्प जोड़ा।

public static class ColorBar
{
    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
    static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr w, IntPtr l);
    public enum Color { None, Green, Red, Yellow }

    public static void SetState(this ProgressBar pBar, Color newColor, int newValue)
    {
        if (pBar.Value == pBar.Minimum)  // If it has not been painted yet, paint the whole thing using defualt color...
        {                                // Max move is instant and this keeps the initial move from going out slowly 
            pBar.Value = pBar.Maximum;   // in wrong color on first painting
            SendMessage(pBar.Handle, 1040, (IntPtr)(int)Color.Green, IntPtr.Zero);
        }
        pBar.Value = newValue;
        SendMessage(pBar.Handle, 1040, (IntPtr)(int)Color.Green, IntPtr.Zero);     // run it out to the correct spot in default
        SendMessage(pBar.Handle, 1040, (IntPtr)(int)newColor, IntPtr.Zero);        // now turn it the correct color
    }

}

2
हमें सही नए रंग दिखाने के लिए प्रगति के लिए हालत के शरीर के अंदर pBar.Value = pBar.Maximum;और SendMessage(pBar.Handle, 1040, (IntPtr)(int)Color.Green, IntPtr.Zero);अंदर फ्लिप करना पड़ा ।
डोमेइपेल्यूपर

1

बस किसी को भी किसी अन्य विकल्प की तलाश है .... आप एक पैनल का विस्तार कर सकते हैं, इसे पृष्ठभूमि (सफेद या जो भी) के रूप में उपयोग कर सकते हैं, अग्रभूमि (चलती पट्टी) के लिए इसके अंदर एक और पैनल जोड़ सकते हैं। फिर रंग बदलने आदि पर आपका कुल नियंत्रण होता है।


1

विज़ुअल बेसिक सॉल्यूशन एक्सप्लोरर (जहाँ आपकी vb फाइलें हैं) में अपने प्रोजेक्ट पर राइट क्लिक करें और मेनू से गुण चुनें। विंडो में जो पॉप-अप को "एक्सपीएल विज़ुअल स्टाइल्स को एनेबल करता है" और अब जब आप फोरस्कलर सेट करते हैं, तो इसे अब काम करना चाहिए।


0

Јοеу: उद्धरण: आमतौर पर प्रगति पट्टी या तो थीम पर आधारित होती है या उपयोगकर्ता की रंग वरीयताओं का सम्मान करती है। तो रंग बदलने के लिए आपको या तो दृश्य शैलियों को बंद करना होगा और ForeColorनियंत्रण को स्वयं सेट या ड्रा करना होगा।

ब्लॉक के बजाय निरंतर शैली के लिए आप Styleसंपत्ति सेट कर सकते हैं:

pBar.Style = ProgressBarStyle.Continuous;

ProgressBarStyle.Continuous vs Blocks को VistualStyles सक्षम करने के साथ बेकार है ...

ब्लॉक (एस) केवल दृश्य शैलियों के साथ काम करेगा विकलांग ... जो इस सब को एक मूट बिंदु (कस्टम प्रगति रंग के संबंध में) के साथ प्रदान करता है। विस्‍तृत शैलियों के साथ अक्षम ... प्रगति बार को फोरस्‍कोलर के आधार पर रंगीन किया जाना चाहिए।

मैंने विलियम डैनियल के उत्तर के संयोजन का उपयोग किया (दृश्य शैलियों के साथ सक्षम किया गया, इसलिए फ़ोरकॉरलर बस बिना किसी शैली के सपाट नहीं होगा) और बैरी का उत्तर (प्रगति पट्टी पर कस्टम पाठ करने के लिए): मैं प्रोग्रेसबार पर पाठ कैसे डालूं?


0

वर्टिकल बार यूपी फॉर डाउन इन रेड कलर:

using System;
using System.Windows.Forms;
using System.Drawing;



public class VerticalProgressBar : ProgressBar
{


    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams cp = base.CreateParams;
            cp.Style |= 0x04;
            return cp;

        }
    }
    private SolidBrush brush = null;

    public VerticalProgressBar()
    {
        this.SetStyle(ControlStyles.UserPaint, true);
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        if (brush == null || brush.Color != this.ForeColor)
            brush = new SolidBrush(this.ForeColor);

        Rectangle rec = new Rectangle(0, 0, this.Width, this.Height);
        if (ProgressBarRenderer.IsSupported)
        ProgressBarRenderer.DrawVerticalBar(e.Graphics, rec);
        rec.Height = (int)(rec.Height * ((double)Value / Maximum)) - 4;
        rec.Width = rec.Width - 4;
        e.Graphics.FillRectangle(brush, 2, 2, rec.Width, rec.Height);

    } 
}

क्या आप कृपया या तो पाठ में या कोड में टिप्पणियों में बता सकते हैं कि यह समस्या को कैसे हल करता है।
हैरिसन

मुझे लगता है कि यह एक नट है (क्योंकि न्यूनतम लगभग हमेशा शून्य है); लेकिन ऊँचाई पैमाने का कारक (((दोहरा)) मूल्य - (डबल) न्यूनतम) / ((डबल) अधिकतम - (डबल) न्यूनतम) गुदा-मासिक रूप से सही होना चाहिए। :)
जेसी चिशोल्म

0

VB.Net रंगीन प्रोग्रेसबार जो WXP विज़ुअल स्टाइल्स उत्तर का सम्मान करता है ...

मैंने 3/17/12 को 'user1032613' के उत्तर से शुरुआत की। ध्यान दें कि यह अब एक मॉड्यूल है, वर्ग नहीं। वहां से मैंने कोड को बदल दिया, लेकिन अधिक की आवश्यकता थी। विशेष रूप से परिवर्तित कोड ने 'स्टेट' के पूर्णांक को इंटप्राट प्रकार में परिवर्तित करने के लिए डायरेक्टकास्ट फ़ंक्शन दिखाया जो काम नहीं करता था।

Imports System.Runtime.InteropServices

Public Module ModifyProgressBarColor

    Private Declare Function SendMessage Lib "User32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Long) As Long

    <DllImport("user32.dll", CharSet:=CharSet.Auto, SetLastError:=False)> _
    Private Function SendMessage(hWnd As IntPtr, Msg As UInteger, w As IntPtr, l As IntPtr) As IntPtr
    End Function

    <System.Runtime.CompilerServices.Extension()> _
    Public Sub SetState(pBar As ProgressBar, state As Integer)

        '-- Convert state as integer to type IntPtr
        Dim s As IntPtr
        Dim y As Integer = state
        s = IntPtr.op_Explicit(y)

        '-- Modify bar color
        SendMessage(pBar.Handle, 1040, s, IntPtr.Zero)

    End Sub

End Module

और फिर से इस लाइन के साथ यूज़िंग कोड में कॉल करें:

Call ModifyProgressBarColor.SetState(prb, 2)

BTW - मैंने अन्य रंगों की कोशिश की - 0, 4, 5 - वे सभी सिर्फ हरे रंग में प्रदर्शित हुए।


0

मुझे पता है कि इसका बहुत पुराना तरीका अब उत्तर दिया जाना है .. लेकिन फिर भी, @ डैनियल के जवाब के लिए छोटा सा ट्विन शून्य मूल्यवान प्रगति बार नहीं दिखाने की समस्या को सुधारने के लिए है। यदि आंतरिक आयत की चौड़ाई गैर-शून्य पाई जाती है, तो केवल प्रगति खींचें।

सभी योगदानकर्ताओं को धन्यवाद।

        public class ProgressBarEx : ProgressBar
        {
            public ProgressBarEx()
            {
                this.SetStyle(ControlStyles.UserPaint, true);
            }

            protected override void OnPaintBackground(PaintEventArgs pevent){}
                // None... Helps control the flicker.                

            protected override void OnPaint(PaintEventArgs e)
            {
                const int inset = 2; // A single inset value to control teh sizing of the inner rect.

                using (Image offscreenImage = new Bitmap(this.Width, this.Height))
                {
                    using (Graphics offscreen = Graphics.FromImage(offscreenImage))
                    {
                        Rectangle rect = new Rectangle(0, 0, this.Width, this.Height);

                        if (ProgressBarRenderer.IsSupported)
                            ProgressBarRenderer.DrawHorizontalBar(offscreen, rect);

                        rect.Inflate(new Size(-inset, -inset)); // Deflate inner rect.
                        rect.Width = (int)(rect.Width * ((double)this.Value / this.Maximum));

                        if (rect.Width != 0)
                        {
                            LinearGradientBrush brush = new LinearGradientBrush(rect, this.ForeColor, this.BackColor, LinearGradientMode.Vertical);
                            offscreen.FillRectangle(brush, inset, inset, rect.Width, rect.Height);
                            e.Graphics.DrawImage(offscreenImage, 0, 0);
                            offscreenImage.Dispose();
                        }
                    }
                }
            }
        }

0

मैंने पाया कि यह प्रगति पट्टी के अंदर एक आयत खींचकर, और प्रगति के वर्तमान मूल्य के अनुसार इसकी चौड़ाई निर्धारित करने के लिए किया जा सकता है। मैंने दाएं से बाएं प्रगति के लिए समर्थन भी जोड़ा। इस तरह से आपको छवि का उपयोग करने की आवश्यकता नहीं है, और चूंकि Rectnalge.Inflate को खींचा गया आयत छोटा नहीं कहा जाता है।

public partial class CFProgressBar : ProgressBar
{
    public CFProgressBar()
    {
        InitializeComponent();
        this.SetStyle(ControlStyles.UserPaint, true);
    }

    protected override void OnPaintBackground(PaintEventArgs pevent) { }

    protected override void OnPaint(PaintEventArgs e)
    {
        double scaleFactor = (((double)Value - (double)Minimum) / ((double)Maximum - (double)Minimum));
        int currentWidth = (int)((double)Width * scaleFactor);
        Rectangle rect;
        if (this.RightToLeftLayout)
        {
            int currentX = Width - currentWidth;
            rect = new Rectangle(currentX, 0, this.Width, this.Height);
        }
        else
            rect = new Rectangle(0, 0, currentWidth, this.Height);

        if (rect.Width != 0)
        {
            SolidBrush sBrush = new SolidBrush(ForeColor);
            e.Graphics.FillRectangle(sBrush, rect);
        }
    }
}

0

मुझे लगता है कि सभी का सबसे सरल समाधान, यह सिर्फ एक त्वरित समाधान है, लेकिन आप Program.cs से Application.EnableVisualStyles () को हटा सकते हैं या टिप्पणी कर सकते हैं, या फिर भी आपके पास मुख्य फ़ंक्शन वाले भाग का नाम है। उसके बाद आप स्वतंत्र रूप से प्रगति पट्टी द्वारा रंग रूप को बदल सकते हैं। फ़ोरकोलर = रंग। रंगरंगआपदेसर;

static void Main()
        {
            //Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
         }

-5

संपादित करें: दो minuites में मुझे बनाम फायर करने और वाक्यविन्यास की जांच करने के लिए मुझे लिया गया था, मुझे इसे बेहतर प्रतिक्रिया के साथ पीटा गया था। मुझे इस साइट से प्यार है।

        progressBar1 = new ProgressBar();
        progressBar1.ForeColor = Color.Red;

2
काम नहीं करता है। यह अब खाली रहता है, मैंने प्रगति को जोड़ा है ।ar1.value = 50, लेकिन अभी भी खाली है
इवान प्रोडानोव

अधिकतम मूल्य निर्धारित करने की कोशिश की? प्रगतिबेर 1 = नया प्रगतिबेर (); प्रगतिबहार 1। कोरे रंग = रंग.रेड; प्रगतिबेर १.मैक्सिएम = १००;
फुस्सपॉन

2
नहीं, समस्या मेरी विंडोज़ थीम में है।
इवान प्रोडानोव

अगर यह काम करेगा कोई विचार नहीं, लेकिन Application.EnableVisualThemes () पर टिप्पणी करने का प्रयास करें; यह एक पूर्वनिर्मित फ़ाइलों में से एक है बनाम उत्पन्न (मुझे याद नहीं है कि एक क्या है)
फ़सपॉन

1
Application.EnableVisualStyles () सॉरी थीम नहीं
Fusspawn
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.