Windows.Forms - 为HighContrast

时间:2017-09-01 11:37:24

标签: c# winforms bitmap imagelist

需要帮助改变ImageList中的位图以将黑色像素切换为黄色,它们被用作UICommandBar的图像(截图和下面的尝试)

UICommandBar images not visible when in HighContrast

执行代码,使用GetPixel条件,然后使用SetPixel,但图像不会更改。可能与ImageListStreamer有关,或者没有时间交换这些像素。

rtfeditor.cs

this.imageList1.ImageStream = ( (System.Windows.Forms.ImageListStreamer)(resources.GetObject( "imageList1.ImageStream" ) ) );

this.imageList1 = ColorSpace.ProcessHighContrast(this.imageList1);

的Utils \ ColorSpace.cs

public static System.Windows.Forms.ImageList ProcessHighContrast(System.Windows.Forms.ImageList imageList)
                 {
                         if (System.Windows.Forms.SystemInformation.HighContrast)
                         {
                                 foreach (System.Drawing.Bitmap imageListImage in imageList.Images)
                                  {
                                          for (int i = 0; i < imageListImage.Width; i++)
                                          {
                                                  for (int j = 0; j < imageListImage.Height; j++)
                                                   {
                                                           Color color =     imageListImage.GetPixel(i, j);
                                                           if (System.Drawing.Color.FromArgb(255, 0, 0, 0).Equals(color))
                                                                  imageListImage.SetPixel(i, j, System.Drawing.SystemColors.WindowText);
                                                   }
                                          }
                                  }
                         }

                         return imageList;
                 }

1 个答案:

答案 0 :(得分:0)

<强>解决 enter image description here

Hans Passant的评论对于解决此问题至关重要(请参阅下面引用的评论)+更改ProcessHighContrast(现在是第一个)的调用顺序,并将ImageList分配给Janus.Windows。 UI.CommandBars.UICommandBar(现为第二个)。下面的新方法和调用代码。

  

ImageList.Images返回每个图像的副本。因此,改变副本根本不会修改ImageList内容。改为创建一个新的ImageList。请注意Darth Vader配色方案往往只受程序员的欢迎,普通用户希望高对比度版本具有白色背景。这将不那么痛苦。 - 汉斯帕斯特

rtfeditor.cs

        this.imageList1.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageList1.ImageStream")));

        this.imageList1 = ColorSpace.ProcessHighContrast(this.imageList1);

        this.uiCommandManager1.ImageList = this.imageList1;

的Utils \ ColorSpace.cs

        public static System.Windows.Forms.ImageList ProcessHighContrast(System.Windows.Forms.ImageList imageList)
    {
        if (System.Windows.Forms.SystemInformation.HighContrast)
        {
            System.Windows.Forms.ImageList imageListNew = new ImageList();

            foreach (System.Drawing.Bitmap imageListImage in imageList.Images)
            {
                for (int i = 0; i < imageListImage.Width; i++)
                {
                    for (int j = 0; j < imageListImage.Height; j++)
                    {
                        Color color = imageListImage.GetPixel(i, j);

                        if (System.Drawing.Color.FromArgb(255, 0, 0, 0).Equals(color))
                            imageListImage.SetPixel(i, j, System.Drawing.SystemColors.WindowText);
                    }
                }

                imageListNew.Images.Add(imageListImage);
            }

            return imageListNew;
        }

        return imageList;
    }