সি #। নেট 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);
    }
}

সম্পাদনা: প্রগতি বারটিকে পটভূমির জন্য ভিজ্যুয়াল স্টাইলটি ব্যবহার করতে আপডেট কোড


4
এর জন্য ধন্যবাদ, এটি এমন কিছু ছিল যা আমি আমার সমাধানে কাজ করতে পারি।
আরউইন

ধন্যবাদ, সত্যিই দুর্দান্ত। এই মুহুর্তে আমি যে কাজ করছি তাতে সত্যই এটি আমাকে সাহায্য করেছিল, যদিও আমি ই-ক্লিপেক্টেঙ্গেল দ্বারা উল্লিখিত অঞ্চলটির পরিবর্তে প্রতিবার পুরো নিয়ন্ত্রণটিকে পুনরায় রঙ করতে এটিকে পরিবর্তন করেছি। অন্যথায়, নিয়ন্ত্রণের কেবলমাত্র একটি অংশ অন্য উইন্ডো বা পর্দার প্রান্ত দ্বারা অবৈধ হওয়ার পরে এটি সঠিকভাবে পুনরায় রঙ করতে পারে না।
ম্যাট ব্লেইন

@ ম্যাট ব্লেইন: আপনি দয়া করে উত্তরের সম্পাদনা হিসাবে নিজের পরিবর্তন পোস্ট করতে পারেন? আমি বিশ্বাস করি আপনার সম্পূর্ণ সমাধানটিতে আগ্রহী যথেষ্ট লোক থাকবে।
মারেক

@ মারেক স্রেফ আপনার মন্তব্য লক্ষ্য করেছেন। উত্তর সম্পাদনা করার মতো পর্যাপ্ত পরিমাণে আমার কাছে নেই, তাই আমি আমার নিজের পোস্ট করেছি। ধন্যবাদ stackoverflow.com/questions/778678/…
ম্যাট ব্লেইন

4
আমি বুঝতে পারি যে এটি পুরানো; এবং আমি বুঝতে পারি এটি একটি নিট (কারণ সর্বনিম্ন প্রায় সর্বদা শূন্য থাকে); তবে প্রস্থ স্কেল ফ্যাক্টরটি (((ডাবল) মান - (ডাবল) ন্যূনতম)) / ((ডাবল) সর্বাধিক - (ডাবল) ন্যূনতম))) মলদ্বারে পুনরায় সংশোধনযোগ্য হওয়া উচিত। :)
জেসি চিশলম

122

ঠিক আছে, সমস্ত উত্তর এবং লিঙ্কগুলি পড়তে আমার কিছুটা সময় লেগেছে। আমি সেগুলি থেকে যা পেয়েছি তা এখানে:

নমুনা ফলাফল

গৃহীত উত্তরটি ভিজ্যুয়াল শৈলীগুলিকে অক্ষম করে, এটি আপনাকে যে কোনও কিছুতে রঙ সেট করার অনুমতি দেয়, তবে ফলাফলটি সহজ দেখাচ্ছে:

এখানে চিত্র বর্ণনা লিখুন

নিম্নলিখিত পদ্ধতিটি ব্যবহার করে আপনি এর পরিবর্তে এরকম কিছু পেতে পারেন:

এখানে চিত্র বর্ণনা লিখুন

কিভাবে

প্রথমে এটি অন্তর্ভুক্ত করুন যদি আপনার না থাকে: 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
আপনি একটি এক্সটেনশন পদ্ধতি তৈরি করেছেন, তাই কলটি অগ্রগতি হওয়া উচিত বার 1।সেট স্টেট (2); তা ছাড়াও, দুর্দান্ত উত্তর!
এডগার হার্নান্দেজ

4
লক্ষ করা উচিত যে এটি কেবল ভিস্তা + এ উপলব্ধ। আপনি পিবিএম_এসটিস্টেট অনুসন্ধান করে সম্পূর্ণ ডকুমেন্টেশন দেখতে পারেন ।
ডিজেফ

