(C#)使用BitBlt函数绘出来的图都是黑色

namespaceTestGDI{publicpartialclassForm1:Form{[DllImport("gdi32.dll")]privatestaticex... namespace TestGDI
{
public partial class Form1 : Form
{
[DllImport("gdi32.dll")]
private static extern bool BitBlt(
IntPtr hdcDest, //目标设备的句柄
int nXDest, // 目标对象的左上角的X坐标
int nYDest, // 目标对象的左上角的X坐标
int nWidth, // 目标对象的矩形的宽度
int nHeight, // 目标对象的矩形的长度
IntPtr hdcSrc, // 源设备的句柄
int nXSrc, // 源对象的左上角的X坐标
int nYSrc, // 源对象的左上角的X坐标
int dwRop // 光栅的操作值
);
public const int ROP_SrcCopy = 0xCC0020;

public Form1()
{
InitializeComponent();
}

private void btnShow_Click(object sender, EventArgs e)
{
Image img = Image.FromFile(@"image\1.bmp");
Graphics mg = Graphics.FromImage(img);
Graphics g = this.picMain.CreateGraphics();
//pictureBox picMain
int x = this.picMain.Width; //pictureBox的Width
int y = this.picMain.Height; //pictureBox的Height
IntPtr dc1 = g.GetHdc();
IntPtr dc2 = mg.GetHdc();
BitBlt(dc1, 100, 100, x, y, dc2, 0, 0, ROP_SrcCopy);
}
}
}
在picMain里面的图的大小和1.bmp相同,但就是一团黑色的.
怎么可能画到外面去了,都说了PicMain有绘出和1.bmp一样大的黑方块,而且PicMain的才不至100X100大小.就算改成
BitBlt(dc1, 0, 0, x, y, dc2, 0, 0, ROP_SrcCopy);
还是一样.
展开
 我来答
SquallATF
2008-11-10
知道答主
回答量:1
采纳率:0%
帮助的人:0
展开全部
必须是Graphics绘制到能看到的地方才能用BitBlt
也就是说先用Graphics的RrawImage把图绘到一个picbox,然后才能用BitBlt把图从一个picbox复制到另一个picbox
下面这个例子是VB.net的,不过可以C#化。如果需要就留言吧。

参考资料: http://www.codeproject.com/KB/GDI-plus/BitBlt.aspx

Fade1234
2008-11-01 · TA获得超过1100个赞
知道小有建树答主
回答量:945
采纳率:0%
帮助的人:851万
展开全部
是不是100超过picturebox宽度了,图画到外面去了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
778822杰杰
2024-05-28
知道答主
回答量:34
采纳率:0%
帮助的人:3.3万
展开全部
Image img = Image.FromFile(@"image\1.bmp");
Graphics mg = Graphics.FromImage(img);
Graphics g = this.picMain.CreateGraphics();
//pictureBox picMain
int x = this.picMain.Width; //pictureBox的Width
int y = this.picMain.Height; //pictureBox的Height
IntPtr dc1 = g.GetHdc();
IntPtr dc2 = mg.GetHdc();
var hbitmap = img.GetHbitmap();
var holdObject = SelectObject(dc2, hbitmap);
BitBlt(dc1, 100, 100, x, y, dc2, 0, 0, ROP_SrcCopy);
其中SelectObject如下
[DllImport("gdi32.dll")]
public static extern IntPtr SelectObject(IntPtr hDc, IntPtr hObject);
原因可能是使用Graphics.FromImage的时候,.Net底层并没有将Bitmap对应的HBitmap选入HDC而只是将两个.Net对象联系起来了,而后在DrawImage中有两次SelectObject分别选入和选出以在HBitmap上绘图。所以独立于.Net进行GDI操作的时候,需要在GDI层面再将两者联系起来,使用SelectObject
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
我爱苏锐
2008-11-01 · TA获得超过1150个赞
知道小有建树答主
回答量:1374
采纳率:0%
帮助的人:830万
展开全部
我也遇到这个问题..
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式