سؤال

في Windows عند النقر فوق أيقونة على سطح المكتب الخاص بك، يظلم الأيقونة مع ظل يستند إلى موضوع Windows المستخدم حاليا.

لدي عنصر تحكم مخصص يعرض صورة. أرغب في الحصول على نفس الوظيفة مثل أيقونة Windows Click. كيف يمكنني الحصول على نفس النتيجة في WinForms عن طريق تحديد التحكم المخصص الخاص بي؟

هل كانت مفيدة؟

المحلول 3

الآن أنا أستخدم التعليمة البرمجية التالية ... إذا كان لدى أي شخص أفضل، سأكون سعيدا بتغييره!

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

نصائح أخرى

ينفذ 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.

يمكنك استخدام system.drawing.knowercolor. للحصول على الألوان المناسبة لسمة المستخدم.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top