]>
git.saurik.com Git - wxWidgets.git/blob - src/os2/bmpbuttn.cpp
   1 ///////////////////////////////////////////////////////////////////////////// 
   2 // Name:        src/os2/bmpbuttn.cpp 
   3 // Purpose:     wxBitmapButton 
   4 // Author:      David Webster 
   8 // Copyright:   (c) David Webster 
   9 // Licence:     wxWindows licence 
  10 ///////////////////////////////////////////////////////////////////////////// 
  12 // For compilers that support precompilation, includes "wx.h". 
  13 #include "wx/wxprec.h" 
  17 #include "wx/bmpbuttn.h" 
  22 #include "wx/os2/dcclient.h" 
  23 #include "wx/os2/private.h" 
  26 IMPLEMENT_DYNAMIC_CLASS(wxBitmapButton
, wxButton
) 
  28 #define BUTTON_HEIGHT_FACTOR (EDIT_CONTROL_FACTOR * 1.1) 
  30 bool wxBitmapButton::Create( wxWindow
*          pParent
, 
  32                              const wxBitmap
&    rBitmap
, 
  36                              const wxValidator
& rValidator
, 
  37                              const wxString
&    rsName 
) 
  39     m_bitmaps
[State_Normal
] = rBitmap
; 
  42     SetValidator(rValidator
); 
  45     pParent
->AddChild(this); 
  47     m_backgroundColour 
= pParent
->GetBackgroundColour() ; 
  48     m_foregroundColour 
= pParent
->GetForegroundColour() ; 
  49     m_windowStyle 
= lStyle
; 
  51     if (lStyle 
& wxBU_AUTODRAW
) 
  53         m_marginX 
= wxDEFAULT_BUTTON_MARGIN
; 
  54         m_marginY 
= wxDEFAULT_BUTTON_MARGIN
; 
  60     int nHeight 
= rSize
.y
; 
  63         m_windowId 
= NewControlId(); 
  67     if (nWidth 
== wxDefaultCoord 
&& rBitmap
.IsOk()) 
  68         nWidth 
= rBitmap
.GetWidth() + 4 * m_marginX
; 
  70     if (nHeight 
== wxDefaultCoord 
&& rBitmap
.IsOk()) 
  71         nHeight 
= rBitmap
.GetHeight() + 4 * m_marginY
; 
  73     ULONG                           ulOS2Style 
= WS_VISIBLE 
| WS_TABSTOP 
| BS_USERBUTTON
; 
  75     if (m_windowStyle 
& wxCLIP_SIBLINGS
) 
  76         ulOS2Style 
|= WS_CLIPSIBLINGS
; 
  78     m_hWnd 
= (WXHWND
)::WinCreateWindow( GetHwndOf(pParent
) 
  91     //Subclass again for purposes of dialog editing mode 
  94     SetFont(*wxSMALL_FONT
); 
 101 } // end of wxBitmapButton::Create 
 103 bool wxBitmapButton::OS2OnDraw( WXDRAWITEMSTRUCT
* pItem
) 
 105     PUSERBUTTON  pUser     
= (PUSERBUTTON
)pItem
; 
 106     bool         bAutoDraw 
= (GetWindowStyleFlag() & wxBU_AUTODRAW
) != 0; 
 112     bool       bIsSelected 
= pUser
->fsState 
& BDS_HILITED
; 
 113     wxClientDC 
vDc(this); 
 116         bitmap 
= GetBitmapPressed(); 
 117     else if (pUser
->fsState 
& BDS_DEFAULT
) 
 118         bitmap 
= GetBitmapFocus(); 
 119     else if (pUser
->fsState 
& BDS_DISABLED
) 
 120         bitmap 
= GetBitmapDisabled(); 
 124         bitmap 
= GetBitmapLabel(); 
 131     // Centre the bitmap in the control area 
 135     wxPMDCImpl                      
*impl 
= (wxPMDCImpl
*) vDc
.GetImpl(); 
 136     int                             nWidth     
= impl
->m_vRclPaint
.xRight 
- impl
->m_vRclPaint
.xLeft
; 
 137     int                             nHeight    
= impl
->m_vRclPaint
.yTop 
- impl
->m_vRclPaint
.yBottom
; 
 138     int                             nBmpWidth  
= bitmap
.GetWidth(); 
 139     int                             nBmpHeight 
= bitmap
.GetHeight(); 
 141     nX1 
= (nWidth 
- nBmpWidth
) / 2; 
 142     nY1 
= (nHeight 
- nBmpHeight
) / 2; 
 144     if (bIsSelected 
&& bAutoDraw
) 
 151     // Draw the button face 
 153     DrawFace( vDc
, bIsSelected 
); 
 158     vDc
.DrawBitmap( bitmap
, nX1
, nY1
, true ); 
 161     // Draw focus / disabled state, if auto-drawing 
 163     if ((pUser
->fsState 
== BDS_DISABLED
) && bAutoDraw
) 
 165         DrawButtonDisable( vDc
, bitmap 
); 
 167     else if ((pUser
->fsState 
== BDS_DEFAULT
) && bAutoDraw
) 
 169         DrawButtonFocus(vDc
); 
 172 } // end of wxBitmapButton::OS2OnDraw 
 174 void wxBitmapButton::DrawFace (wxClientDC
& rDC
, bool bSel
) 
 177     // Set up drawing colors 
 179     wxPen 
vHiLitePen(*wxWHITE
, 2, wxSOLID
); // White 
 180     wxColour 
gray85(85, 85, 85); 
 181     wxPen 
vDarkShadowPen(gray85
, 2, wxSOLID
); 
 182     wxColour 
vFaceColor(204, 204, 204); // Light Grey 
 185     // Draw the main button face 
 187     // This triggers a redraw and destroys the bottom & left focus border and 
 188     // doesn't seem to do anything useful. 
 189     //    ::WinFillRect(rDC.GetHPS(), &rDC.m_vRclPaint, vFaceColor.GetPixel()); 
 193     // Note: DrawLine expects wxWidgets coordinate system so swap 
 195     rDC
.SetPen(bSel 
? vDarkShadowPen 
: vHiLitePen
); 
 196     wxPMDCImpl                      
*impl 
= (wxPMDCImpl
*) rDC
.GetImpl(); 
 198     rDC
.DrawLine( impl
->m_vRclPaint
.xLeft 
+ 1 
 199                  ,impl
->m_vRclPaint
.yBottom 
+ 1 
 200                  ,impl
->m_vRclPaint
.xRight 
- 1 
 201                  ,impl
->m_vRclPaint
.yBottom 
+ 1 
 204     rDC
.DrawLine( impl
->m_vRclPaint
.xLeft 
+ 1 
 205                  ,impl
->m_vRclPaint
.yBottom 
+ 1 
 206                  ,impl
->m_vRclPaint
.xLeft 
+ 1 
 207                  ,impl
->m_vRclPaint
.yTop 
- 1 
 210     rDC
.SetPen(bSel 
? vHiLitePen 
: vDarkShadowPen
); 
 212     rDC
.DrawLine( impl
->m_vRclPaint
.xLeft 
+ 1 
 213                  ,impl
->m_vRclPaint
.yTop 
- 1 
 214                  ,impl
->m_vRclPaint
.xRight 
- 1 
 215                  ,impl
->m_vRclPaint
.yTop 
- 1 
 218     rDC
.DrawLine( impl
->m_vRclPaint
.xRight 
- 1 
 219                  ,impl
->m_vRclPaint
.yBottom 
+ 1 
 220                  ,impl
->m_vRclPaint
.xRight 
- 1 
 221                  ,impl
->m_vRclPaint
.yTop 
- 1 
 224 } // end of wxBitmapButton::DrawFace 
 226 void wxBitmapButton::DrawButtonFocus ( 
 230     wxPen 
vBlackPen(*wxBLACK
, 2, wxSOLID
); 
 233     // Draw a thick black line around the outside of the button 
 234     // Note: DrawLine expects wxWidgets coordinate system so swap 
 236     rDC
.SetPen(vBlackPen
); 
 237     wxPMDCImpl                      
*impl 
= (wxPMDCImpl
*) rDC
.GetImpl(); 
 239     rDC
.DrawLine( impl
->m_vRclPaint
.xLeft
 
 240                  ,impl
->m_vRclPaint
.yBottom
 
 241                  ,impl
->m_vRclPaint
.xRight
 
 242                  ,impl
->m_vRclPaint
.yBottom
 
 245     rDC
.DrawLine( impl
->m_vRclPaint
.xRight
 
 246                  ,impl
->m_vRclPaint
.yBottom
 
 247                  ,impl
->m_vRclPaint
.xRight
 
 248                  ,impl
->m_vRclPaint
.yTop
 
 251     rDC
.DrawLine( impl
->m_vRclPaint
.xRight
 
 252                  ,impl
->m_vRclPaint
.yTop
 
 253                  ,impl
->m_vRclPaint
.xLeft
 
 254                  ,impl
->m_vRclPaint
.yTop
 
 257     rDC
.DrawLine( impl
->m_vRclPaint
.xLeft
 
 258                  ,impl
->m_vRclPaint
.yTop
 
 259                  ,impl
->m_vRclPaint
.xLeft
 
 260                  ,impl
->m_vRclPaint
.yBottom
 
 262 } // end of wxBitmapButton::DrawButtonFocus 
 264 void wxBitmapButton::DrawButtonDisable( wxClientDC
& rDC
, 
 267     wxPen 
vGreyPen(wxT("GREY"), 2, wxSOLID
); 
 270     // Draw a thick black line around the outside of the button 
 271     // Note: DrawLine expects wxWidgets coordinate system so swap 
 273     rDC
.SetPen(vGreyPen
); 
 274     wxPMDCImpl                      
*impl 
= (wxPMDCImpl
*) rDC
.GetImpl(); 
 276     rDC
.DrawLine( impl
->m_vRclPaint
.xLeft
 
 277                  ,impl
->m_vRclPaint
.yBottom
 
 278                  ,impl
->m_vRclPaint
.xRight
 
 279                  ,impl
->m_vRclPaint
.yBottom
 
 282     rDC
.DrawLine( impl
->m_vRclPaint
.xRight
 
 283                  ,impl
->m_vRclPaint
.yBottom
 
 284                  ,impl
->m_vRclPaint
.xRight
 
 285                  ,impl
->m_vRclPaint
.yTop
 
 288     rDC
.DrawLine( impl
->m_vRclPaint
.xRight
 
 289                  ,impl
->m_vRclPaint
.yTop
 
 290                  ,impl
->m_vRclPaint
.xLeft
 
 291                  ,impl
->m_vRclPaint
.yTop
 
 294     rDC
.DrawLine( impl
->m_vRclPaint
.xLeft
 
 295                  ,impl
->m_vRclPaint
.yTop
 
 296                  ,impl
->m_vRclPaint
.xLeft
 
 297                  ,impl
->m_vRclPaint
.yBottom
 
 299     wxDisableBitmap(rBmp
, vGreyPen
.GetColour().GetPixel()); 
 300 } // end of wxBitmapButton::DrawButtonDisable 
 302 #endif // ndef for wxUSE_BMPBUTTON