Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否确实要删除此自定义ProgressBar类中闪烁的文本?_C#_Text_Progress Bar_Flicker - Fatal编程技术网

C# 是否确实要删除此自定义ProgressBar类中闪烁的文本?

C# 是否确实要删除此自定义ProgressBar类中闪烁的文本?,c#,text,progress-bar,flicker,C#,Text,Progress Bar,Flicker,这就是我让字符串显示在工具栏上的方法: public class ProgressBarWithText : ProgressBar { const int WmPaint = 15; SizeF TextSize; PointF TextPos; public ProgressBarWithText() { this.DoubleBuffered = true; this.TextChanged += ProgressB

这就是我让字符串显示在工具栏上的方法:

public class ProgressBarWithText : ProgressBar
{
    const int WmPaint = 15;
    SizeF TextSize;
    PointF TextPos;

    public ProgressBarWithText()
    {
        this.DoubleBuffered = true;
        this.TextChanged += ProgressBarWithText_TextChanged;
        this.SizeChanged += ProgressBarWithText_SizeChanged;
    }

    public override string Text
    {
        get { return base.Text; }
        set { base.Text = value; }
    }   

    void RecalcTextPos()
    {
        if (string.IsNullOrEmpty(base.Text))
            return;

        using (var graphics = Graphics.FromHwnd(this.Handle))
        {
            TextSize = graphics.MeasureString(base.Text, this.Font);
            TextPos.X = (this.Width / 2) - (TextSize.Width / 2);
            TextPos.Y = (this.Height / 2) - (TextSize.Height / 2);
        }
    }

    void ProgressBarWithText_SizeChanged(object sender, EventArgs e)
    {
        RecalcTextPos();
    }

    void ProgressBarWithText_TextChanged(object sender, EventArgs e)
    {
        RecalcTextPos();
    }     

    protected override void WndProc(ref Message m)
    {
        base.WndProc(ref m);

        switch (m.Msg)
        {
            case WmPaint:
                using (var graphics = Graphics.FromHwnd(Handle))
                    graphics.DrawString(base.Text, base.Font, Brushes.Black, TextPos.X, TextPos.Y);

                break;
        }
    }
}
这是可行的,但文本只是在闪烁。 图灵这个。双缓冲没有帮助。
还有其他想法吗?可能我需要在不同的消息或不同的图形中绘制文本

将此CreateParams覆盖放置在您的类中,它将解决此问题:

        protected override CreateParams CreateParams
        {
            get
            {
                CreateParams result = base.CreateParams;
                result.ExStyle |= 0x02000000; // WS_EX_COMPOSITED 
                return result;
            }
        }

将此CreateParams重写放置在类中,它将解决它:

        protected override CreateParams CreateParams
        {
            get
            {
                CreateParams result = base.CreateParams;
                result.ExStyle |= 0x02000000; // WS_EX_COMPOSITED 
                return result;
            }
        }

为什么不直接重写OnPaint?有什么理由我不想处理绘图条进度本身。或者OnPaint根本就没有调用过。这可能会对您有所帮助,但我希望能找到一些较小的解决方案来修复我的代码。代码越少=解决的麻烦就越少,这就是我所想的。Sriram发布的链接有什么问题?它简单明了,易于实现。为什么不直接重写OnPaint?有什么理由我不想处理绘图条进度本身。或者OnPaint根本就没有调用过。这可能会对您有所帮助,但我希望能找到一些较小的解决方案来修复我的代码。代码越少=解决的麻烦就越少,这就是我所想的。Sriram发布的链接有什么问题?这是直截了当,易于实施。真棒!非常感谢你。这就是我所需要的。太棒了!非常感谢你。这就是我所需要的。