Несмотря на то, что вы нашли обходной путь, стоит отметить фактический источник исключения. Операции GDI и GDI + не могут чередоваться - одна или другая могут работать одновременно, но не одновременно.
В вашем коде вызов g.GetHdc()
переводит графический объект в состояние, в котором вновь созданный HDC может использоваться для рендеринга GDI. Графический объект будет «использоваться» до вызова g.ReleaseHdc()
. В этот момент HDC уничтожается, и объект Graphics можно снова использовать для рендеринга.
Отметив, что HDC, возвращенный вызовом к GetHdc()
, не был создан и существует только до вызова к ReleaseHdc()
, где он уничтожен, очевидно, что ROP не применяется к более поздним операциям, выполняемым Графический объект.
Если вам нужно было использовать GDI ROP, вам нужно было бы выполнить весь связанный рендеринг в чистом контексте GDI - используя Bitmap.GetHbitmap()
, чтобы получить необходимые дескрипторы. Имейте в виду, что, как и Graphics.GetHdc()
, HBITMAP заново создается из Bitmap
, но не разделяет с ним состояние.
Более подробная информация о взаимодействии GDI / GDI + приведена в KB 311221