+ LPDRAWITEMSTRUCT lpDIS = (LPDRAWITEMSTRUCT) item;
+ HDC hDC = lpDIS->hDC;
+ UINT state = lpDIS->itemState;
+ bool isSelected = (state & ODS_SELECTED) != 0;
+ bool autoDraw = (GetWindowStyleFlag() & wxBU_AUTODRAW) != 0;
+
+
+ // choose the bitmap to use depending on the button state
+ wxBitmap *bitmap;
+
+ if ( isSelected && m_bmpSelected.Ok() )
+ bitmap = &m_bmpSelected;
+ else if ( m_bmpHover.Ok() && IsMouseInWindow() )
+ bitmap = &m_bmpHover;
+ else if ((state & ODS_FOCUS) && m_bmpFocus.Ok())
+ bitmap = &m_bmpFocus;
+ else if ((state & ODS_DISABLED) && m_bmpDisabled.Ok())
+ bitmap = &m_bmpDisabled;
+ else
+ bitmap = &m_bmpNormal;
+
+ if ( !bitmap->Ok() )
+ return false;
+
+ // centre the bitmap in the control area
+ int x = lpDIS->rcItem.left;
+ int y = lpDIS->rcItem.top;
+ int width = lpDIS->rcItem.right - x;
+ int height = lpDIS->rcItem.bottom - y;
+ int wBmp = bitmap->GetWidth();
+ int hBmp = bitmap->GetHeight();
+
+#if wxUSE_UXTHEME
+ if ( autoDraw && wxUxThemeEngine::GetIfActive() )
+ {
+ MSWDrawXPBackground(this, item);
+ wxUxThemeHandle theme(this, L"BUTTON");
+
+ // calculate content area margins
+ // assuming here that each state is the same size
+ MARGINS margins;
+ wxUxThemeEngine::Get()->GetThemeMargins(theme, NULL,
+ BP_PUSHBUTTON, PBS_NORMAL,
+ TMT_CONTENTMARGINS, NULL,
+ &margins);
+ int marginX = margins.cxLeftWidth + 1;
+ int marginY = margins.cyTopHeight + 1;
+ int x1,y1;
+
+ if ( m_windowStyle & wxBU_LEFT )
+ {
+ x1 = x + marginX;
+ }
+ else if ( m_windowStyle & wxBU_RIGHT )
+ {
+ x1 = x + (width - wBmp) - marginX;
+ }
+ else
+ {
+ x1 = x + (width - wBmp) / 2;
+ }
+
+ if ( m_windowStyle & wxBU_TOP )
+ {
+ y1 = y + marginY;
+ }
+ else if ( m_windowStyle & wxBU_BOTTOM )
+ {
+ y1 = y + (height - hBmp) - marginY;
+ }
+ else
+ {
+ y1 = y + (height - hBmp) / 2;
+ }
+
+ // draw the bitmap
+ wxDCTemp dst((WXHDC)hDC);
+ dst.DrawBitmap(*bitmap, x1, y1, true);
+
+ return true;
+ }
+#endif // wxUSE_UXTHEME
+
+ int x1,y1;
+
+ if(m_windowStyle & wxBU_LEFT)
+ x1 = x + (FOCUS_MARGIN+1);
+ else if(m_windowStyle & wxBU_RIGHT)
+ x1 = x + (width - wBmp) - (FOCUS_MARGIN+1);
+ else
+ x1 = x + (width - wBmp) / 2;
+
+ if(m_windowStyle & wxBU_TOP)
+ y1 = y + (FOCUS_MARGIN+1);
+ else if(m_windowStyle & wxBU_BOTTOM)
+ y1 = y + (height - hBmp) - (FOCUS_MARGIN+1);
+ else
+ y1 = y + (height - hBmp) / 2;
+
+ if ( isSelected && autoDraw )
+ {
+ x1++;
+ y1++;
+ }
+
+ // draw the face, if auto-drawing
+ if ( autoDraw )
+ {
+ DrawFace((WXHDC) hDC,
+ lpDIS->rcItem.left, lpDIS->rcItem.top,
+ lpDIS->rcItem.right, lpDIS->rcItem.bottom,
+ isSelected);
+ }
+
+ // draw the bitmap
+ wxDCTemp dst((WXHDC)hDC);
+ dst.DrawBitmap(*bitmap, x1, y1, true);
+
+ // draw focus / disabled state, if auto-drawing
+ if ( (state & ODS_DISABLED) && autoDraw )
+ {
+ DrawButtonDisable((WXHDC) hDC,
+ lpDIS->rcItem.left, lpDIS->rcItem.top,
+ lpDIS->rcItem.right, lpDIS->rcItem.bottom,
+ true);
+ }
+ else if ( (state & ODS_FOCUS) && autoDraw )
+ {
+ DrawButtonFocus((WXHDC) hDC,
+ lpDIS->rcItem.left,
+ lpDIS->rcItem.top,
+ lpDIS->rcItem.right,
+ lpDIS->rcItem.bottom,
+ isSelected);
+ }
+
+ return true;
+}