tags:

views:

62

answers:

3

I tried the following code on OnInitDialog() but nothing was shown.

m_staticLogo.SetBitmap(::LoadBitmap(NULL, MAKEINTRESOURCE(IDB_LOGO)));

where m_staticLogo is the static picture control and IDB_LOGO is the resource ID of the png file.

+2  A: 

Bitmap and icon it supports. Not sure about png. Alternately, May be you can try the following.

  1. open png in MS Paint or some other viewer.
  2. Then copy the image portion from that.
  3. Create a resource in MFC resource.
  4. Paste the copied image to newly created resource.
  5. Use new resource id in LoadBitmap.
bjskishore123
+2  A: 

As you’ve discovered, ::LoadBitmap (and the newer ::LoadImage) only deal with .bmps. By far the easiest solution is to convert your image to a .bmp.

If the image has transparency, it can be converted into a 32-bit ARGB bitmap (here is a tool called AlphaConv that can convert it). Then load the image using the CImage class LoadFromResource method. Pass the CImage to m_staticLogo.SetBitmap().

But if you really need it to be a .png, it can be done.

Method 1 (the easier way): Load the .png from a file using CImage::Load. Pass the CImage to m_staticLogo.SetBitmap().

Method 2 (the harder way): Load the .png from a resource by loading the resource into a COM IStream and using CImage::Load. (NOTE: CImage::LoadFromResource looks tempting but will not work with a .png graphic). To get the resource into a COM IStream, see this Codeproject article. Note the article works with Gdiplus::Bitmap but the key part is how to create the IStream, which you should be able to adapt for CImage. Finally, pass the CImage to m_staticLogo.SetBitmap().

Edit: Updated to use CImage, which is easier than Gdiplus::Bitmap.

Nate
I converted the png file to bmp but the problem is that the background of the image is not transparent anymore after the conversion. Is there any way to convert and yet still preserve the transparent background?
david.healed
Method 1 works but I would prefer to have the graphic in the resource file. Method 2 is too difficult for me.
david.healed
You can preserve transparency by converting the `.png` to a 32-bit “ARGB” `.bmp`. Standard tools like Paint.NET will not do this. I’ve updated the article with a tool that works. It may look strange when viewed in Visual Studio but renders fine. This works well against one-color backgrounds. It won’t work if you have a complex background like a photo.
Nate
Thank you! It works very well now.
david.healed
A: 

If you are converting .png image file to .bmp format, you can end up with image clarity. So, catch WM_PAINT message in dialog box class and use

Graphics::DrawImage method

To obtain this method link your project with gdiplus.lib library.

Raghuram Reddy N