Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 和两个C语言的位图#_C#_Graphics_Bitmap_Gdi+_Gdi - Fatal编程技术网

C# 和两个C语言的位图#

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 ();

我正在尝试创建两个位图,如下所示:

[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骗到位图中去吗

    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调用,它就会工作。如果问题是多个线程使用同一位图或图形对象,那么问题是否仍然存在?找到了一个解决方案:在这种情况下,位图背景使用透明颜色会产生相同的效果。谢谢你的建议,汉斯。