我说的是这个=>
流位图
我很好奇,Windows是如何使用该文件上的各个位图的?Windows是否有某种裁剪工具可以在每次使用时将它们分解?我似乎找不到任何信息。
通常的做法是加载更大的位图,然后在绘制时使用其中的一部分(有时称为图集(。我对.msstyles
并不特别熟悉,但假设您拥有确定每个元素在位图中的位置所需的元数据,则可以使用GDI函数(如BitBlt
、StretchBlt
或AlphaBlend
(仅绘制该部分。
这些函数将需要blit的源位图区域作为参数,而不是对整个位图进行操作。例如,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主题化实现可能不是这样做的,而是将图像分割成更小的块,以减少内存消耗。