সুন্দর! আপনাকে ধন্যবাদ
স্যাপবকেট

4
এটি আশ্চর্যজনক, তবে এটি আমার অগ্রগতি বারটিকে আংশিকভাবে ভেঙে দেয়, এটি কখনই 100% পূরণ করবে না ...
নরবার্ট বোরোস

4
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);
            }
        }
    }
}

ঠিক আছে এটি মাইক্রোসফ্ট থেকে আসল বাস্তবায়ন সবচেয়ে নিকটতম।
ইয়াকুপ ınyılmas

4
একটি ব্যবহার ব্লক থাকা এবং ডিসপোজ কল করা আসলে কিছুটা রিয়ন্ডান্ট। দুর্দান্ত উত্তর যদিও।
কেভিন স্ট্রাইকার

4
আমি বুঝতে পারি যে এটি পুরানো; এবং আমি বুঝতে পারি এটি একটি নিট (কারণ সর্বনিম্ন প্রায় সর্বদা শূন্য থাকে); তবে প্রস্থ স্কেল ফ্যাক্টরটি (((ডাবল) মান - (ডাবল) ন্যূনতম)) / ((ডাবল) সর্বাধিক - (ডাবল) ন্যূনতম))) মলদ্বারে পুনরায় সংশোধনযোগ্য হওয়া উচিত। :)
জেসি চিশলম

আমি যখন পাঠ্যকে অফস্ক্রিনাইমে আঁকার জন্য টেক্সটরেন্ডারআর ড্রটেক্সট () ব্যবহার করি তখন স্ক্রিনের চূড়ান্ত ফলাফলটি পিক্সেলটেড দেখায় এবং ঠিক একই হরফ ব্যবহার করে কোনও লেবেলের মতো নয়। অফস্ক্রিনিমা ছাড়াই ই-গ্রাফিকগুলিতে সরাসরি এই সমস্ত অঙ্কন করা সঠিক ফলাফল দেয় যদিও ... কোনও ধারণা কেন?
কৌতূহল জর্জি

4
হ্যাঁ, আমি অনাবৃত ব্লিটিং করার চেষ্টা করেছি। অবশেষে, আমি শুধু WPF স্যুইচ, তাই সবকিছু আমি প্রয়োজন শুধু নির্মিত হয়।
CuriousGeorge

28

ডিজাইনারে, আপনার পছন্দসই রঙে আপনার কেবল রঙের সম্পত্তি সেট করতে হবে। রেডের ক্ষেত্রে এটির জন্য পূর্বনির্ধারিত রঙ রয়েছে।

