Нажав на элемент управления и заставив его затенять

2

В окнах, когда вы нажимаете значок на рабочем столе, значок темнеть с оттенком, который основан на вашей теме Windows, которая в настоящее время используется.

У меня есть настраиваемый элемент управления, который отображает изображение. Я хотел бы иметь ту же функциональность, что и значок окна. Как получить тот же результат в WinForms, выбрав мой пользовательский элемент управления?

Теги:
winforms

3 ответа

0
Лучший ответ

Сейчас я использую следующий код... если у кого-то есть что-то лучше, я буду рад его изменить!

  private void drawAndShadeTheImage(Graphics g)
  {
     //if the image is null then there is nothing to do.
     if (Image != null)
     {
        Bitmap bitMap = new Bitmap(Image);

        //if this control is selected, shade the image to allow the user to
        //visual identify what is selected.
        if (ContainsFocus)
        {               
           //The delta is the percentage of change in color shading of 
           //the image.
           int delta = 70;

           //zero is the lowest value (0 - 255) that can be represented by
           //a color component.
           int zero = 0;

           //Get each pixel in the image and shade it.
           for (int y = 0; y < bitMap.Height; y++)
           {
              for (int x = 0; x < bitMap.Width; x++)
              {
                 Color oColor = bitMap.GetPixel(x, y);

                 //Lime is the background color on the image and should
                 //always be transparent, if this check is removed the
                 //background will be displayed.
                 if (oColor.ToArgb() != Color.Lime.ToArgb())
                 {
                    int oR = oColor.R - delta < zero ? zero : 
                       oColor.R - delta;
                    int oG = oColor.G - delta < zero ? zero : 
                       oColor.G - delta;
                    int oB = oColor.B - delta < zero ? zero : 
                       oColor.B - delta;
                    int oA = oColor.A - delta < zero ? zero : 
                       oColor.A - delta;

                    Color nColor = Color.FromArgb(oA, oR, oG, oB);

                    bitMap.SetPixel(x, y, nColor);
                 }
              }
           }
        }

        //Make the background of the image transparent.
        bitMap.MakeTransparent();

        g.DrawImage(bitMap, this.ClientRectangle);            
     }
  }
1

Windows реализует альфа-смешивание для выбранных значков с Windows XP. Если вы хотите добиться аналогичного вида, вы должны нарисовать свое изображение с альфа-смешиванием:

public static void DrawBlendImage(Graphics canvas, Image source, Color blendColor, float blendLevel, int x, int y)
{
  Rectangle SourceBounds = new Rectangle(x, y, source.Width, source.Height);

  ColorMatrix MaskMatrix = new ColorMatrix();
  MaskMatrix.Matrix00 = 0f;
  MaskMatrix.Matrix11 = 0f;
  MaskMatrix.Matrix22 = 0f;
  MaskMatrix.Matrix40 = (float)blendColor.R / byte.MaxValue;
  MaskMatrix.Matrix41 = (float)blendColor.G / byte.MaxValue;
  MaskMatrix.Matrix42 = (float)blendColor.B / byte.MaxValue;
  ImageAttributes MaskAttributes = new ImageAttributes();
  MaskAttributes.SetColorMatrix(MaskMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);

  ColorMatrix TransparentMatrix = new ColorMatrix();
  TransparentMatrix.Matrix33 = blendLevel;
  ImageAttributes TransparentAttributes = new ImageAttributes();
  TransparentAttributes.SetColorMatrix(TransparentMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);

  canvas.DrawImage(source, SourceBounds, 0, 0, source.Width, source.Height, GraphicsUnit.Pixel, MaskAttributes);
  canvas.DrawImage(source, SourceBounds, 0, 0, source.Width, source.Height, GraphicsUnit.Pixel, TransparentAttributes);
}

В вашем случае вы можете использовать SystemColors.Highlight как blendColor.

  • 0
    У меня не было возможности попробовать это (в настоящее время работает над другой областью кода). Я приму ответ после того, как проверю его. Спасибо вам за помощь!
  • 0
    Я немного поиграл с этим кодом ... Я не вижу, как KnownColor.Highlight используется в примере.
Показать ещё 1 комментарий
0

Вы можете использовать System.Drawing.KnownColor, чтобы получить правильные цвета для пользовательской темы.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню