/////////////////////////////////////////////////////////////////////////////
-// Name: bmpbuttn.cpp
+// Name: src/os2/bmpbuttn.cpp
// Purpose: wxBitmapButton
// Author: David Webster
// Modified by:
#if wxUSE_BMPBUTTON
-#ifndef WX_PRECOMP
#include "wx/bmpbuttn.h"
+
+#ifndef WX_PRECOMP
#endif
+#include "wx/os2/dcclient.h"
#include "wx/os2/private.h"
-IMPLEMENT_DYNAMIC_CLASS(wxBitmapButton, wxButton)
-
#define BUTTON_HEIGHT_FACTOR (EDIT_CONTROL_FACTOR * 1.1)
-bool wxBitmapButton::Create(
- wxWindow* pParent
-, wxWindowID vId
-, const wxBitmap& rBitmap
-, const wxPoint& rPos
-, const wxSize& rSize
-, long lStyle
-#if wxUSE_VALIDATORS
-, const wxValidator& rValidator
-#endif
-, const wxString& rsName
-)
+bool wxBitmapButton::Create( wxWindow* pParent,
+ wxWindowID vId,
+ const wxBitmap& rBitmap,
+ const wxPoint& rPos,
+ const wxSize& rSize,
+ long lStyle,
+ const wxValidator& rValidator,
+ const wxString& rsName )
{
- m_bmpNormal = rBitmap;
+ m_bitmaps[State_Normal] = rBitmap;
SetName(rsName);
#if wxUSE_VALIDATORS
SetValidator(rValidator);
m_marginY = wxDEFAULT_BUTTON_MARGIN;
}
- int nX = rPos.x;
- int nY = rPos.y;
- int nWidth = rSize.x;
- int nHeight = rSize.y;
+ int nX = rPos.x;
+ int nY = rPos.y;
+ int nWidth = rSize.x;
+ int nHeight = rSize.y;
- if (vId == -1)
+ if (vId == wxID_ANY)
m_windowId = NewControlId();
else
m_windowId = vId;
- if (nWidth == -1 && rBitmap.Ok())
- nWidth = rBitmap.GetWidth() + 2 * m_marginX;
+ if (nWidth == wxDefaultCoord && rBitmap.IsOk())
+ nWidth = rBitmap.GetWidth() + 4 * m_marginX;
- if (nHeight == -1 && rBitmap.Ok())
- nHeight = rBitmap.GetHeight() + 2 * m_marginY;
+ if (nHeight == wxDefaultCoord && rBitmap.IsOk())
+ nHeight = rBitmap.GetHeight() + 4 * m_marginY;
ULONG ulOS2Style = WS_VISIBLE | WS_TABSTOP | BS_USERBUTTON;
m_hWnd = (WXHWND)::WinCreateWindow( GetHwndOf(pParent)
,WC_BUTTON
- ,wxT("")
+ ,(PSZ)wxEmptyString
,ulOS2Style
,0, 0, 0, 0
,GetHwndOf(pParent)
,nWidth
,nHeight
);
- return TRUE;
+ return true;
} // end of wxBitmapButton::Create
-bool wxBitmapButton::OS2OnDraw(
- WXDRAWITEMSTRUCT* pItem
-)
+bool wxBitmapButton::OS2OnDraw( WXDRAWITEMSTRUCT* pItem)
{
- PUSERBUTTON pUser = (PUSERBUTTON)pItem;
- bool bAutoDraw = (GetWindowStyleFlag() & wxBU_AUTODRAW) != 0;
+ PUSERBUTTON pUser = (PUSERBUTTON)pItem;
+ bool bAutoDraw = (GetWindowStyleFlag() & wxBU_AUTODRAW) != 0;
if (!pUser)
- return FALSE;
-
- wxBitmap* pBitmap;
- RECTL vRect;
- 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;
+ return false;
+
+ wxBitmap bitmap;
+ bool bIsSelected = pUser->fsState & BDS_HILITED;
+ wxClientDC vDc(this);
- if (!pBitmap->Ok() )
- return FALSE;
+ 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 nX = 0;
- int nY = 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();
+ 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 = nX + (nWidth - nBmpWidth) / 2;
- nY1 = nX + (nHeight - nBmpHeight) / 2;
+ nX1 = (nWidth - nBmpWidth) / 2;
+ nY1 = (nHeight - nBmpHeight) / 2;
if (bIsSelected && bAutoDraw)
{
//
// Draw the button face
//
- {
- DrawFace( vDc
- ,bIsSelected
- );
- }
+ DrawFace( vDc, bIsSelected );
//
// Draw the bitmap
//
- vDc.DrawBitmap( *pBitmap
- ,nX1
- ,nY1
- ,TRUE
- );
+ vDc.DrawBitmap( bitmap, nX1, nY1, true );
//
// Draw focus / disabled state, if auto-drawing
//
if ((pUser->fsState == BDS_DISABLED) && bAutoDraw)
{
- DrawButtonDisable( vDc
- ,*pBitmap
- );
+ DrawButtonDisable( vDc, bitmap );
}
else if ((pUser->fsState == BDS_DEFAULT) && bAutoDraw)
{
DrawButtonFocus(vDc);
}
- return TRUE;
+ return true;
} // end of wxBitmapButton::OS2OnDraw
-void wxBitmapButton::DrawFace (
- wxClientDC& rDC
-, bool bSel
-)
+void wxBitmapButton::DrawFace (wxClientDC& rDC, bool bSel)
{
//
// Set up drawing colors
//
- wxPen vHiLitePen(wxColour(255, 255, 255), 1, wxSOLID); // White
- wxPen vLitePen(wxColour(223, 223, 223), 1, wxSOLID); // Very Light Grey
- wxPen vShadowPen(wxColour(191, 191, 191), 1, wxSOLID); // Medium Grey
- wxPen vDarkShadowPen(wxColour(128, 128, 128), 1, wxSOLID);
- wxColour vFaceColor(wxColour(204, 204, 204)); // Light Grey
+ 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());
+ // 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);
- rDC.DrawLine( rDC.m_vRclPaint.xLeft
- ,rDC.m_vRclPaint.yTop
- ,rDC.m_vRclPaint.xRight - 1
- ,rDC.m_vRclPaint.yTop
+ 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
);
- rDC.DrawLine( rDC.m_vRclPaint.xLeft
- ,rDC.m_vRclPaint.yTop + 1
- ,rDC.m_vRclPaint.xLeft
- ,rDC.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 ? vShadowPen : vLitePen);
- rDC.DrawLine( rDC.m_vRclPaint.xLeft + 1
- ,rDC.m_vRclPaint.yTop + 1
- ,rDC.m_vRclPaint.xRight - 2
- ,rDC.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
);
- rDC.DrawLine( rDC.m_vRclPaint.xLeft + 1
- ,rDC.m_vRclPaint.yTop + 2
- ,rDC.m_vRclPaint.xLeft + 1
- ,rDC.m_vRclPaint.yBottom - 2
+ // right
+ rDC.DrawLine( impl->m_vRclPaint.xRight - 1
+ ,impl->m_vRclPaint.yBottom + 1
+ ,impl->m_vRclPaint.xRight - 1
+ ,impl->m_vRclPaint.yTop - 1
);
- rDC.SetPen(bSel ? vLitePen : vShadowPen);
- rDC.DrawLine( rDC.m_vRclPaint.xLeft + 1
- ,rDC.m_vRclPaint.yBottom - 2
- ,rDC.m_vRclPaint.xRight - 1
- ,rDC.m_vRclPaint.yBottom - 2
- );
- rDC.DrawLine( rDC.m_vRclPaint.xRight - 2
- ,rDC.m_vRclPaint.yBottom - 3
- ,rDC.m_vRclPaint.xRight - 2
- ,rDC.m_vRclPaint.yTop
- );
-
- rDC.SetPen(bSel ? vDarkShadowPen : vHiLitePen);
- rDC.DrawLine( rDC.m_vRclPaint.xLeft
- ,rDC.m_vRclPaint.yBottom - 1
- ,rDC.m_vRclPaint.xRight + 2
- ,rDC.m_vRclPaint.yBottom - 1
- );
- rDC.DrawLine( rDC.m_vRclPaint.xRight - 1
- ,rDC.m_vRclPaint.yBottom - 2
- ,rDC.m_vRclPaint.xRight - 1
- ,rDC.m_vRclPaint.yTop - 1
- );
} // end of wxBitmapButton::DrawFace
void wxBitmapButton::DrawButtonFocus (
wxClientDC& rDC
)
{
- wxPen vBlackPen(wxColour(0, 0, 0), 2, wxSOLID);
+ 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);
- rDC.DrawLine( rDC.m_vRclPaint.xLeft
- ,rDC.m_vRclPaint.yTop
- ,rDC.m_vRclPaint.xRight
- ,rDC.m_vRclPaint.yTop
+ wxPMDCImpl *impl = (wxPMDCImpl*) rDC.GetImpl();
+ // top
+ rDC.DrawLine( impl->m_vRclPaint.xLeft
+ ,impl->m_vRclPaint.yBottom
+ ,impl->m_vRclPaint.xRight
+ ,impl->m_vRclPaint.yBottom
);
- rDC.DrawLine( rDC.m_vRclPaint.xRight
- ,rDC.m_vRclPaint.yTop
- ,rDC.m_vRclPaint.xRight
- ,rDC.m_vRclPaint.yBottom
+ // right
+ rDC.DrawLine( impl->m_vRclPaint.xRight
+ ,impl->m_vRclPaint.yBottom
+ ,impl->m_vRclPaint.xRight
+ ,impl->m_vRclPaint.yTop
);
- rDC.DrawLine( rDC.m_vRclPaint.xRight
- ,rDC.m_vRclPaint.yBottom
- ,rDC.m_vRclPaint.xLeft
- ,rDC.m_vRclPaint.yBottom
+ // bottom
+ rDC.DrawLine( impl->m_vRclPaint.xRight
+ ,impl->m_vRclPaint.yTop
+ ,impl->m_vRclPaint.xLeft
+ ,impl->m_vRclPaint.yTop
);
- rDC.DrawLine( rDC.m_vRclPaint.xLeft
- ,rDC.m_vRclPaint.yBottom
- ,rDC.m_vRclPaint.xLeft
- ,rDC.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
-)
+void wxBitmapButton::DrawButtonDisable( wxClientDC& rDC,
+ wxBitmap& rBmp )
{
- wxPen vGreyPen(wxColour(128, 128, 128), 2, wxSOLID);
+ 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);
- rDC.DrawLine( rDC.m_vRclPaint.xLeft
- ,rDC.m_vRclPaint.yTop
- ,rDC.m_vRclPaint.xRight
- ,rDC.m_vRclPaint.yTop
+ wxPMDCImpl *impl = (wxPMDCImpl*) rDC.GetImpl();
+ // top
+ rDC.DrawLine( impl->m_vRclPaint.xLeft
+ ,impl->m_vRclPaint.yBottom
+ ,impl->m_vRclPaint.xRight
+ ,impl->m_vRclPaint.yBottom
);
- rDC.DrawLine( rDC.m_vRclPaint.xRight
- ,rDC.m_vRclPaint.yTop
- ,rDC.m_vRclPaint.xRight
- ,rDC.m_vRclPaint.yBottom
+ // right
+ rDC.DrawLine( impl->m_vRclPaint.xRight
+ ,impl->m_vRclPaint.yBottom
+ ,impl->m_vRclPaint.xRight
+ ,impl->m_vRclPaint.yTop
);
- rDC.DrawLine( rDC.m_vRclPaint.xRight
- ,rDC.m_vRclPaint.yBottom
- ,rDC.m_vRclPaint.xLeft
- ,rDC.m_vRclPaint.yBottom
+ // bottom
+ rDC.DrawLine( impl->m_vRclPaint.xRight
+ ,impl->m_vRclPaint.yTop
+ ,impl->m_vRclPaint.xLeft
+ ,impl->m_vRclPaint.yTop
);
- rDC.DrawLine( rDC.m_vRclPaint.xLeft
- ,rDC.m_vRclPaint.yBottom
- ,rDC.m_vRclPaint.xLeft
- ,rDC.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
-void wxBitmapButton::SetDefault()
-{
- wxButton::SetDefault();
-}
-
#endif // ndef for wxUSE_BMPBUTTON
-