如何在.NET中使用半透明PNG制作透明表单?

时间:2012-08-22 12:37:48

标签: .net transparency

我正在尝试制作一个小恶作剧程序,通过在其上绘制PNG覆盖来模拟“破碎屏幕”。我正在尝试使用Windows Forms(因为这是我最熟悉的),但到目前为止 - 没有运气。我可以通过TransparencyKey / BackgroundColor技巧使表单透明,但是当需要绘制PNG时,它可以预见地分崩离析。还有其他想法吗?

更新

澄清一下,我想要这个:

Right http://valts.21.lv/problem/CrackedRight.jpg

但目前我只是得到了这个:

Wrong http://valts.21.lv/problem/CrackedWrong.jpg

更新2:我通过Google搜索从DeviantArt获得了叠加图片:

Overlay http://fc05.deviantart.net/fs70/f/2010/117/a/2/Broken_Screen_Overlay_by_window7.png

1 个答案:

答案 0 :(得分:0)

我不确定你想要什么,但是你可以绘制完全不透明的PNG,而不是你可以将表格的不透明度属性设置为%75。

编辑:如果上面的答案不是你想要的,你可以创建一个带有透明背景的PictureBox,设置它的底座填充,不要把那个控件带到前面。当您想要显示图像时,您将把它带到前面。然后通过以下方式设置图像的不透明度(如果需要)

   Public Function SetImgOpacity(ByRef imgPic As Image, ByVal imgOpac As Single) As Image

    Dim bmpPic As New Bitmap(imgPic.Width, imgPic.Height)
    Dim gfxPic As Graphics = Graphics.FromImage(bmpPic)
    Dim cmxPic As New ColorMatrix()
    Dim iaPic As New ImageAttributes()

    cmxPic.Matrix33 = imgOpac

    iaPic.SetColorMatrix(cmxPic, ColorMatrixFlag.[Default], ColorAdjustType.Bitmap)
    gfxPic.DrawImage(imgPic, New Rectangle(0, 0, bmpPic.Width, bmpPic.Height), 0, 0, imgPic.Width, imgPic.Height, GraphicsUnit.Pixel, iaPic)

    gfxPic.Dispose()
    iaPic.Dispose()

    Return bmpPic

    End Function

现在您可以将PictureBox的图像设置为新的半透明图像。

编辑2:这是一个很好的技巧

使您的表单不可见,并使用计时器使用此资源中的“a”是您的图像:

    Dim x As Graphics = Graphics.FromHwnd(IntPtr.Zero)
    x.DrawImage(My.Resources.a, 0, 0)

您可以在没有表格的情况下在屏幕上绘图。但是,您需要连续绘制,因为任何其他绘图都可能会打破您的错觉。