C# 和两个C语言的位图#
我正在尝试创建两个位图,如下所示: [DllImport("gdi32.dll")] public static extern int SetROP2(IntPtr hDC, int nDrawMode); const int SRCAND = 0x008800C6; // AND raster op. lock (g.Clip) { IntPtr pDC = g.GetHdc (); SetROP2 (pDC, SRCAND); g.DrawImageUnscaled (currentBitmap, bound.Location); g.ReleaseHdc (pDC); } [DllImport(“gdi32.dll”)] 公共静态外部int SetROP2(IntPtr hDC、int nDrawMode); 常量int SRCAND=0x008800C6;//和光栅op。 锁(g.夹) { IntPtr pDC=g.GetHdc(); SetROP2(pDC、SRC和); g、 DrawImageUnscaled(当前位图,绑定位置); g、 释放HDC(pDC); } 但是我从Draw语句中得到一个“Object当前在别处使用”异常。在Draw语句运行之前移动ReleaseHdc语句,但不使用指定的raster op LockBits方法太慢,因为它将整个位图复制两次,其中一个位图很大,并且每秒必须发生多次 有什么办法可以把.NET骗到位图中去吗C# 和两个C语言的位图#,c#,graphics,bitmap,gdi+,gdi,C#,Graphics,Bitmap,Gdi+,Gdi,我正在尝试创建两个位图,如下所示: [DllImport("gdi32.dll")] public static extern int SetROP2(IntPtr hDC, int nDrawMode); const int SRCAND = 0x008800C6; // AND raster op. lock (g.Clip) { IntPtr pDC = g.GetHdc ();
lock (g.Clip)
这是行不通的。由于在多个线程中使用位图,因此出现此异常。我猜另一个线程正在绘制位图。要使其工作,必须确保两个线程不能同时使用位图。这确实需要lock关键字。但是在同一个锁对象上。您使用的图形实例将不同。锁坏了
创建两个线程都使用的专用锁定对象
这是行不通的。由于在多个线程中使用位图,因此出现此异常。我猜另一个线程正在绘制位图。要使其工作,必须确保两个线程不能同时使用位图。这确实需要lock关键字。但是在同一个锁对象上。您使用的图形实例将不同。锁坏了
创建两个线程都使用的专用锁定对象。尽管找到了解决方法,但值得注意的是异常的实际来源。GDI和GDI+操作不能交错-一个或另一个操作可以同时进行,但不能同时进行 在代码中,调用
g.GetHdc()
将图形对象切换到新创建的HDC可用于GDI渲染的状态。图形对象将一直处于“使用中”,直到调用g.ReleaseHdc()
。此时,HDC被销毁,图形对象可以再次用于渲染
请注意,调用GetHdc()
返回的HDC已创建,并且仅在调用ReleaseHdc()
之前存在,在该调用被销毁之前,ROP显然不会应用于图形对象执行的后续操作
如果需要使用GDI ROPs,则必须在纯GDI上下文中执行所有相关的渲染-使用Bitmap.GetHbitmap()
获得必要的句柄。请注意,与Graphics.GetHdc()
类似,HBITMAP是从位图创建的,但不与之共享任何状态
有关GDI/GDI+interop的更多详细信息,请参见尽管您找到了一种解决方法,但值得注意的是异常的实际来源。GDI和GDI+操作不能交错-一个或另一个操作可以同时进行,但不能同时进行
在代码中,调用g.GetHdc()
将图形对象切换到新创建的HDC可用于GDI渲染的状态。图形对象将一直处于“使用中”,直到调用g.ReleaseHdc()
。此时,HDC被销毁,图形对象可以再次用于渲染
请注意,调用GetHdc()
返回的HDC已创建,并且仅在调用ReleaseHdc()
之前存在,在该调用被销毁之前,ROP显然不会应用于图形对象执行的后续操作
如果需要使用GDI ROPs,则必须在纯GDI上下文中执行所有相关的渲染-使用Bitmap.GetHbitmap()
获得必要的句柄。请注意,与Graphics.GetHdc()
类似,HBITMAP是从位图创建的,但不与之共享任何状态
有关GDI/GDI+interop的更多详细信息,请参见,我在两个可以绘制的位置使用了相同的锁定对象,但仍然得到相同的错误。如果我取消SetROP2调用,它就会工作。如果问题是多个线程使用同一位图或图形对象,那么问题是否仍然存在?找到了一个解决方案:在这种情况下,位图背景使用透明颜色会产生相同的效果。谢谢你的建议,汉斯。我在两个可以画画的地方都使用了相同的锁定对象,但是我仍然得到相同的错误。如果我取消SetROP2调用,它就会工作。如果问题是多个线程使用同一位图或图形对象,那么问题是否仍然存在?找到了一个解决方案:在这种情况下,位图背景使用透明颜色会产生相同的效果。谢谢你的建议,汉斯。