Click here to Skip to main content
Click here to Skip to main content

A lovely goldfish desktop pet (using alpha-PNG and GDI+)

By , 8 Sep 2008
 

GoldFish

Introduction

This article demonstrates a very lovely goldfish desktop pet, using alpha-PNG and GD+. This cute goldfish can swim from one side to another of your desktop, and tries to escape when you try to catch it using your mouse.

Background

After I posted these articles: A Cool Vista Sidebar Gadget Style CPUInfo Animate Control! (Fixed)A cool Vista-Sidebar-style clock control (4 style)(fixed)! many people asked me how to make a real alpha-transparent form using these controls. Now, this has become a reality! This is a real alpha-transparent form with animation, even in some none-Vista OSs such as XP!

Have fun! And, do not forget to vote! :)

Using the code

To make a form transparent, use this code to set an alpha-transparent PNG picture as its background:

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);
    }
}

OK, so simple! Now, you can use a timer control to implement the animation function.

Sorry for my poor English! Please see the source code for more details.

Points of Interest

  • Developing with GDI+ and C# is a very interesting thing!
  • PNG format is very good for drawing alpha pics!
  • For more code samples, please visit my personal web site.

History

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

Davidwu
China China
Member
No Biography provided

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
GeneralMy vote of 5 [modified] PinmemberJJMatthews23 Oct '12 - 23:40 
Generalnice one Pinmembergeorge pradeep11 Mar '12 - 23:17 
QuestionC++ version Pinmembermrx_jims6 Mar '12 - 0:40 
GeneralMy vote of 5 Pinmembermanoj kumar choubey16 Feb '12 - 23:58 
GeneralMy vote of 5 PinmemberHarith Randika2 Feb '12 - 17:14 
GeneralMy vote of 5 PinmemberTushar_Patil28 Dec '11 - 0:09 
QuestionMy Vote of 4 PinmemberClark Kent12330 Nov '11 - 7:54 
GeneralMy vote of 5 PinmemberMMChandrasekar12 Nov '11 - 15:56 
GeneralMy vote of 5 Pingroupred_code20085 Sep '11 - 19:59 
GeneralMy vote of 5 Pinmemberjerviz_761 Feb '11 - 17:05 
Questionwitch part makes the fish stay on desktop? please tell me.thank you very much. [modified] Pinmemberluangeng21 Sep '10 - 17:10 
GeneralC++ version to David Wu contribution. [modified] Pinmemberhirohata13 Jul '10 - 3:22 
GeneralReally cute PinmemberBigdeak10 Jun '10 - 4:55 
GeneralVery beautiful Pinmemberkuyexing3 Jun '10 - 22:12 
GeneralGood job!,but it is CPU-bounded application. Pinmembernblijun3 Apr '10 - 16:22 
GeneralMy vote of 5 PinmemberSmithers-Jones8 Feb '10 - 0:10 
GeneralTV Logo Pinmemberdivyesh14324 Feb '10 - 19:45 
Generalc++ code for the same PinmemberMember 35644839 Jan '10 - 20:14 
Generalgood job Pinmemberfei_cong9 Dec '09 - 18:43 
GeneralWOW. Pinmemberfrancis321 Sep '09 - 20:40 
GeneralLovely Pinmemberequipmentloannswguru5 Sep '09 - 0:08 
GeneralAmazing!!!! Pinmemberoe30e30e303e12 Aug '09 - 3:51 
QuestionWhere does the goldfish image come from? Pinmembergapman22 Jul '09 - 19:26 
Generalnice job Pinmemberpkfoo11 May '09 - 2:29 
General[Message Removed] PinmemberKatekortez25 Oct '08 - 9:08 
GeneralCool! Made some additions... [modified] PinmemberDon Kackman21 Sep '08 - 10:26 
Generalhi Pinmembersrk-61921 Sep '08 - 5:58 
GeneralNice Article PinmemberReese17 Sep '08 - 6:45 
GeneralNice Work! PinmemberShakeel Iqbal15 Sep '08 - 18:29 
Generalthanks ! PinmemberBillWoodruff15 Sep '08 - 17:05 
GeneralWonderful Pinmemberwangwenyu15 Sep '08 - 14:52 
QuestionExcellent but...! PinmemberVainsofJenna14 Sep '08 - 0:17 
GeneralSize does mater ! PinmemberNicolas MEURET11 Sep '08 - 3:19 
QuestionWhere is the executable or demo? PinmemberIlíon9 Sep '08 - 5:22 
Generalnice work! Pinmembergodviser9 Sep '08 - 3:58 
NewsProblem with website referenced in code Pinmembertlhintoq9 Sep '08 - 3:47 
Generalwonderful. 5 star PinmemberTim Aderson9 Sep '08 - 2:33 
GeneralWow PinmemberJobsFunny9 Sep '08 - 1:17 
GeneralVery nice job! Pinmemberdomz20089 Sep '08 - 1:10 
GeneralNice looking fish, but... PinmvpDave Kreskowiak9 Sep '08 - 0:20 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Permalink | Advertise | Privacy | Mobile
Web04 | 2.6.130516.1 | Last Updated 9 Sep 2008
Article Copyright 2008 by Davidwu
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid