Creating Oval Shape Buttons with Bitmap

  I m creating a dialog based application wherein I want to use oval shaped Buttons having a bitmap on it. This Bitmap should take the oval shape of the Button...
Can anyone please help me find a solution to this, by providing the necessary code..
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

See the Non-Rectangular buttons section of the following page.
ShilpaAuthor Commented:
Hi chensu,
 I had tried all these options that u hav provided.....but the bitmap does'nt take the oval shape of the Button....It gives a rectangular shape of the Bitmap itself due to which the rounded effect of the button is lost..
Can u please suggest a differnt method to achieve the same.....
Waiting eagerly for ur reply
Create your bitmap so that there is a unique colour around the outside of the oval shap

Make the button owner-drawn and set up the bitmap so that it the outside color is drawn transparently (fairly easy to do).

Then you should only see an oval.

The only catch (if it is one) is that the full rectangle still active as a button .. but it will look like only an oval.

Another alternative is to use a non-rectangular window for the button itself (you can apply a path the specifies the window shape, there is a clock example that shows a round clock application).  This would need further investigation.
ShilpaAuthor Commented:
Hi Ronslow,
   u hav suggested the method of making the Bitmap transparent on the button...It would be nice of u, if u could please provide the code for the same..
Waiting eagerly for ur reply..
Thanx once again.
One way would be to put the bitmap in an ImageList (which has methods for drawing transparently).

The other is to use the BitBlt methods which use the ROP codes to do transparency.

There are numerous examples around.  For example, MS KB article "HOWTO: Drawing Transparent Bitmaps ID: Q79212"

You could also try codeguru (think its name has changed now) or look elsewhere here.

Here is some code that does it that I dug up in an MSDN article:

void MSJDrawTransparentBitmap(CDC* pDC, CBitmap* pBitmap, int xStart,                               int yStart, COLORREF cTransparentColor)
   CBitmap    bmAndBack, bmAndObject, bmAndMem, bmSave;
   CDC        dcMem, dcBack, dcObject, dcTemp, dcSave;

   dcTemp.SelectObject(pBitmap);          // Select the bitmap

   BITMAP     bm;
   pBitmap->GetObject(sizeof(BITMAP), (LPSTR)&bm);

   CPoint     ptSize;
   ptSize.x = bm.bmWidth;                // Get width of bitmap
   ptSize.y = bm.bmHeight;               // Get height of bitmap
   dcTemp.DPtoLP(&ptSize, 1);            // Convert from device
                                         // to logical points

   // Create some DCs to hold temporary data.

   // Create a bitmap for each DC. DCs are required for a number of GDI functions.

   // Monochrome DC
   bmAndBack.CreateBitmap(ptSize.x, ptSize.y, 1, 1, NULL);

   // Monochrome DC
   bmAndObject.CreateBitmap(ptSize.x, ptSize.y, 1, 1, NULL);

   bmAndMem.CreateCompatibleBitmap(pDC, ptSize.x, ptSize.y);
   bmSave.CreateCompatibleBitmap(pDC, ptSize.x, ptSize.y);

   // Each DC must select a bitmap object to store pixel data.
   CBitmap* pbmBackOld   = dcBack.SelectObject(&bmAndBack);
   CBitmap* pbmObjectOld = dcObject.SelectObject(&bmAndObject);
   CBitmap* pbmMemOld    = dcMem.SelectObject(&bmAndMem);
   CBitmap* pbmSaveOld   = dcSave.SelectObject(&bmSave);

   // Set proper mapping mode.

   // Save the bitmap sent here, because it will be overwritten.
   dcSave.BitBlt(0, 0, ptSize.x, ptSize.y, &dcTemp, 0, 0, SRCCOPY);

   // Set the background color of the source DC to the color
   // contained in the parts of the bitmap that should be transparent
   COLORREF cColor = dcTemp.SetBkColor(cTransparentColor);

   // Create the object mask for the bitmap by performing a BitBlt
   // from the source bitmap to a monochrome bitmap.
   dcObject.BitBlt(0, 0, ptSize.x, ptSize.y, &dcTemp, 0, 0, SRCCOPY);

   // Set the background color of the source DC back to the original
   // color.

   // Create the inverse of the object mask.
   dcBack.BitBlt(0, 0, ptSize.x, ptSize.y, &dcObject, 0, 0, NOTSRCCOPY);

   // Copy the background of the main DC to the destination.
   dcMem.BitBlt(0, 0, ptSize.x, ptSize.y, pDC, xStart, yStart, SRCCOPY);

   // Mask out the places where the bitmap will be placed.
   dcMem.BitBlt(0, 0, ptSize.x, ptSize.y, &dcObject, 0, 0, SRCAND);

   // Mask out the transparent colored pixels on the bitmap.
   dcTemp.BitBlt(0, 0, ptSize.x, ptSize.y, &dcBack, 0, 0, SRCAND);

   // XOR the bitmap with the background on the destination DC.
   dcMem.BitBlt(0, 0, ptSize.x, ptSize.y, &dcTemp, 0, 0, SRCPAINT);

   // Copy the destination to the screen.
   pDC->BitBlt(xStart, yStart, ptSize.x, ptSize.y, &dcMem, 0, 0, SRCCOPY);

   // Place the original bitmap back into the bitmap sent here.
   dcTemp.BitBlt(0, 0, ptSize.x, ptSize.y, &dcSave, 0, 0, SRCCOPY);

   // Reset the memory bitmaps.

   // Memory DCs and Bitmap objects will be deleted automatically

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
System Programming

From novice to tech pro — start learning today.