VB.NET使用bitblt绘制位图呈现黑色方块

时间:2013-05-06 03:22:07

标签: vb.net graphics bitmap gdi bitblt

经过多年的VB 6.0,我刚刚开始使用VB.net,我想我会开始使用一些图形。

为了好玩,我正在使用BitBlt绘制我作为资源加载的位图并将其绘制在表单上。我可以从一个图片框加载一个现有的图像并bitblt它,这很好。我也可以从资源中加载位图并将其存储到图片框中,但是当我拿到位图时,将其转换为GDI图形对象并将其粘贴到表格上,我得到的是一个黑色正方形,其尺寸与位图。

这是我的代码:

    Dim srcBmp As New Bitmap(Me.GetType, "colorwheel.bmp")
    Dim drect As New Rectangle(0, 0, 233, 233)
    'srcGrp = PictureBox1.CreateGraphics 'This works.
    srcGrp = Graphics.FromImage(srcBmp)     'This doesn't 
    targetGrp = Me.CreateGraphics 'destination graphics

    srcHdc = srcGrp.GetHdc
    TargetHdc = targetGrp.GetHdc

    BitBlt(TargetHdc, 0, 0, 233, 233, srcHdc, 0, 0, SRCCOPY)

    srcGrp.ReleaseHdc(srcHdc)
    targetGrp.ReleaseHdc(TargetHdc)
    targetGrp.Dispose()
    srcBmp.Dispose()
    srcGrp.Dispose()

我想使用bitblt的原因是a)我之前使用过它,所以这是我的第一选择。 b)我知道可以使用黑白掩模将某些区域掩盖为透明,这正是我所需要的。和b)图形可能经常移动。

是否有更好的方法将具有透明背景的图形绘制到表单或图片框上?例如带有alpha通道的png?

1 个答案:

答案 0 :(得分:2)

解决了。

1)加载位图 2)从位图获取Hbitmap 3)创建空白DC流 4)从DC流创建兼容的DC

        Dim srcBmp As New Bitmap(Me.GetType, "colorwheel.png")
        Dim hbm As IntPtr = srcBmp.GetHbitmap()
        Dim sdc As IntPtr = GetDC(IntPtr.Zero)
        Dim hdc As IntPtr = CreateCompatibleDC(sdc)

然后你可以用hdc进行bitblt。发现bitblt在.net中不能像在vb6中那样工作。我将尝试使用DrawImage方法。