经过多年的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?
答案 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方法。