Windows 'break up' 如何从 .msstyles 文件中获取图片?

How does Windows 'break up' the pictures from the .msstyles files?

我在说这个 =>

Stream bitmaps

我很好奇,Windows 如何使用该文件上的各个位图? Windows 是否有某种裁剪工具可以在每次必须使用它们时将它们打散?我似乎找不到任何信息。

通常的做法是加载更大的位图,然后在绘图时使用其中的一部分(有时称为 图集)。我不熟悉具体的 .msstyles,但假设您有确定每个元素在位图中的位置所必需的元数据,您可以使用 BitBlt 等 GDI 函数仅绘制该部分, StretchBltAlphaBlend.

这些函数将需要blit 的源位图区域作为参数,而不是对整个位图进行操作。例如,signature for AlphaBlend 看起来像这样:

BOOL AlphaBlend(
  HDC           hdcDest,
  int           xoriginDest,
  int           yoriginDest,
  int           wDest,
  int           hDest,
  HDC           hdcSrc,
  int           xoriginSrc,
  int           yoriginSrc,
  int           wSrc,
  int           hSrc,
  BLENDFUNCTION ftn
);

如果我们要在皮肤位图中绘制一个位于 x=100,y=200 的 16x16 图标,我们可以按如下方式进行:

AlphaBlend(hdcDest, xoriginDest, yoriginDest, 16, 16, skinDc, 100, 200, 16, 16, blend);

请注意,实际的 Windows 主题实现可能不会这样做,而是将图像分割成更小的块以减少内存消耗,例如。