+ if (m_windowStyle & wxCLIP_SIBLINGS)
+ ulOS2Style |= WS_CLIPSIBLINGS;
+
+ m_hWnd = (WXHWND)::WinCreateWindow( GetHwndOf(pParent)
+ ,WC_BUTTON
+ ,(PSZ)wxEmptyString
+ ,ulOS2Style
+ ,0, 0, 0, 0
+ ,GetHwndOf(pParent)
+ ,HWND_TOP
+ ,m_windowId
+ ,NULL
+ ,NULL
+ );
+
+ //
+ //Subclass again for purposes of dialog editing mode
+ //
+ SubclassWin(m_hWnd);
+ SetFont(*wxSMALL_FONT);
+ SetSize( nX
+ ,nY
+ ,nWidth
+ ,nHeight
+ );
+ return true;
+} // end of wxBitmapButton::Create
+
+bool wxBitmapButton::OS2OnDraw( WXDRAWITEMSTRUCT* pItem)
+{
+ PUSERBUTTON pUser = (PUSERBUTTON)pItem;
+ bool bAutoDraw = (GetWindowStyleFlag() & wxBU_AUTODRAW) != 0;
+
+ if (!pUser)
+ return FALSE;
+
+ wxBitmap* pBitmap;
+ bool bIsSelected = pUser->fsState & BDS_HILITED;
+ wxClientDC vDc(this);
+
+ if (bIsSelected && m_bmpSelected.Ok())
+ pBitmap = &m_bmpSelected;
+ else if ((pUser->fsState & BDS_DEFAULT) && m_bmpFocus.Ok())
+ pBitmap = &m_bmpFocus;
+ else if ((pUser->fsState & BDS_DISABLED) && m_bmpDisabled.Ok())
+ pBitmap = &m_bmpDisabled;
+ else
+ pBitmap = &m_bmpNormal;
+
+ if (!pBitmap->Ok() )
+ return FALSE;
+
+
+ //
+ // Centre the bitmap in the control area
+ //
+ int nX = 0;
+ int nX1 = 0;
+ int nY1 = 0;
+ int nWidth = vDc.m_vRclPaint.xRight - vDc.m_vRclPaint.xLeft;
+ int nHeight = vDc.m_vRclPaint.xRight - vDc.m_vRclPaint.xLeft;
+ int nBmpWidth = pBitmap->GetWidth();
+ int nBmpHeight = pBitmap->GetHeight();
+
+ nX1 = nX + (nWidth - nBmpWidth) / 2;
+ nY1 = nX + (nHeight - nBmpHeight) / 2;
+
+ if (bIsSelected && bAutoDraw)
+ {
+ nX1++;
+ nY1++;
+ }
+
+ //
+ // Draw the button face
+ //
+ {
+ DrawFace( vDc
+ ,bIsSelected
+ );
+ }
+
+ //
+ // Draw the bitmap
+ //
+ vDc.DrawBitmap( *pBitmap, nX1, nY1, true );
+
+ //
+ // Draw focus / disabled state, if auto-drawing
+ //
+ if ((pUser->fsState == BDS_DISABLED) && bAutoDraw)
+ {
+ DrawButtonDisable( vDc
+ ,*pBitmap
+ );
+ }
+ 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
+ //
+ ::WinFillRect(rDC.GetHPS(), &rDC.m_vRclPaint, vFaceColor.GetPixel());
+
+ //
+ // Draw the border
+ //
+ rDC.SetPen(bSel ? vDarkShadowPen : vHiLitePen);
+ rDC.DrawLine( rDC.m_vRclPaint.xLeft + 1
+ ,rDC.m_vRclPaint.yTop - 1
+ ,rDC.m_vRclPaint.xRight - 1
+ ,rDC.m_vRclPaint.yTop - 1
+ );
+ rDC.DrawLine( rDC.m_vRclPaint.xLeft + 1
+ ,rDC.m_vRclPaint.yTop - 1
+ ,rDC.m_vRclPaint.xLeft + 1
+ ,rDC.m_vRclPaint.yBottom + 1
+ );
+
+ rDC.SetPen(bSel ? vHiLitePen : vDarkShadowPen);
+ rDC.DrawLine( rDC.m_vRclPaint.xLeft + 1
+ ,rDC.m_vRclPaint.yBottom + 1
+ ,rDC.m_vRclPaint.xRight - 1
+ ,rDC.m_vRclPaint.yBottom + 1
+ );
+ rDC.DrawLine( rDC.m_vRclPaint.xRight - 1
+ ,rDC.m_vRclPaint.yTop - 1
+ ,rDC.m_vRclPaint.xRight - 1
+ ,rDC.m_vRclPaint.yBottom + 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
+ //
+ rDC.SetPen(vBlackPen);
+ rDC.DrawLine( rDC.m_vRclPaint.xLeft
+ ,rDC.m_vRclPaint.yTop
+ ,rDC.m_vRclPaint.xRight
+ ,rDC.m_vRclPaint.yTop
+ );
+ rDC.DrawLine( rDC.m_vRclPaint.xRight
+ ,rDC.m_vRclPaint.yTop
+ ,rDC.m_vRclPaint.xRight
+ ,rDC.m_vRclPaint.yBottom
+ );
+ rDC.DrawLine( rDC.m_vRclPaint.xRight
+ ,rDC.m_vRclPaint.yBottom
+ ,rDC.m_vRclPaint.xLeft
+ ,rDC.m_vRclPaint.yBottom
+ );
+ rDC.DrawLine( rDC.m_vRclPaint.xLeft
+ ,rDC.m_vRclPaint.yBottom
+ ,rDC.m_vRclPaint.xLeft
+ ,rDC.m_vRclPaint.yTop
+ );
+} // 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
+ //
+ rDC.SetPen(vGreyPen);
+ rDC.DrawLine( rDC.m_vRclPaint.xLeft
+ ,rDC.m_vRclPaint.yTop
+ ,rDC.m_vRclPaint.xRight
+ ,rDC.m_vRclPaint.yTop
+ );
+ rDC.DrawLine( rDC.m_vRclPaint.xRight
+ ,rDC.m_vRclPaint.yTop
+ ,rDC.m_vRclPaint.xRight
+ ,rDC.m_vRclPaint.yBottom
+ );
+ rDC.DrawLine( rDC.m_vRclPaint.xRight
+ ,rDC.m_vRclPaint.yBottom
+ ,rDC.m_vRclPaint.xLeft
+ ,rDC.m_vRclPaint.yBottom
+ );
+ rDC.DrawLine( rDC.m_vRclPaint.xLeft
+ ,rDC.m_vRclPaint.yBottom
+ ,rDC.m_vRclPaint.xLeft
+ ,rDC.m_vRclPaint.yTop
+ );
+ wxDisableBitmap(rBmp, vGreyPen.GetColour().GetPixel());
+} // end of wxBitmapButton::DrawButtonDisable