কোডে এটি করতে (সি #) এটি করুন:

pgs.ForeColor = Color.Red;

সম্পাদনা : ওঁ হ্যাঁ, স্টাইলকে ধারাবাহিকভাবে সেট করুন। কোডে, এর মতো:

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

অন্য সম্পাদনা: আপনাকে Application.EnableVisualStyles()আপনার Program.cs(বা অনুরূপ) থেকে পড়া লাইনটিও সরিয়ে ফেলতে হবে । আপনি যদি এইটি করতে না পারেন কারণ আপনি বাকী অ্যাপ্লিকেশনটি ভিজ্যুয়াল শৈলীযুক্ত করতে চান, তবে আমি নিজেই নিয়ন্ত্রণটি আঁকতে বা ডাব্লুপিএফ এ যাওয়ার পরামর্শ দেব কারণ এই জাতীয় জিনিসটি ডাব্লুপিএফ দিয়ে সহজ হয়। কোডপ্লেক্সে একটি অগ্রগতি বার অঙ্কনের মালিকের একটি টিউটোরিয়াল আপনি খুঁজে পেতে পারেন


4
পূর্বাভাস = লাল; ব্যাককালার = নীল; স্টাইল = ক্রমাগত। কিছুই পরিবর্তিত হয়নি, এর মতো থাকার যেমন আমি কখনও স্পর্শ করি নি
ইভান প্রোডানভ

4
বাহ ... ঠিক আছে, আমি সমস্যাটি দেখতে পাচ্ছি। বৈশিষ্ট্যের সাথে কাজ করার জন্য আপনাকে ভিজ্যুয়াল শৈলীগুলি অক্ষম করতে হবে। এটি সম্ভবত আপনি যে থিমটি নির্বাচন করেছেন তা ব্যবহার করে চিত্রকর্ম করছে। প্রোগ্রাম.কমগুলিতে অ্যাপ্লিকেশন পড়ার জন্য একটি লাইন রয়েছে E এই লাইনটি সরান এবং এটি কাজ করবে। অন্যথায়, আপনাকে নিজেরাই নিয়ন্ত্রণ আঁকতে হবে। অন্য বিকল্পটি হ'ল ডাব্লুপিএফ (এটি যদি কোনও সম্ভাবনা থাকে) ব্যবহার করা হয়, যেহেতু এটি আপনাকে এই ধরণের জিনিসগুলি খুব সহজেই করতে দেয়।
ডাস্টিবারভেল

"এটি নিজেই কীভাবে আঁকবেন" সম্পর্কে দয়া করে আমাকে আরও তথ্য দিন।
ইভান প্রোডানভ 19

4
এখানে একটি অগ্রগতি বার আঁকার মালিকের একটি টিউটোরিয়াল রয়েছে। প্রক্রিয়াটি একটি মন্তব্যের জন্য অনেক জটিল। কোডেপ্রজেক্ট
কেবি /

4
এটি একটি লজ্জাজনক অ্যাপ্লিকেশন nএবনেবল ভিজুয়ালস্টাইলস () এই সমাধানের মূল অংশ। দুর্ভাগ্যক্রমে এটি অন্যান্য সমস্ত শৈলিকে ভেঙে দেয়।
mr.user1065741

16

ম্যাট ব্লেইন এবং ক্রিস পার্সেচেটির উত্তরগুলি ব্যবহার করে আমি একটি প্রগতি বার তৈরি করেছি যা অসীম রঙ পছন্দ করার সময় কিছুটা সুন্দর দেখায় (মূলত আমি ম্যাট এর সমাধানে একটি লাইন পরিবর্তন করেছি):

প্রগতিবারেক্স:

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#


4
আমি বুঝতে পারি যে এটি পুরানো; এবং আমি বুঝতে পারি এটি একটি নিট (কারণ সর্বনিম্ন প্রায় সর্বদা শূন্য থাকে); তবে প্রস্থ স্কেল ফ্যাক্টরটি (((ডাবল) মান - (ডাবল) ন্যূনতম)) / ((ডাবল) সর্বাধিক - (ডাবল) ন্যূনতম))) মলদ্বারে পুনরায় সংশোধনযোগ্য হওয়া উচিত। :)
জেসি চিশলম

উত্তরটি ডাব্লু / আপনার পরামর্শ আপডেট করেছে।
জোশ এম

আমি জানি এটি পুরানো, তবে - এই কোডটি একবারে 4 টির মান হ্রাসের LinearGradientBrushপরে রেক প্রস্থকে 0 হিসাবে পড়ার কারণে ত্রুটিযুক্ত হয়ে যাবে Eas প্যানেল বা প্যাডিং সহ কিছু (যদি আপনি কোনও সীমানা চান) এবং তৈরি rec.Width = (int)((rec.Width * scaleFactor) - 4)করেrec.Width = (int)(rec.Width * scaleFactor) + 1
মাইড্রি

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
ঝাঁকুনির সমাধান কীভাবে করবেন তা আমি খুঁজে পেয়েছি: ব্যবহারকারী-সংজ্ঞায়িত প্রগ্রেসবারের কন্ট্রোলস্টাইলে ডাবল-বাফারিং যুক্ত করুন: এর মতো সেটসটিল (কন্ট্রোলস্টাইলস.উজারপেইন্ট | কন্ট্রোলসাইলস.অપ્টিমাইজডডুবলবার, ...)।
প্রসার

