我有一个在Win98上运行良好的游戏(我没有源代码),但是在WinXP或更高版本(即WinXP/7/8/10)上,某些场景中的文本缺失了。顺便说一句:这与语言或区域设置无关,因为我在Win98和WinXP (或更高版本)上都将它们设置为相同的值。
游戏本身不检查Windows版本,所以我非常肯定这个问题是由Windows自Win98以来的内部变化引起的。
我找不到任何描述每个Windows版本之间GDI变化或差异的Microsoft正式文档。有没有人有类似的经验,可能会对这个问题有所了解?
PS:我也尝试过在兼容设置中覆盖Windows版本到Windows 98,甚至Windows 95,但它们都没有帮助。
PPS:我试着调试这个问题,我可以看到文本确实被打印到GDI位图上,但不知何故没有正确地呈现到屏幕上。这是我无法理解的部分,因为游戏在Win98和WinXP (或更高版本)上运行相同的代码。
PPPS:我花了更多的时间在调试上,发现问题出在SRCPAINT的StretchDIBits()中。源DIB是黑色背景上的白色文本。此函数返回时没有出错,但实际上并没有呈现到目标DC上。当我将模式从SRCPAINT更改为SRCCOPY时,文本就会显示出来(后台也会被黑色覆盖,这是预期的)。似乎WinXP或更高版本的SRCPAINT内部出了问题。
发布于 2022-07-03 15:00:51
不管怎么说,我自己终于找到了根源。
在Win98上,当使用SRCPAINT模式调用StretchDIBits()时,源DIB的xSrc、ySrc总是将左下角视为源源。
但是,在WinXP或更高版本上,当使用SRCPAINT模式调用StretchDIBits()时,源DIB的xSrc、ySrc对原点的处理方式有所不同。如果DIB是自底向上的(正高度),则源原点位于左下角;如果DIB是自顶向下的(负高度),则源原点位于左上角。
发布于 2022-07-03 06:04:45
您是否尝试过Windows的兼容性模式?有关示例,请参见http://what-when-how.com/windows-xp/using-program-compatibility-modes-in-windows-xp/。
我问这个问题的原因是,这是找出问题所在的一个重要步骤。如果它在应用shim (即兼容性模式)时工作,那么问题可能是GDI的更改,正如您所说的。否则,Windows的兼容性模式将无法解决此特定问题,或者问题在别处。
https://stackoverflow.com/questions/72847109
复制