You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

先绘矩形再绘文本时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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 07:27:10