【发布时间】:2021-01-15 11:52:19
【问题描述】:
【问题讨论】:
-
您要解决什么问题?在自己的代码中实现类似的功能?
-
是的。正是雅科夫。
-
@Nels King:也看看下面的帖子:1) How to parse an .msstyles file? 2) How to apply a .msstyles to a .NET app?
【问题讨论】:
通常的做法是加载更大的位图,然后在绘制时使用其中的一部分(有时称为atlas)。我不熟悉.msstyles,但假设您有必要的元数据来确定每个元素在位图中的位置,您可以使用 GDI 函数(如BitBlt、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 主题实现可能不会这样做,而是将图像分割成更小的块以减少内存消耗,例如。
【讨论】: