X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/655719367ac5e131d9642e5783f3ecf64d1a3385..096c930c169aec8a027a065163cf78e3e46b224c:/src/os2/bmpbuttn.cpp diff --git a/src/os2/bmpbuttn.cpp b/src/os2/bmpbuttn.cpp index 6697e119b7..82bb6dde95 100644 --- a/src/os2/bmpbuttn.cpp +++ b/src/os2/bmpbuttn.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: bmpbuttn.cpp +// Name: src/os2/bmpbuttn.cpp // Purpose: wxBitmapButton // Author: David Webster // Modified by: @@ -14,29 +14,27 @@ #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 -, const wxValidator& rValidator -, 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); @@ -54,20 +52,20 @@ bool wxBitmapButton::Create( 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()) + if (nWidth == wxDefaultCoord && rBitmap.IsOk()) nWidth = rBitmap.GetWidth() + 4 * m_marginX; - if (nHeight == -1 && rBitmap.Ok()) + if (nHeight == wxDefaultCoord && rBitmap.IsOk()) nHeight = rBitmap.GetHeight() + 4 * m_marginY; ULONG ulOS2Style = WS_VISIBLE | WS_TABSTOP | BS_USERBUTTON; @@ -77,7 +75,7 @@ bool wxBitmapButton::Create( m_hWnd = (WXHWND)::WinCreateWindow( GetHwndOf(pParent) ,WC_BUTTON - ,wxT("") + ,(PSZ)wxEmptyString ,ulOS2Style ,0, 0, 0, 0 ,GetHwndOf(pParent) @@ -97,51 +95,49 @@ bool wxBitmapButton::Create( ,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 (bIsSelected) + bitmap = GetBitmapPressed(); + else if (pUser->fsState & BDS_DEFAULT) + bitmap = GetBitmapFocus(); + else if (pUser->fsState & BDS_DISABLED) + bitmap = GetBitmapDisabled(); - if (!pBitmap->Ok() ) - return FALSE; + 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) { @@ -152,79 +148,75 @@ bool wxBitmapButton::OS2OnDraw( // // 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), 2, wxSOLID); // White - wxPen vDarkShadowPen(wxColour(85, 85, 85), 2, 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 + 1 - ,rDC.m_vRclPaint.yTop - 1 - ,rDC.m_vRclPaint.xRight - 1 - ,rDC.m_vRclPaint.yTop - 1 + 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 + 1 - ,rDC.m_vRclPaint.yTop - 1 - ,rDC.m_vRclPaint.xLeft + 1 - ,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 ? vHiLitePen : vDarkShadowPen); - rDC.DrawLine( rDC.m_vRclPaint.xLeft + 1 - ,rDC.m_vRclPaint.yBottom + 1 - ,rDC.m_vRclPaint.xRight - 1 - ,rDC.m_vRclPaint.yBottom + 1 + // 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.xRight - 1 - ,rDC.m_vRclPaint.yTop - 1 - ,rDC.m_vRclPaint.xRight - 1 - ,rDC.m_vRclPaint.yBottom + 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 @@ -233,72 +225,76 @@ 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 -