Aero: How to draw solid (opaque) colors on glass?

前端 未结 6 817
孤独总比滥情好
孤独总比滥情好 2020-11-30 03:02

Using GDI+ to draw various colors:

brush = new SolidBrush(color);
graphics.FillRectangle(brush, x, y, width, height);

You\'ll notice that n

6条回答
  •  渐次进展
    2020-11-30 03:57

    I had a similar issue, but it involved drawing onto a layered window, rather than on Aero's glass. I haven't got any code with which I can test whether this solves your problem, but I figured it's worth a shot, since the symptoms of your problem are the same as mine.

    As you have noticed, there seems to be some qwerks with FillRectangle, apparent by the differences between its behaviour and FillEllipse's.

    Here are two work-arounds that I came up with, which each solve my issue:

    • Call FillRectangle twice

      SolidBrush b(Color(254, 255, 0, 0));
      gfx.FillRectangle(&b, Rect(0, 0, width, height));
      gfx.FillRectangle(&b, Rect(0, 0, width, height));
      

      Since the same area is being filled twice, they should blend and create RGB(255, 0, 0) regardless of the glass colour, which leads to a result of a 100% opaque shape. I do not prefer this method, as it requires every rectangle to be drawn twice.

    • Use FillPolygon instead

      Just as with FillEllipse, FillPolygon doesn't seem to have the colour/opacity issue, unless you call it like so:

      SolidBrush b(Color(255, 255, 0, 0));
      Point points[4];
      points[0] = Point(0, 0);
      points[1] = Point(width, 0);
      points[2] = Point(width, height);
      points[4] = Point(0, height);
      gfx.FillPolygon(&b, points, 4); //don't copy and paste - this won't work
      

      For me, the above code resulted in a 100% transparent shape. I am guessing that this is either due to some form of optimisation that passes the call to FillRectangle instead. Or - most likely - there is some problem with FillPolygon, which is called by FillRectangle. Regardless, if you add an extra Point to the array, you can get around it:

      SolidBrush b(Color(255, 255, 0, 0));
      Point points[5];
      points[0] = Point(0, 0);
      points[1] = Point(0, 0); //<-
      points[2] = Point(width, 0);
      points[3] = Point(width, height);
      points[4] = Point(0, height);
      gfx.FillPolygon(&b, points, 5);
      

      The above code indeed draws a 100% opaque shape for me. I hope this also resolves your issue.

提交回复
热议问题