How to draw a bitmap on top of button?
-
I want to draw a small arrow bitmap on top of already drawn button. I tried with calling default drawing proc before my code for drawing bitmap but it gives me some error.
OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct) { CDialog::OnDrawItem(nIDCtl, lpDrawItemStruct); HDC thdc = CreateCompatibleDC(lpDrawItemStruct->hDC); HGDIOBJ tobj = SelectObject(thdc, LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_ARROW_DOWN))); TransparentBlt(lpDrawItemStruct->hDC, lpDrawItemStruct->rcItem.right - 20, lpDrawItemStruct->rcItem.top + (lpDrawItemStruct->rcItem.bottom - lpDrawItemStruct->rcItem.top - 16) / 2, 16, 16, thdc, 0, 0, 16, 16, RGB(255, 0, 255)); SelectObject(thdc, tobj); DeleteDC(thdc); }
if i exclude "CDialog::OnDrawItem(nIDCtl, lpDrawItemStruct);" then code works, but there is no borders and caption text, just my bitmap.OK thank you all for your answers, i will try it out and let you know if it's woking. In case my english is so bad that nobody understood what i want to do :), I want to draw something like this http://img252.imageshack.us/img252/2254/codeprojectkc1.png
-
I already tried something with WM_PAINT, but it didn't work. And after reading this article in MSDN i give up on WM_PAINT... "Handling WM_PAINT The most extreme choice is to implement a WM_PAINT handler and do all the painting yourself." http://msdn2.microsoft.com/en-us/library/ms364048(vs.80).aspx
-
I will try.
-
prasad_som wrote:
void CMyButton::OnPaint(){ CButton::OnPaint();// //Here at above line invlaidated client area will be validated and code following has no effect CPaintDC dc(this); // device context for painting //drawing routine follows}
I never said to create another CPaintDC below the CButton::OnPaint(); He can use CClientDC dc(this) to create a device context and do painting to it. Surely it will work.
nave
Naveen R wrote:
I never said to create another CPaintDC below the CButton::OnPaint();
Yes, but it is what should be used in
OnPaint
messages.CClientDC
associated with whole client area of window, as opposed toCPaintDC
which is associated to invalidated rect only. So consider how logical is it to useCClientDC
there. BTW,havn't you come across this line whenever addedWM_PAINT
message handler throught class wizard ? // Do not call CButton::OnPaint() for painting messagesPrasad Notifier using ATL | Operator new[],delete[][^]
-
Can you explain how do you think that i should use CBitmapButton class? As i see that class only helps in inserting bitmaps on to buttons, but it still needs me to draw the button (because my bitmap is displayed only on one small portion of button).
-
I want to draw a small arrow bitmap on top of already drawn button. I tried with calling default drawing proc before my code for drawing bitmap but it gives me some error.
OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct) { CDialog::OnDrawItem(nIDCtl, lpDrawItemStruct); HDC thdc = CreateCompatibleDC(lpDrawItemStruct->hDC); HGDIOBJ tobj = SelectObject(thdc, LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_ARROW_DOWN))); TransparentBlt(lpDrawItemStruct->hDC, lpDrawItemStruct->rcItem.right - 20, lpDrawItemStruct->rcItem.top + (lpDrawItemStruct->rcItem.bottom - lpDrawItemStruct->rcItem.top - 16) / 2, 16, 16, thdc, 0, 0, 16, 16, RGB(255, 0, 255)); SelectObject(thdc, tobj); DeleteDC(thdc); }
if i exclude "CDialog::OnDrawItem(nIDCtl, lpDrawItemStruct);" then code works, but there is no borders and caption text, just my bitmap.CImageButton class is very lousy way of replacing API function DrawFrameControl and i definitely don't need that... All that code is easily replaced with these 4 lines of code: CPaintDC dc(this); CRect rc; GetClientRect(&rc); dc.DrawFrameControl(&rc, DFC_BUTTON, DFCS_BUTTONPUSH); http://img214.imageshack.us/img214/6206/drawingfx6.png
-
Can you explain how do you think that i should use CBitmapButton class? As i see that class only helps in inserting bitmaps on to buttons, but it still needs me to draw the button (because my bitmap is displayed only on one small portion of button).
-
that's a problem :) .. I will tell you another way. Make the button owner draw, in the DrawItem Function,do as follows DrawItem() { DrawFrameControl();// This function will draw a statndard button. // here , draw your bitmap }
nave
I tried that already, look at this picture http://img214.imageshack.us/img214/6206/drawingfx6.png It draws button but without XP styles...
-
I tried that already, look at this picture http://img214.imageshack.us/img214/6206/drawingfx6.png It draws button but without XP styles...
-
check the following article. it draws all controls in xp style http://www.codeproject.com/w2k/xpvisualstyle.asp[^]
nave
OK thanks, this looks like something i needed.
-
check the following article. it draws all controls in xp style http://www.codeproject.com/w2k/xpvisualstyle.asp[^]
nave
I did it, it works now, thank you.
-
I did it, it works now, thank you.