Windows 'break up' 如何从 .msstyles 文件中获取图片?
How does Windows 'break up' the pictures from the .msstyles files?
我在说这个 =>
Stream bitmaps
我很好奇,Windows 如何使用该文件上的各个位图? Windows 是否有某种裁剪工具可以在每次必须使用它们时将它们打散?我似乎找不到任何信息。
通常的做法是加载更大的位图,然后在绘图时使用其中的一部分(有时称为 图集)。我不熟悉具体的 .msstyles
,但假设您有确定每个元素在位图中的位置所必需的元数据,您可以使用 BitBlt
等 GDI 函数仅绘制该部分, StretchBlt
或 AlphaBlend
.
这些函数将需要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 主题实现可能不会这样做,而是将图像分割成更小的块以减少内存消耗,例如。
我在说这个 =>
Stream bitmaps
我很好奇,Windows 如何使用该文件上的各个位图? Windows 是否有某种裁剪工具可以在每次必须使用它们时将它们打散?我似乎找不到任何信息。
通常的做法是加载更大的位图,然后在绘图时使用其中的一部分(有时称为 图集)。我不熟悉具体的 .msstyles
,但假设您有确定每个元素在位图中的位置所必需的元数据,您可以使用 BitBlt
等 GDI 函数仅绘制该部分, StretchBlt
或 AlphaBlend
.
这些函数将需要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 主题实现可能不会这样做,而是将图像分割成更小的块以减少内存消耗,例如。