单击控件并使其变暗

在窗口中单击桌面上的图标时,图标会变暗,其阴影基于当前使用的Windows主题。

我有一个显示图像的自定义控件。 我想拥有与windows图标点击相同的function。 如何通过选择我的自定义控件在WinForms中获得相同的结果?

自Windows XP以来,Windows为选定的图标实现了alpha混合。 如果你想获得类似的外观,你必须用alpha混合绘制你的图像:

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。

您可以使用System.Drawing.KnownColor为用户的主题获取正确的颜色。

现在我正在使用以下代码……如果有人有更好的东西,我会很乐意改变它!

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