Pregunta

En las ventanas cuando se hace clic en un icono en el escritorio, el icono se oscurece con una cortina que se basa en el tema de Windows que se utiliza actualmente.

Tengo un control personalizado que muestra una imagen. Me gustaría tener la misma funcionalidad que el icono de Windows clic. ¿Cómo se obtiene el mismo resultado en Windows Forms mediante la selección de mi control personalizado?

¿Fue útil?

Solución 3

En este momento estoy utilizando el siguiente código ... si alguien tiene algo mejor, voy a estar contento de cambiarlo!

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

Otros consejos

Windows implementa alfa-mezcla para los iconos seleccionados desde Windows XP. Si usted quiere lograr aspecto similar debe llamar su imagen con mezcla alfa:

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

En su caso se puede usar SystemColors.Highlight como blendColor.

Puede utilizar System.Drawing.KnownColor para obtener los colores apropiados para el tema del usuario.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top