如此临时创建的区域,由于计算需要很多的时间,所以使得有点闪烁。改进的方法有:
1、利用屏蔽位图进行处理,可以加快时间
2、如果精灵动作不是特别多,图片不是特别大的情况下,直接将所有创建的区域保存下来,不用每次都来创建和删除,这样将快很多,但是也消耗更多的内存。
// 关键在于如何创建一个随意形状的窗口
准备一张带有透明色背景(就是背景都是一个颜色,呵呵)的bmp图片
创建与位图兼容的dc。然后创建一个空区域
hr=CreateRectRgn(0,0,0,0);
for (i=0;i < 图片宽度-2;i++)
{
for(j = 0;j< 图片高度-2;j++)
{
用dc得到图片i,j处的象素pixel
if( pexel !=透明色)
{
temp=CreateRectRgn(i,j,i+1,j+1);
CombineRgn(hr,hr,temp,RGN_OR);
DeleteObject(temp);
}
// 最后用SetWindowRgn函数将窗口形状设置成上面创建的区域的形状
SetWindowRgn(handle,hr,true);
DeleteObject(hr);
ps:如果有与位图相对应的屏蔽位图,用他们进行光栅操作更方便
通过在定时器中将窗口设成不同的形状,一般为一连串动作的精灵,就可以得到桌面精灵了,瑞星的狮子,office 的助手等等差不多是这样绘制的(不确定)。