最近遇到一个问题记录下
我现在有com组件中一个Graphics gc对象, 而外部动态库的接口func(HDC hdc,......)函数要求传入 HDC hdc,
我使用了 HDC hdc = gc.GetHDC();
但是忘记了 gc.ReleaseHDC(hdc) 使得屏幕上没有绘制出来图形.
另外听老大说 GetHDC 是得到整个屏幕的DC. func内部实现是将整个dc又转成GDI对象,这样绘制效率不高
于是在外部动态库上又增加一个函数 func(void *pGC...);这样将 gc强转成 (void*)(&gc) void 类型的指针.
com组件中使用的GDI与外部动态库使用的是同一个. 但当对外部动态库中的gdi 做矩阵转换,影响到com组件库中其他使用GDI绘制的地方
Graphics gc(hdc);
GraphicsState oldState = gc.Save();
func(void*)(&gc ....);
gc.Restore(oldState);
Restore 将此Graphics 的状态还原到GraphicsState 表示的状态。
Save 保存此Graphics 的当前状态,并用GraphicsState 标识保存的状态。
本文讨论了在COM组件中使用Graphicsgc对象与外部动态库中通过HDChdc参数传递GDI对象之间的同步问题。通过增加函数func(void*pGC...),将Graphicsgc强转为void*类型指针,解决了屏幕绘制问题。同时,讨论了DC的使用和GDI对象间的矩阵转换对其他绘制操作的影响,以及如何通过Graphics的Save和Restore方法来管理图形状态。

被折叠的 条评论
为什么被折叠?



