使已经绘制的内容透明化?

时间:2012-06-09 19:56:50

标签: c++ winapi gdi+ transparency

我正在完成Connect 4游戏的最后一场比赛。我想让瓷砖实际上下拉而不是只是出现在插槽中,但是有一个z排序问题。

要绘制我的场景,我首先为棋盘画一个矩形,然后用背景颜色在其上画一些洞。问题是瓷砖没有空间。我之前尝试过绘制瓷砖。它会掉下来,但你不能在洞后面看到它,因为它们在我的瓷砖上用纯黄色绘制成纯黄色。我不能在黑色之后绘制它,但在黄色之前绘制它,因为黄色是先绘制的。这是一张漂亮的照片:

The playing board.

我有一些解决方案的可能性,但每个问题都存在问题:

  1. 使用已切出孔的电路板位图。

    • 我可以绘制瓷砖,然后是带有透明度键的奇形状框架。
    • StretchBlt或类似的东西实际拉伸板在不同的分辨率上看起来相同,包括不同的宽高比(相同我的意思是水平和垂直的比例,每次都有相同的比例)?参考图片,无论分辨率如何,它都适合这样的窗口。
  2. 逐个像素地检查并检查要绘制的内容。

    • 这很简单,但不是很慢吗?我听说每个像素可能都没有,但在任何地方都没有真正验证过。
  3. (我认为最适合的那个) - 画板,但不要在顶部打黑洞,而是让板子在这些区域透明。

    • 这是最少量的工作,应该可以提高效率,但我怎么能这样做?
  4. 这些解决方案中的任何一个(尤其是第三个)都是合理的吗?有没有一种简单的方法来解决这个z阶问题呢?

1 个答案:

答案 0 :(得分:2)

似乎最“正确”的方式(不一定是最好的方式)就是填充一个带有孔的矩形形状,而不是稍后添加孔。

如果您正在使用GDI或GDI +,您可以通过创建包含矩形及其中所有圆圈的路径,然后填充该路径来完成此操作。

要在gdi32中执行此操作,请调用BeginPath,使用Rectangle和Ellipse函数将形状添加到路径,然后调用EndPath完成它。使用SetPolyFillMode将HDC设置为ALTERNATE模式。在HDC中选择适当的画笔,然后调用FillPath。

在GDI +中,以备用模式构造路径,使用GraphicsPath :: AddRectangle和GraphicsPath :: AddEllipse添加形状,并用Graphics :: FillPath填充它。

(你可以用绕线模式而不是替代方式来做到这一点,但是你必须要小心路径中的形状线是顺时针还是逆时针。)