+ PUSERBUTTON pUser = (PUSERBUTTON)pItem;
+ bool bAutoDraw = (GetWindowStyleFlag() & wxBU_AUTODRAW) != 0;
+
+ if (!pUser)
+ return false;
+
+ wxBitmap bitmap;
+ bool bIsSelected = pUser->fsState & BDS_HILITED;
+ wxClientDC vDc(this);
+
+ if (bIsSelected)
+ bitmap = GetBitmapPressed();
+ else if (pUser->fsState & BDS_DEFAULT)
+ bitmap = GetBitmapFocus();
+ else if (pUser->fsState & BDS_DISABLED)
+ bitmap = GetBitmapDisabled();
+
+ if (!bitmap.IsOk() )
+ {
+ bitmap = GetBitmapLabel();
+ if (!bitmap.IsOk() )
+ return false;
+ }
+
+
+ //
+ // Centre the bitmap in the control area
+ //
+ int nX1 = 0;
+ int nY1 = 0;
+ wxPMDCImpl *impl = (wxPMDCImpl*) vDc.GetImpl();
+ int nWidth = impl->m_vRclPaint.xRight - impl->m_vRclPaint.xLeft;
+ int nHeight = impl->m_vRclPaint.yTop - impl->m_vRclPaint.yBottom;
+ int nBmpWidth = bitmap.GetWidth();
+ int nBmpHeight = bitmap.GetHeight();
+
+ nX1 = (nWidth - nBmpWidth) / 2;
+ nY1 = (nHeight - nBmpHeight) / 2;
+
+ if (bIsSelected && bAutoDraw)
+ {
+ nX1++;
+ nY1++;
+ }
+
+ //
+ // Draw the button face
+ //
+ DrawFace( vDc, bIsSelected );
+
+ //
+ // Draw the bitmap
+ //
+ vDc.DrawBitmap( bitmap, nX1, nY1, true );
+
+ //
+ // Draw focus / disabled state, if auto-drawing
+ //
+ if ((pUser->fsState == BDS_DISABLED) && bAutoDraw)
+ {
+ DrawButtonDisable( vDc, bitmap );
+ }
+ else if ((pUser->fsState == BDS_DEFAULT) && bAutoDraw)
+ {
+ DrawButtonFocus(vDc);
+ }
+ return true;
+} // end of wxBitmapButton::OS2OnDraw
+
+void wxBitmapButton::DrawFace (wxClientDC& rDC, bool bSel)
+{
+ //
+ // Set up drawing colors
+ //
+ wxPen vHiLitePen(*wxWHITE, 2, wxSOLID); // White
+ wxColour gray85(85, 85, 85);
+ wxPen vDarkShadowPen(gray85, 2, wxSOLID);
+ wxColour vFaceColor(204, 204, 204); // Light Grey
+
+ //
+ // Draw the main button face
+ //
+ // This triggers a redraw and destroys the bottom & left focus border and
+ // doesn't seem to do anything useful.
+ // ::WinFillRect(rDC.GetHPS(), &rDC.m_vRclPaint, vFaceColor.GetPixel());
+
+ //
+ // Draw the border
+ // Note: DrawLine expects wxWidgets coordinate system so swap
+ //
+ rDC.SetPen(bSel ? vDarkShadowPen : vHiLitePen);
+ wxPMDCImpl *impl = (wxPMDCImpl*) rDC.GetImpl();
+ // top
+ rDC.DrawLine( impl->m_vRclPaint.xLeft + 1
+ ,impl->m_vRclPaint.yBottom + 1
+ ,impl->m_vRclPaint.xRight - 1
+ ,impl->m_vRclPaint.yBottom + 1
+ );
+ // left
+ rDC.DrawLine( impl->m_vRclPaint.xLeft + 1
+ ,impl->m_vRclPaint.yBottom + 1
+ ,impl->m_vRclPaint.xLeft + 1
+ ,impl->m_vRclPaint.yTop - 1
+ );
+
+ rDC.SetPen(bSel ? vHiLitePen : vDarkShadowPen);
+ // bottom
+ rDC.DrawLine( impl->m_vRclPaint.xLeft + 1
+ ,impl->m_vRclPaint.yTop - 1
+ ,impl->m_vRclPaint.xRight - 1
+ ,impl->m_vRclPaint.yTop - 1
+ );
+ // right
+ rDC.DrawLine( impl->m_vRclPaint.xRight - 1
+ ,impl->m_vRclPaint.yBottom + 1
+ ,impl->m_vRclPaint.xRight - 1
+ ,impl->m_vRclPaint.yTop - 1
+ );
+
+} // end of wxBitmapButton::DrawFace
+
+void wxBitmapButton::DrawButtonFocus (
+ wxClientDC& rDC
+)
+{
+ wxPen vBlackPen(*wxBLACK, 2, wxSOLID);
+
+ //
+ // Draw a thick black line around the outside of the button
+ // Note: DrawLine expects wxWidgets coordinate system so swap
+ //
+ rDC.SetPen(vBlackPen);
+ wxPMDCImpl *impl = (wxPMDCImpl*) rDC.GetImpl();
+ // top
+ rDC.DrawLine( impl->m_vRclPaint.xLeft
+ ,impl->m_vRclPaint.yBottom
+ ,impl->m_vRclPaint.xRight
+ ,impl->m_vRclPaint.yBottom
+ );
+ // right
+ rDC.DrawLine( impl->m_vRclPaint.xRight
+ ,impl->m_vRclPaint.yBottom
+ ,impl->m_vRclPaint.xRight
+ ,impl->m_vRclPaint.yTop
+ );
+ // bottom
+ rDC.DrawLine( impl->m_vRclPaint.xRight
+ ,impl->m_vRclPaint.yTop
+ ,impl->m_vRclPaint.xLeft
+ ,impl->m_vRclPaint.yTop
+ );
+ // left
+ rDC.DrawLine( impl->m_vRclPaint.xLeft
+ ,impl->m_vRclPaint.yTop
+ ,impl->m_vRclPaint.xLeft
+ ,impl->m_vRclPaint.yBottom
+ );
+} // end of wxBitmapButton::DrawButtonFocus
+
+void wxBitmapButton::DrawButtonDisable( wxClientDC& rDC,
+ wxBitmap& rBmp )
+{
+ wxPen vGreyPen(wxT("GREY"), 2, wxSOLID);
+
+ //
+ // Draw a thick black line around the outside of the button
+ // Note: DrawLine expects wxWidgets coordinate system so swap
+ //
+ rDC.SetPen(vGreyPen);
+ wxPMDCImpl *impl = (wxPMDCImpl*) rDC.GetImpl();
+ // top
+ rDC.DrawLine( impl->m_vRclPaint.xLeft
+ ,impl->m_vRclPaint.yBottom
+ ,impl->m_vRclPaint.xRight
+ ,impl->m_vRclPaint.yBottom
+ );
+ // right
+ rDC.DrawLine( impl->m_vRclPaint.xRight
+ ,impl->m_vRclPaint.yBottom
+ ,impl->m_vRclPaint.xRight
+ ,impl->m_vRclPaint.yTop
+ );
+ // bottom
+ rDC.DrawLine( impl->m_vRclPaint.xRight
+ ,impl->m_vRclPaint.yTop
+ ,impl->m_vRclPaint.xLeft
+ ,impl->m_vRclPaint.yTop
+ );
+ // left
+ rDC.DrawLine( impl->m_vRclPaint.xLeft
+ ,impl->m_vRclPaint.yTop
+ ,impl->m_vRclPaint.xLeft
+ ,impl->m_vRclPaint.yBottom
+ );
+ wxDisableBitmap(rBmp, vGreyPen.GetColour().GetPixel());
+} // end of wxBitmapButton::DrawButtonDisable