Solved

HIcon to HBitmap problem

Posted on 2004-08-08
11
1,492 Views
Last Modified: 2013-11-20
Hi

I have spent several hours looking at other posts here in EE on this but can not get a result. What I'm lookin for the following

BitmapFromIcon(HICON hIcon, HBITMAP hBitmap)

This is what I done

ASSERT(hIcon);
ICONINFO IconInfo;
GetIconInfo(hIcon, &IconInfo);
BITMAP bm;
GetObject(IconInfo.hbmColor, sizeof(bm), &bm);

HDC hDC= NULL;
HDC dcScreen = ::GetDC(NULL);
hDC = CreateCompatibleDC(dcScreen);
hBitmap = CreateCompatibleBitmap(hDC, bm.bmWidth,bm.bmHeight);

::ReleaseDC(NULL, dcScreen);
HBITMAP bmOld = (HBITMAP)SelectObject(hDC, hBitmap);
DrawIcon(hDC, 0, 0, hIcon);
SelectObject(hDC, bmOld);


I am using this as follows
//
HICON hIcon = ExtractIcon(NULL, szPathName, 0);
ASSERT(hIcon);
HBITMAP hBitmap;
BitmapFromIcon(hIcon, hBitmap);

// I am then using hBitmap is other drawing functions

The problem is I end up with a black square with a white line instead of the icon

Any suggestions

0
Comment
Question by:Dj_Fx8
  • 4
  • 2
  • 2
11 Comments
 
LVL 55

Expert Comment

by:Jaime Olivares
ID: 11746811
1)  Are you sure bitmap dimensions are ok?
2) Try to draw your icon on screen to be sure it is correctly loaded
3) Finally, you have not declared function correctly. Can be:

BitmapFromIcon(HICON hIcon, HBITMAP &hBitmap)

HBITMAP BitmapFromIcon(HICON hIcon)
to use as:  HBITMAP hBitmap = BitmapFromIcon(hIcon); (function must return bitmap handler)

0
 
LVL 55

Expert Comment

by:Jaime Olivares
ID: 11746821
To clarify:

Alternative 1: (easiest)

BitmapFromIcon(HICON hIcon, HBITMAP &hBitmap)

Alternative 2: (more elegant)

HBITMAP BitmapFromIcon(HICON hIcon)
to use as:  HBITMAP hBitmap = BitmapFromIcon(hIcon); (function must return bitmap handler)


0
 
LVL 12

Accepted Solution

by:
migel earned 500 total points
ID: 11746926
Just for error understanding:
here is mistake

HDC hDC= NULL;
HDC dcScreen = ::GetDC(NULL);
hDC = CreateCompatibleDC(dcScreen);
hBitmap = CreateCompatibleBitmap(dcScreen, bm.bmWidth,bm.bmHeight); << HERE!

since memory dc initially have monochrome bitmap you create another monochrome bitmap not colored as you expected :-)
0
Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
LVL 55

Expert Comment

by:Jaime Olivares
ID: 11746950
GetDC(NULL) return the DC from the entire screen.
Read more at:
http://msdn.microsoft.com/library/en-us/gdi/devcons_4esj.asp
0
 

Author Comment

by:Dj_Fx8
ID: 11747434
Hi migel I understand what your saying the problem is but how do I solve it
0
 
LVL 55

Expert Comment

by:Jaime Olivares
ID: 11747540
What migel said is not exact. GetDC return correct screen DC, not monocrome.
You can make a test:
      int bits = GetDeviceCaps(hDC, BITSPIXEL); // will return 24 or 32 bits color resolution

Apparently you are doing thing well inside your function, but YOU ARE NOT RETURNING HBITMAP PROPERLY.
So, after calling BitmapFromIcon(hIcon, hBitmap), hBitmap DOES NOT contain proper handle.
0
 

Author Comment

by:Dj_Fx8
ID: 11747620
>>Apparently you are doing thing well inside your function, but YOU ARE NOT RETURNING HBITMAP PROPERLY.

At the minuite I have not got the code in a seperate function and am using the hBitmap (which is a member var) directly so it's not to do with the returning of the bitmap

I have the same graphic as an icon and a bitmap and when I load the bitmap the rest of my code draws it fine but when I load an icon and convert it to a bitmap it now draws it in black and white (and the scaling of the bitmap that I do later doesn't work on it)
0
 
LVL 12

Expert Comment

by:migel
ID: 11750283
to jaime_olivares
You make "common" mistake - memory DC  has same characteristiks as refererer but initially has monochorome bitmap selected into it :-) (see MSDN)
Of course if you want return bitmap from function you have to pass variable by the reference not by value so
signature as jaime say must  be
int BitmapFromIcon(HICON hIcon, HBITMAP &hBitmap)
or just
HBITMAP BitmapFromIcon(HICON hIcon);
0

Featured Post

Free Tool: Postgres Monitoring System

A PHP and Perl based system to collect and display usage statistics from PostgreSQL databases.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
Turn a spreadsheet into a vba executable. 2 97
ORA-01403: no data found 43 111
Change owner from userA to server Local Administrators 7 71
Thin secure Windows 10 5 107
Here is how to use MFC's automatic Radio Button handling in your dialog boxes and forms.  Beginner programmers usually start with a OnClick handler for each radio button and that's just not the right way to go.  MFC has a very cool system for handli…
In this article, I'll describe -- and show pictures of -- some of the significant additions that have been made available to programmers in the MFC Feature Pack for Visual C++ 2008.  These same feature are in the MFC libraries that come with Visual …
This video will show you how to get GIT to work in Eclipse.   It will walk you through how to install the EGit plugin in eclipse and how to checkout an existing repository.
Exchange organizations may use the Journaling Agent of the Transport Service to archive messages going through Exchange. However, if the Transport Service is integrated with some email content management application (such as an antispam), the admini…

679 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question