桌面宠物:可爱的鱼

转载请注明:敏捷学院-技术资源库原文链接:http://dev.mjxy.cn/a-766.aspx

介绍
本文演示了一个很可爱的金鱼桌面宠物,使用alpha-PNG和GDI+。这个可爱的金鱼可以从一个侧面游泳到您的桌面,当你试图用鼠标抓住它的时候,金鱼会设法逃脱。

 

示例

以下代码显示如何创建一个透明背景的图片

public void SetBits(Bitmap bitmap)
{
    if (!haveHandle) return;
    if (!Bitmap.IsCanonicalPixelFormat(bitmap.PixelFormat) ||
        !Bitmap.IsAlphaPixelFormat(bitmap.PixelFormat))
        throw new ApplicationException("The picture must be " +
                  "32bit picture with alpha channel");
    IntPtr oldBits = IntPtr.Zero;
    IntPtr screenDC = Win32.GetDC(IntPtr.Zero);
    IntPtr hBitmap = IntPtr.Zero;
    IntPtr memDc = Win32.CreateCompatibleDC(screenDC);
    try
    {
        Win32.Point topLoc = new Win32.Point(Left, Top);
        Win32.Size bitMapSize = new Win32.Size(bitmap.Width, bitmap.Height);
        Win32.BLENDFUNCTION blendFunc = new Win32.BLENDFUNCTION();
        Win32.Point srcLoc = new Win32.Point(0, 0);
        hBitmap = bitmap.GetHbitmap(Color.FromArgb(0));
        oldBits = Win32.SelectObject(memDc, hBitmap);
        blendFunc.BlendOp = Win32.AC_SRC_OVER;
        blendFunc.SourceConstantAlpha = 255;
        blendFunc.AlphaFormat = Win32.AC_SRC_ALPHA;
        blendFunc.BlendFlags = 0;
        Win32.UpdateLayeredWindow(Handle, screenDC, ref topLoc, ref bitMapSize,
                         memDc, ref srcLoc, 0, ref blendFunc, Win32.ULW_ALPHA);
    }
    finally
    {
        if (hBitmap != IntPtr.Zero)
        {
            Win32.SelectObject(memDc, oldBits);
            Win32.DeleteObject(hBitmap);
        }
        Win32.ReleaseDC(IntPtr.Zero, screenDC);
        Win32.DeleteDC(memDc);
    }
}

绘制图片

class Frameset : List<Bitmap>, IDisposable
{
    public Frameset(Bitmap b, int framecount)
    {
        if (!Bitmap.IsCanonicalPixelFormat(b.PixelFormat) ||
              !Bitmap.IsAlphaPixelFormat(b.PixelFormat))
            throw new ApplicationException("The picture must be 32bit
                  picture with alpha channel.");

        FrameWidth = b.Width / framecount;
        FrameHeight = b.Height;

        for (int i = 0; i < framecount; i++)
        {
            Bitmap bitmap = new Bitmap(FrameWidth, FrameHeight);
            using (Graphics g = Graphics.FromImage(bitmap))
                g.DrawImage(b, new Rectangle(0, 0, FrameWidth, FrameHeight),
                   new Rectangle(FrameWidth * i, 0, FrameWidth, FrameHeight),
                   GraphicsUnit.Pixel);

            Add(bitmap);
        }
    }

    public int FrameWidth { get; private set; }

    public int FrameHeight { get; private set; }

    public void Dispose()
    {
        foreach (Bitmap f in this)
            f.Dispose();

        Clear();
    }
}

NotifyIcon的上下文菜单允许用户添加和删除鱼,显示和隐藏所有的鱼,还有退出应用程序。

代码下载
FishTank_src.zip

posted @ 2011-08-15 09:55  敏捷学院  阅读(2548)  评论(0编辑  收藏  举报