先绘矩形再绘文本时SetWorldTransform失效原因
问题原因分析
你的问题核心是GDI与GDI+共享设备上下文(DC)时的状态冲突,具体逻辑如下:
- 当你通过
CDC创建Graphics对象时,Graphics会先捕获当前CDC的所有状态(包括你设置的2倍缩放世界变换)。 - 但一旦调用
Graphics::DrawRectangle这类GDI+绘图操作,GDI+会在内部使用独立的变换机制处理绘图,操作完成后会将CDC的世界变换强制重置为单位矩阵(无缩放、无偏移的默认状态)——这是因为GDI与GDI+的变换体系不兼容,GDI+为了避免后续GDI操作出现异常,会主动恢复DC的基础状态。 - 此时再调用
dcMem.DrawText(GDI原生操作),CDC已经丢失了之前设置的2倍缩放变换,自然无法实现放大效果。
而调换执行顺序后:
- 先调用
dcMem.DrawText,此时CDC的2倍缩放变换仍处于生效状态,GDI的DrawText会正常应用该变换完成文本放大。 - 之后创建
Graphics并执行DrawRectangle,即使GDI+后续重置了CDC的变换,也不会影响已经完成的文本绘制效果;同时Graphics在创建时捕获了CDC的缩放状态,所以矩形也能正常放大。
内容的提问来源于stack exchange,提问作者mathddsccc
相关产品推荐
相关产品推荐