আমি বুঝতে পারি যে এটি পুরানো; এবং আমি বুঝতে পারি এটি একটি নিট (কারণ সর্বনিম্ন প্রায় সর্বদা শূন্য থাকে); তবে প্রস্থ স্কেল ফ্যাক্টরটি (((ডাবল) মান - (ডাবল) ন্যূনতম)) / ((ডাবল) সর্বাধিক - (ডাবল) ন্যূনতম))) মলদ্বারে পুনরায় সংশোধনযোগ্য হওয়া উচিত। :)
জেসি চিশলম

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

সম্পাদনা

জিনিসগুলির শব্দে আপনি এক্সপি থিম ব্যবহার করছেন যা গ্রিন ব্লক ভিত্তিক প্রগ-বার রয়েছে। আপনার ইউআই স্টাইলটি উইন্ডোজ ক্লাসিকের কাছে উল্টানোর চেষ্টা করুন এবং আবার পরীক্ষা করুন, তবে আপনার সমস্ত ইউআই স্টাইল জুড়ে যা চান তা করতে আপনার নিজের অনপেন্ট ইভেন্টটি প্রয়োগ করতে হতে পারে

বা অন্য কেউ যেমন উল্লেখ করেছেন, আপনার আবেদনের জন্য ভিজ্যুয়াল স্টাইলগুলি অক্ষম করুন।

আসল

আমি যতদূর জানি, প্রগ্রেস বারের রেন্ডারিং আপনি যে উইন্ডোজ থিম স্টাইলটি বেছে নিয়েছেন তার সাথে ইনলাইনে ঘটে (উইন 2 কে, এক্সপি, ভিস্তা)

আপনি সম্পত্তি সেট করে রঙ পরিবর্তন করতে পারেন

ProgressBar.ForeColor

আমি নিশ্চিত না যে আপনি তবে আরও অনেক কিছু করতে পারবেন ...

কিছু googling না

এমএস কেবি থেকে একটি "স্মুথ" অগ্রগতি বার তৈরির বিষয়ে একটি নিবন্ধ এখানে রয়েছে

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


@ অয়ন, পূর্বাভাস = লাল; ব্যাককালার = নীল; স্টাইল = ক্রমাগত। কিছুই পরিবর্তিত হয়নি, এর মতো থাকার বিষয়টি আমি কখনও স্পর্শ করি নি।
ইভান প্রোডানভ 19


2

এই সমস্ত পদ্ধতিগুলি আমার পক্ষে কাজ করতে ব্যর্থ হয়েছে তবে এই পদ্ধতিটি আপনাকে এটি রঙিন স্ট্রিংয়ে পরিবর্তন করতে দেয়।

দয়া করে নোট করুন যে আমি স্ট্যাকওভারফ্লোতে অন্য কোথাও থেকে এই কোডটি পেয়েছি এবং এটি একটু পরিবর্তন করেছি। আমি এই কোডটি কোথায় পেয়েছি তা ভুলে গিয়েছি এবং এর জন্য দুঃখিত হওয়ায় আমি এটি লিঙ্ক করতে পারছি না।

তবে যাইহোক আমি আশা করি এই কোডটি এমন কাউকে সহায়তা করবে যা এটি আমাকে সত্যই সহায়তা করেছিল।

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

যেখানে "প্রগতিবার" নামটি ব্যবহার করা হয় আপনার নিজের অগ্রগতির বারের নামের সাথে প্রতিস্থাপন করুন। আপনি অন্যান্য আর্গুমেন্টের সাহায্যেও এই ইভেন্টটি ট্রিগার করতে পারেন কেবল এটির ভিতরে বন্ধনী কোথাও নিশ্চিত করুন।


