Windows.Forms - 为 HighContrast 更改 ImageList 位图像素

Windows.Forms - Change ImageList Bitmaps pixels for HighContrast

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

代码得到执行,先是 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;
                 }

已解决

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

ImageList.Images returns a copy of each image. Altering the copy therefore does not modify the ImageList content at all. Create a new ImageList instead. Do consider that Darth Vader color schemes tend to be appreciated only by programmers, regular users expect the high contrast version to have a white background. That's going to be a lot less painful. – Hans Passant

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