Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.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# 根据背景色反转文本颜色_C#_.net_Winforms_Gdi+_Gdi - Fatal编程技术网

C# 根据背景色反转文本颜色

C# 根据背景色反转文本颜色,c#,.net,winforms,gdi+,gdi,C#,.net,Winforms,Gdi+,Gdi,我有一个ProgressBar控件,如下所示: 第一个画得很好。如您所见,第二个只有一个0,它应该有两个,但另一个不可见,因为ProgressBar的ForeColor与TextColor相同。当下面的ProgressBar用石灰色绘制时,我有没有办法用黑色绘制文本,当背景为黑色时,我有没有办法用石灰色绘制文本?您可以先绘制背景和文本,然后使用带有PATINVERT参数的方法绘制前景石灰矩形,以将前景图形与背景图形相结合: 公共类MyProgressBar:控件 { 公共MyProgres

我有一个
ProgressBar
控件,如下所示:


第一个画得很好。如您所见,第二个只有一个0,它应该有两个,但另一个不可见,因为ProgressBar的
ForeColor
TextColor
相同。当下面的
ProgressBar
用石灰色绘制时,我有没有办法用黑色绘制文本,当背景为黑色时,我有没有办法用石灰色绘制文本?

您可以先绘制背景和文本,然后使用带有
PATINVERT
参数的方法绘制前景石灰矩形,以将前景图形与背景图形相结合:

公共类MyProgressBar:控件
{
公共MyProgressBar()
{
双缓冲=真;
最小值=0;最大值=100;值=50;
}
公共整数最小值{get;set;}
公共整数最大值{get;set;}
公共int值{get;set;}
受保护的覆盖无效OnPaint(PaintEventArgs e)
{
基础漆(e);
绘画(如图形);
}
私人空间绘制(图形g)
{
var r=此.ClientRectangle;
使用(var b=新的SolidBrush(this.BackColor))
g、 圆角矩形(b,r);
textrender.DrawText(g,this.Value.ToString(),this.Font,r,this.ForeColor);
var hdc=g.GetHdc();
var c=此前景色;

var hbrush=CreateSolidBrush((c.R|(c.G它是哪个进度条?是内置的还是使用自定义或第三方控件?@vendettamit抱歉,忘了指定,我使用的是如果文本是一部分,则不可能,除非您使用位图并切换像素。如果您可以将其拆分为两部分,则需要确定拆分是否需要拆分字符。不完全正确任何方式都很简单。哦,但是对于旧的xor ing绘图模式。我看到的唯一廉价和简单的解决方案是在颜色上妥协,而不是为条和文本选择相同的(亮度)。另一个技巧是不仅切换颜色,而且切换值高于或低于50%的对齐方式。这正是我需要的!谢谢!
using System;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows.Forms;
public class MyProgressBar : Control
{
    public MyProgressBar() 
    {
        DoubleBuffered = true;
        Minimum = 0; Maximum = 100; Value = 50;
    }
    public int Minimum { get; set; }
    public int Maximum { get; set; }
    public int Value { get; set; }
    protected override void OnPaint(PaintEventArgs e) 
    {
        base.OnPaint(e);
        Draw(e.Graphics);
    }
    private void Draw(Graphics g) 
    {
        var r = this.ClientRectangle;
        using (var b = new SolidBrush(this.BackColor))
            g.FillRectangle(b, r);
        TextRenderer.DrawText(g, this.Value.ToString(), this.Font, r, this.ForeColor);
        var hdc = g.GetHdc();
        var c = this.ForeColor;
        var hbrush = CreateSolidBrush(((c.R | (c.G << 8)) | (c.B << 16)));
        var phbrush = SelectObject(hdc, hbrush);
        PatBlt(hdc, r.Left, r.Y, (Value * r.Width / Maximum), r.Height, PATINVERT);
        SelectObject(hdc, phbrush);
        DeleteObject(hbrush);
        g.ReleaseHdc(hdc);
    }
    public const int PATINVERT = 0x005A0049;
    [DllImport("gdi32.dll")]
    public static extern bool PatBlt(IntPtr hdc, int nXLeft, int nYLeft,
        int nWidth, int nHeight, int dwRop);
    [DllImport("gdi32.dll")]
    public static extern IntPtr SelectObject(IntPtr hdc, IntPtr hgdiobj);
    [DllImport("gdi32.dll", EntryPoint = "DeleteObject")]
    public static extern bool DeleteObject(IntPtr hObject);
    [DllImport("gdi32.dll")]
    public static extern IntPtr CreateSolidBrush(int crColor);
}