执着的蜗牛

导航

 

 

  本文来自MICROSOFT MSDN, 翻译

  因此本文按“原样”提供,并且不再更新

  SUMMARY

  有时需要在相同的代码路径中混合GDI和GDI +绘图操作。当您编写允许GDI和GDI +进行互操作的代码时,请注意一些注意事项。本文概述了这些注意事项,并提供了其他信息来帮助您成功编写此类代码。

 

  MORE INFORMATION

 

  虽然可以混合GDI和GDI +代码,但是必须遵循一定的规则。通常,您不应该在一个目标对象上交错GDI和GDI +调用。例如,可以围绕HDC包装Graphics对象,但是直到Graphics对象被销毁,您才能直接从GDI访问HDC。

 

  本文介绍了GDI与GDI +之间互操作性的四个主要场景:

 

   在屏幕支持的GDI +图形对象上使用GDI

   在由位图支持的GDI +图形对象上使用GDI

   在GDI HDC上使用GDI +

   在GDI内存上使用GDI + HBITMAP

 

  在GDI +图形对象上使用GDI支持屏幕

 

  需要在屏幕支持的GDI + Graphics对象上使用GDI的一个例子是绘制“橡皮筋”或“焦点”矩形。GDI +目前不直接支持栅格操作(ROP),因此如果需要R2_XOR笔操作,则必须直接使用GDI。在这种情况下,您将使用GdipGetDC获取将导向GDI输出的HDC。在HDC的使用寿命期间,不应该在Graphics对象上尝试GDI +输出(即直到GdipReleaseDC被调用)。

 

  在GDI +图形对象上使用GDI支持位图

 

  当为由Bitmap而不是屏幕支持的Graphics对象调用GdipGetDC时,创建一个内存HDC,并创建一个新的HBITMAP并将其选择到内存HDC中。这个新的内存位图不是用原始位图的图像进行初始化,而是使用哨兵模式进行初始化,允许GDI +跟踪位图的更改。通过使用GDI代码对内存位图进行的任何更改在哨兵模式的更改中变得明显。当调用GdipReleaseDC时,这些更改将被复制回原始位图。因为内存位图没有用位图的图像初始化,所以以这种方式获得的HDC应被视为“只写”,因此不适合与ROP一起使用,其使用需要读取目标的能力,如R2_XOR。此外,这种方法有性能成本,因为GDI +必须将更改复制回原始位图。

 

  在GDI HDC上使用GDI +

 

  您可以通过使用以HDC为参数的Graphics构造函数来促进在HDC上使用GDI +。Graphics类的绘图成员可以用这种方式绘制在HDC上。一旦Graphics对象附加到HDC,在HDC上不应执行GDI操作,直到Graphics对象被破坏或超出范围。如果HDC需要GDI输出,则在使用原始HDC之前,要么破坏Graphics对象,要么使用GdipGetDC获取新的HDC,然后按照本文前面所述的规则进行互操作,同时在GDI +对象上使用GDI。

 

  在GDI内存上使用GDI + HBITMAP

 

  以HBITMAP为参数的GDI + Bitmap构造函数不使用实际的源HBITMAP作为位图的后备映像。相反,图像的副本在构造函数中进行,即使在执行析构函数期间,更改也不会写回到原始位图。新的位图可以被认为是“创建时复制”,所以要让GDI +从GDI中吸取一个内存HBITMAP,并且这些更改适用于HBITMAP,需要像下面这样的方法:

1.创建一个DIBSection。
2.选择DIBSection到内存HDC。
3.要使用GDI +绘制到DIBSection,请在HDC周围包装一个Graphics对象。
4.要使用GDI绘制到/从DIBSection中,销毁Graphics对象,并使用HDC。
5.破坏Graphics对象,然后从HDC中清除DIBSection选项。

  之后,如果需要,可以从DIBSection构建位图,并将其用作GdipDrawImage中的源图像。

posted on 2018-09-21 17:43  执着的蜗牛  阅读(51)  评论(0)    收藏  举报