【问题标题】:VB.NET using bitblt to draw bitmap renders a black squareVB.NET使用bitblt绘制位图渲染一个黑色方块
【发布时间】:2013-04-29 18:48:43
【问题描述】:

在使用 VB 6.0 多年后,我才刚刚开始使用 VB.net,我想我会开始使用一些图形。

只是为了好玩,我正在使用 BitBlt 来绘制我作为资源加载的位图并将其绘制在表单上。我可以从图片框中加载现有图像并对其进行 bitblt 处理,效果很好。我也可以从资源中加载位图并将其存储到图片框中,但是当我获取位图时,将其转换为 GDI 图形对象并将其 BitBlt 到窗体上,我得到的只是一个与位图。

这是我的代码:

    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?

【问题讨论】:

  • 我不认为有办法在这里碰线? :)

标签: vb.net graphics bitmap gdi bitblt


【解决方案1】:

解决了。

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 方法。

【讨论】:

  • 我发现这个答案很有用。谢谢。 GetDC函数分配的DC(即上面代码中的sdc)不应该以某种方式释放吗?同样的问题也适用于 CreateCompatibleDC 函数返回的 DC(即代码中的 hdc)。
猜你喜欢
  • 1970-01-01
  • 2012-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-21
相关资源
最近更新 更多