চমৎকার কাজ..আমি হালকা থেকে অন্ধকারে যাওয়ার জন্য একটি প্রগ্রেস চেঞ্জড ইভেন্টের ভিতরে ব্যবহার করছি ... + 1
BENN1TH

2

পরিবর্তন Colorএবং Value(তাত্ক্ষণিক পরিবর্তন)

using System.Runtime.InteropServices;শীর্ষে রাখুন ...

সাথে কল ColorBar.SetState(progressBar1, ColorBar.Color.Yellow, myValue);

আমি লক্ষ্য করেছি যে আপনি যদি বারটির মান পরিবর্তন করেন (এটি কত বড়) তবে এটি ডিফল্ট সবুজ ছাড়া অন্য কোনও রঙে থাকলে পরিবর্তন হবে না। আমি ব্যবহারকারীর 1032613 এর কোড নিয়েছি এবং একটি মান বিকল্প যুক্ত করেছি।

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
    }

}

4
আমরা উল্টানো ছিল pBar.Value = pBar.Maximum;এবং SendMessage(pBar.Handle, 1040, (IntPtr)(int)Color.Green, IntPtr.Zero);উন্নতি সঠিক নতুন রঙ দেখানো হবে তার জন্য শর্ত শরীরের ভেতরে।
ডোম দ্য ডেভেলপার

1

যদি কেউ অন্য বিকল্পের সন্ধান করে তবে .... আপনি একটি প্যানেল প্রসারিত করতে পারেন, এটি ব্যাকগ্রাউন্ড হিসাবে ব্যবহার করতে পারেন (সাদা বা যাই হোক না কেন), অগ্রভাগের জন্য (চলন্ত বার) জন্য এর ভিতরে আরও একটি প্যানেল যুক্ত করতে পারেন। তারপরে আপনার রং নিয়ন্ত্রণ করা ইত্যাদি সম্পূর্ণ নিয়ন্ত্রণ রয়েছে etc.


1

ভিজ্যুয়াল বেসিক সলিউশন এক্সপ্লোরার (যেখানে আপনার ভিবি ফাইলগুলি আছে) আপনার প্রকল্পে কেবল ডান ক্লিক করুন এবং মেনু থেকে বৈশিষ্ট্যগুলি নির্বাচন করুন। উইন্ডোটিতে পপ আপ হয়েছে "এক্সপি ভিজ্যুয়াল স্টাইলগুলি সক্ষম করুন" নির্বাচন করুন এবং এখন আপনি পূর্বসূরী সেট করার পরে এটি এখনই কাজ করা উচিত।


0

।: উদ্ধৃতি: সাধারণত অগ্রগতি বার হয় থিমযুক্ত বা ব্যবহারকারীর রঙ পছন্দগুলি সম্মান করে। রঙ পরিবর্তন করার জন্য আপনাকে হয় ভিজ্যুয়াল শৈলীগুলি বন্ধ করতে হবে এবং ForeColorনিজেই নিয়ন্ত্রণ সেট করতে হবে বা আঁকতে হবে।

ব্লকগুলির পরিবর্তে অবিচ্ছিন্ন শৈলীর জন্য আপনি Styleসম্পত্তি সেট করতে পারেন :

pBar.Style = ProgressBarStyle.Continuous;

প্রগতিবার্টিস্টাইল.নির্ভর বনাম ব্লকগুলি ভার্চুয়াল স্টাইলস সক্ষম করে অকেজো ...

ব্লক (গুলি) কেবলমাত্র ভিজ্যুয়াল শৈলীর সাথে অক্ষম থাকবে ... যা এই সমস্তগুলিকে একটি মোড পয়েন্ট সরবরাহ করে (কাস্টম অগ্রগতির রঙের সাথে) ভার্চুয়াল শৈলীগুলি অক্ষম করে ... অগ্রগতির বারটি পূর্বাভাসের ভিত্তিতে রঙিন করা উচিত।

