Changing Colors in Bitmaps and Making Icons from Them

Environment: MFC/GDI

The day has come when I need to have a large number of identical icons with only one difference—some colors will change from icon to icon. I found the solution for making all of my icons from a single bitmap, and changing colors on the fly. So, I wrote my CCloneBitmap class. It is derived from CBitmap and is able to change colors and export 32x32 icons.

It is very simple to use. Just follow these steps:

  1. Load the bitmap using the LoadBitmap() function.
  2. Make a clone of this bitmap by calling a Clone() method.
  3. Change colors of the bitmap by calling a ChangeColor() method.
  4. You can make a 32x32 icon from this bitmap (if bitmap is 32x32).

Here is a simple example of how to use this class:

HBITMAP hBmp;
CCloneBitmap bmpClone;
HICON hIcon;
hBmp=LoadBitmap(AfxGetResourceHandle(),
     MAKEINTRESOURCE(ID_LIGHTCAR));
if(hBmp!=NULL)
{
  bmpClone.Clone(hBmp);
  DeleteObject(hBmp);
  bmpClone.ChangeColor(IRGB(0,0,0), IRGB(255,0,0));
  // change BLACK pixels to RED ones.
  hIcon=bmpClone.MakeIcon(IRGB(255,255,255));
  // make icon, using WHITE color as transparent.
}
Note: Remember to use the IRGB() macro instead of RGB().

If you have a color in the COLORREF variable, use the INVERSECOLOR() macro:

bmpClone.ChangeColor(IRGB(0,0,0), INVERSECOLOR(myColor));

Downloads

Download source - 2 Kb


Comments

  • Help with dynamic bitmap

    Posted by Legacy on 02/10/2004 12:00am

    Originally posted by: VIjay Shan

    Hi,
    I found your article to be extremely helpful, though had a couplea questions how do i use this class if i have a modified bitmap (cbitmap*). when i paste this bitmap into the clipboard it works fine but when i get a handle and pass it to the clone function and use makeicon it just gives me a black square back. whereas when i try the samething with a preproduced bitmap it works fine. Any kinda help would be appreciated.

    Vijay

    Reply
  • Great, but if you (or someone) would please....

    Posted by Legacy on 05/30/2003 12:00am

    Originally posted by: Chris

    Hello, I'm a Borland C++ Builder programmer and I'd love to use that code, I have MSVC++ and have dabbled in it... I've managed to convert most of the code, but I'm having problems, I was wondering if you could convert it into standard Windows SDK code(nothing like CDC or CBitmap used) and then post it for all programmers to use.
    Thanks and have a nice day. :)

    Reply
Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • Lenovo recommends Windows 8 Pro. "I dropped my laptop getting out of the taxi." This probably sounds familiar to most IT professionals. If your employees are traveling, you know their devices are in for a rough go. Whether it's a trip to the conference room or a convention out of town, any time equipment leaves a user's desk it is at risk of being put into harm's way. Stay connected at all times, whether at the office or on the go, with agile, durable, and flexible devices like the Lenovo® …

  • U.S. companies are desperately trying to recruit and hire skilled software engineers and developers, but there's simply not enough quality talent to go around. In response, companies often resort to inferior solutions -- hiring substandard developers and engineers, recruiting talent on a part-time or temporary basis, poaching people from competitors, or burdening an already stressed IT staff for more of their labor. Fortunately, there's a better solution. Read this white paper to learn the business value of …

Most Popular Programming Stories

More for Developers

RSS Feeds

Thanks for your registration, follow us on our social networks to keep up-to-date