[C#]GDI+中使用BitBlt绘制图像到窗口失败

  代码如下,将一张图绘制到窗口上,结果只有一个全黑的矩形:

1 Bitmap bmp = (Bitmap)Bitmap.FromFile(@"C:\Users\Ken\Desktop\Load2.bmp"); 
2 Graphics grDest = Graphics.FromHwnd(pictureBox1.Handle);
3 Graphics grSrc = Graphics.FromImage(bmp);
4 IntPtr hdcDest = grDest.GetHdc();
5 IntPtr hdcSrc = grSrc.GetHdc();
6 BitBlt(hdcDest, 0, 0, pictureBox1.Width, pictureBox1.Height,
7 hdcSrc, 0, 0, (uint)TernaryRasterOperations.SRCCOPY); // 0x00CC0020
8 grDest.ReleaseHdc(hdcDest);
9 grSrc.ReleaseHdc(hdcSrc);

  在这里,我将Image绘制到Graphics上,不使用DrawImage,是想使用BitBlt的Raster-Operation能力,具体来说,我手里有两张图,其中一张是掩色,需要先And再Or的操作,所以必须使用GDI的BitBlt。

  解决方案: 

 1 using (Bitmap bmp = (Bitmap)Bitmap.FromFile(@"C:\Jason\forest.jpg")) 
2 using (Graphics grDest = Graphics.FromHwnd(pictureBox1.Handle))
3 using (Graphics grSrc = Graphics.FromImage(bmp))
4 {
5 IntPtr hdcDest = IntPtr.Zero;
6 IntPtr hdcSrc = IntPtr.Zero;
7 IntPtr hBitmap = IntPtr.Zero;
8 IntPtr hOldObject = IntPtr.Zero;
9 try
10 {
11 hdcDest = grDest.GetHdc();
12 hdcSrc = grSrc.GetHdc();
13 hBitmap = bmp.GetHbitmap();
14 hOldObject = SelectObject(hdcSrc, hBitmap);
15 if (hOldObject == IntPtr.Zero)
16 throw new Win32Exception();
17 if (!BitBlt(hdcDest, 0, 0, pictureBox1.Width, pictureBox1.Height, hdcSrc, 0, 0, 0x00CC0020U))
18 throw new Win32Exception(); }
19 finally
20 {
21 if (hOldObject != IntPtr.Zero) SelectObject(hdcSrc, hOldObject);
22 if (hBitmap != IntPtr.Zero) DeleteObject(hBitmap);
23 if (hdcDest != IntPtr.Zero) grDest.ReleaseHdc(hdcDest);
24 if (hdcSrc != IntPtr.Zero) grSrc.ReleaseHdc(hdcSrc);
25 }
26 }

  也就是说,在BitBlt之前,先将和Graphics有联系的Bitmap选作DC的背景图。

  猜测,使用Graphics.FromImage的时候,.Net底层并没有将Bitmap对应的HBitmap选入HDC而只是将两个.Net对象联系起来了,而后在DrawImage中有两次SelectObject分别选入和选出以在HBitmap上绘图。所以独立于.Net进行GDI操作的时候,需要在GDI层面再将两者联系起来,使用SelectObject。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值