আমি উইলিয়াম ড্যানিয়েলের উত্তরের সংমিশ্রণটি ব্যবহার করেছি (ভিজ্যুয়াল শৈলীর সাথে সক্ষম, সুতরাং ফোরকালারটি কেবল কোনও স্টাইল ছাড়াই সমতল হবে না) এবং ব্যারিয়ের উত্তর (অগ্রগতি বারে কাস্টম পাঠ্যে) থেকে: আমি কীভাবে প্রগতিবারে পাঠ্য রাখি?


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

ডাব্লুএক্সপি ভিজ্যুয়াল স্টাইলের উত্তরগুলির সম্মান করে এমন ভিবি.নেট রঙিন প্রগতিবারটি হ'ল ...

আমি উত্তরটি 3/17/12 এ '101032613 'দিয়ে শুরু করেছি। মনে রাখবেন এটি এখন একটি মডিউল, কোনও শ্রেণি নয়। সেখান থেকে আমি কোডটি রূপান্তর করেছি তবে আরও বেশি প্রয়োজন ছিল। বিশেষত রূপান্তরিত কোডটি 'স্টেট' পূর্ণসংখ্যাকে কোনও ইন্টারপ্রেটার ধরণের রূপান্তর করতে একটি ডাইরেক্টকাস্ট ফাংশন দেখায় যা কাজ করে না।

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)

বিটিডাব্লু - আমি অন্যান্য রঙগুলি চেষ্টা করেছি - 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

আমি দেখেছি এটি অগ্রগতি বারের মধ্যে একটি আয়তক্ষেত্র অঙ্কন করে এবং অগ্রগতির বর্তমান মান অনুসারে এর প্রস্থ নির্ধারণ করে করা যেতে পারে। আমি ডান থেকে বাম অগ্রগতির জন্য সমর্থনও যুক্ত করেছি। এইভাবে আপনাকে চিত্রটি ব্যবহার করার দরকার নেই এবং যেহেতু রেক্টনালজ।আইনফ্লেটকে টানা আয়তক্ষেত্রটি ছোট বলা হয় না।

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 প্রোগ্রাম.সি থেকে উইনজিয়াল স্টাইলস () সক্ষম করুন, বা তবে আপনার অংশটির নাম মূল ফাংশন রয়েছে containing এর পরে আপনি প্রগতি বারের মাধ্যমে অগ্রগতি বারকে নির্বিঘ্নে রঙিন রঙ পরিবর্তন করতে পারেন Color

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

-5

সম্পাদনা করুন: দুটি মিনুয়েটে এটি আমাকে বনাম আগুন লাগিয়ে তুলতে এবং সিনট্যাক্সটি পরীক্ষা করতে আমাকে আরও ভাল প্রতিক্রিয়া জানায় beaten আমি এই সাইটটি ভালবাসি

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

4
কাজ করে না Iএখন খালি থাকে, আমি অগ্রগতি বার
1.value

সর্বোচ্চ মান নির্ধারণ করার চেষ্টা করেছেন? প্রগতিবার 1 = নতুন প্রগ্রেসবার (); অগ্রগতি বার 1.ফোরকালার = রঙ। রেড; অগ্রগতি বার 1.ম্যাক্সিমাম = 100;
ফুসপাউন

4
না, সমস্যাটি আমার উইন্ডোজ থিমে রয়েছে।
ইভান প্রোদানোভ

এটি কার্যকর হবে কিনা ধারণা নেই, তবে অ্যাপ্লিকেশনটি মন্তব্য করার চেষ্টা করুন E এটি
প্রাক

4
অ্যাপ্লিকেশন.নিজভিজুয়ালস্টাইলস () দুঃখিত থিম না
Fusspawn
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.