Solved

HIcon to HBitmap problem

Posted on 2004-08-08
11
1,495 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
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 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
What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

 
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

On Demand Webinar - Networking for the Cloud Era

This webinar discusses:
-Common barriers companies experience when moving to the cloud
-How SD-WAN changes the way we look at networks
-Best practices customers should employ moving forward with cloud migration
-What happens behind the scenes of SteelConnect’s one-click button

Question has a verified solution.

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

Introduction: Hints for the grid button.  Nested classes, templated collections.  Squash that darned bug! Continuing from the sixth article about sudoku.   Open the project in visual studio. First we will finish with the SUD_SETVALUE messa…
Introduction: The undo support, implementing a stack. Continuing from the eigth article about sudoku.   We need a mechanism to keep track of the digits entered so as to implement an undo mechanism.  This should be a ‘Last In First Out’ collec…
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.
Sometimes it takes a new vantage point, apart from our everyday security practices, to truly see our Active Directory (AD) vulnerabilities. We get used to implementing the same techniques and checking the same areas for a breach. This pattern can re…
Suggested Courses

623 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