From: David Webster Date: Mon, 9 Sep 2002 03:08:12 +0000 (+0000) Subject: Bitmap button updates X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/db16e5c3aae30ee4502d3e0d41eed500af365fe9 Bitmap button updates git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@17091 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/os2/bmpbuttn.h b/include/wx/os2/bmpbuttn.h index 8847ff3d10..48c13f2b31 100644 --- a/include/wx/os2/bmpbuttn.h +++ b/include/wx/os2/bmpbuttn.h @@ -20,69 +20,83 @@ WXDLLEXPORT_DATA(extern const char*) wxButtonNameStr; class WXDLLEXPORT wxBitmapButton: public wxBitmapButtonBase { - DECLARE_DYNAMIC_CLASS(wxBitmapButton) - public: - inline wxBitmapButton() { m_marginX = wxDEFAULT_BUTTON_MARGIN; m_marginY = wxDEFAULT_BUTTON_MARGIN; } - inline wxBitmapButton(wxWindow *parent, wxWindowID id, const wxBitmap& bitmap, - const wxPoint& pos = wxDefaultPosition, - const wxSize& size = wxDefaultSize, long style = wxBU_AUTODRAW, +public: + inline wxBitmapButton() + { + m_marginX = wxDEFAULT_BUTTON_MARGIN; + m_marginY = wxDEFAULT_BUTTON_MARGIN; + } + inline wxBitmapButton( wxWindow* pParent + ,wxWindowID vId + ,const wxBitmap& rBitmap + ,const wxPoint& rPos = wxDefaultPosition + ,const wxSize& rSize = wxDefaultSize + ,long lStyle = wxBU_AUTODRAW #if wxUSE_VALIDATORS - const wxValidator& validator = wxDefaultValidator, + ,const wxValidator& rValidator = wxDefaultValidator #endif - const wxString& name = wxButtonNameStr) - { - Create(parent, id, bitmap, pos, size, style, validator, name); - } - - bool Create(wxWindow *parent, wxWindowID id, const wxBitmap& bitmap, - const wxPoint& pos = wxDefaultPosition, - const wxSize& size = wxDefaultSize, long style = wxBU_AUTODRAW, + ,const wxString& rsName = wxButtonNameStr + ) + { + Create( pParent + ,vId + ,rBitmap + ,rPos + ,rSize + ,lStyle #if wxUSE_VALIDATORS - const wxValidator& validator = wxDefaultValidator, + ,rValidator #endif - const wxString& name = wxButtonNameStr); + ,rsName + ); + } - virtual void SetLabel(const wxBitmap& bitmap) - { - SetBitmapLabel(bitmap); - } + bool Create( wxWindow* pParent + ,wxWindowID vId + ,const wxBitmap& rBitmap + ,const wxPoint& rPos = wxDefaultPosition + ,const wxSize& rSize = wxDefaultSize + ,long lStyle = wxBU_AUTODRAW +#if wxUSE_VALIDATORS + ,const wxValidator& rValidator = wxDefaultValidator +#endif + ,const wxString& rsName = wxButtonNameStr + ); - virtual void SetBitmapLabel(const wxBitmap& bitmap); + virtual void SetLabel(const wxBitmap& rBitmap) + { + SetBitmapLabel(rBitmap); + } #if WXWIN_COMPATIBILITY - wxBitmap *GetBitmap() const { return (wxBitmap *) & m_buttonBitmap; } + wxBitmap* GetBitmap(void) const + { + return (wxBitmap *)&m_buttonBitmap; + } #endif - inline wxBitmap& GetBitmapLabel() const { return (wxBitmap&) m_buttonBitmap; } - inline wxBitmap& GetBitmapSelected() const { return (wxBitmap&) m_buttonBitmapSelected; } - inline wxBitmap& GetBitmapFocus() const { return (wxBitmap&) m_buttonBitmapFocus; } - inline wxBitmap& GetBitmapDisabled() const { return (wxBitmap&) m_buttonBitmapDisabled; } + // + // Implementation + // + virtual void SetDefault(); + virtual bool OS2OnDraw(WXDRAWITEMSTRUCT* pItem); - inline void SetBitmapSelected(const wxBitmap& sel) { m_buttonBitmapSelected = sel; }; - inline void SetBitmapFocus(const wxBitmap& focus) { m_buttonBitmapFocus = focus; }; - inline void SetBitmapDisabled(const wxBitmap& disabled) { m_buttonBitmapDisabled = disabled; }; +private: - inline void SetMargins(int x, int y) { m_marginX = x; m_marginY = y; } - inline int GetMarginX() { return m_marginX; } - inline int GetMarginY() { return m_marginY; } + virtual void DrawFace( wxClientDC& rDC + ,bool bSel + ); + virtual void DrawButtonFocus(wxClientDC& rDC); + virtual void DrawButtonDisable( wxClientDC& rDC + ,wxBitmap& rBmp + ); + DECLARE_DYNAMIC_CLASS(wxBitmapButton) - virtual void SetDefault(); -// virtual bool OS2OnDraw(WXDRAWITEMSTRUCT *item); - virtual void DrawFace( WXHDC dc, int left, int top, int right, int bottom, bool sel ); - virtual void DrawButtonFocus( WXHDC dc, int left, int top, int right, int bottom, bool sel ); - virtual void DrawButtonDisable( WXHDC dc, int left, int top, int right, int bottom, bool with_marg ); + virtual void SetLabel(const wxString& rsString) + { + wxButton::SetLabel(rsString); + } +}; // end of CLASS wxBitmapButton - protected: - wxBitmap m_buttonBitmap; - wxBitmap m_buttonBitmapSelected; - wxBitmap m_buttonBitmapFocus; - wxBitmap m_buttonBitmapDisabled; - int m_marginX; - int m_marginY; -private: - virtual void SetLabel(const wxString& string) - { wxButton::SetLabel(string); }; -}; +#endif // _WX_BMPBUTTN_H_ -#endif - // _WX_BMPBUTTN_H_ diff --git a/include/wx/os2/private.h b/include/wx/os2/private.h index b6ce09db99..bb4362b277 100644 --- a/include/wx/os2/private.h +++ b/include/wx/os2/private.h @@ -39,6 +39,7 @@ class WXDLLEXPORT wxFont; class WXDLLEXPORT wxWindow; class WXDLLEXPORT wxString; +class WXDLLEXPORT wxBitmap; // --------------------------------------------------------------------------- // private constants @@ -334,9 +335,12 @@ WXDLLEXPORT extern void wxOS2SetFont( HWND hWnd ); -WXDLLEXPORT extern bool wxCheckWindowWndProc( WXHWND hWnd - ,WXFARPROC fnWndProc +WXDLLEXPORT extern bool wxCheckWindowWndProc( WXHWND hWnd + ,WXFARPROC fnWndProc ); +WXDLLEXPORT extern wxBitmap wxDisableBitmap( const wxBitmap& rBmp + ,long lColor + ); + +#endif // _WX_PRIVATE_H_ -#endif - // _WX_PRIVATE_H_ diff --git a/src/os2/bmpbuttn.cpp b/src/os2/bmpbuttn.cpp index ae0b2843da..3118216b05 100644 --- a/src/os2/bmpbuttn.cpp +++ b/src/os2/bmpbuttn.cpp @@ -12,6 +12,8 @@ // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" +#if wxUSE_BMPBUTTON + #ifndef WX_PRECOMP #include "wx/bmpbuttn.h" #endif @@ -23,263 +25,307 @@ IMPLEMENT_DYNAMIC_CLASS(wxBitmapButton, wxButton) #define BUTTON_HEIGHT_FACTOR (EDIT_CONTROL_FACTOR * 1.1) -bool wxBitmapButton::Create(wxWindow *parent, wxWindowID id, const wxBitmap& bitmap, - const wxPoint& pos, - const wxSize& size, long style, +bool wxBitmapButton::Create( + wxWindow* pParent +, wxWindowID vId +, const wxBitmap& rBitmap +, const wxPoint& rPos +, const wxSize& rSize +, long lStyle #if wxUSE_VALIDATORS - const wxValidator& validator, +, const wxValidator& rValidator #endif - const wxString& name) +, const wxString& rsName +) { - m_buttonBitmap = bitmap; - SetName(name); + m_bmpNormal = rBitmap; + SetName(rsName); #if wxUSE_VALIDATORS - SetValidator(validator); + SetValidator(rValidator); #endif - parent->AddChild(this); + pParent->AddChild(this); - m_backgroundColour = parent->GetBackgroundColour() ; - m_foregroundColour = parent->GetForegroundColour() ; - m_windowStyle = style; - m_marginX = 0; - m_marginY = 0; + m_backgroundColour = pParent->GetBackgroundColour() ; + m_foregroundColour = pParent->GetForegroundColour() ; + m_windowStyle = lStyle; - if ( style & wxBU_AUTODRAW ) + if (lStyle & wxBU_AUTODRAW) { m_marginX = wxDEFAULT_BUTTON_MARGIN; m_marginY = wxDEFAULT_BUTTON_MARGIN; } - int x = pos.x; - int y = pos.y; - int width = size.x; - int height = size.y; + int nX = rPos.x; + int nY = rPos.y; + int nWidth = rSize.x; + int nHeight = rSize.y; - if (id == -1) + if (vId == -1) m_windowId = NewControlId(); else - m_windowId = id; - - if ( width == -1 && bitmap.Ok()) - width = bitmap.GetWidth() + 2*m_marginX; - - if ( height == -1 && bitmap.Ok()) - height = bitmap.GetHeight() + 2*m_marginY; - - // TODO: - /* - m_hWnd = (WXHWND)CreateWindowEx - ( - 0, - wxT("BUTTON"), - wxT(""), - WS_VISIBLE | WS_TABSTOP | WS_CHILD | BS_OWNERDRAW , - 0, 0, 0, 0, - GetWinHwnd(parent), - (HMENU)m_windowId, - wxGetInstance(), - NULL - ); - */ - // Subclass again for purposes of dialog editing mode + m_windowId = vId; + + if (nWidth == -1 && rBitmap.Ok()) + nWidth = rBitmap.GetWidth() + 2 * m_marginX; + + if (nHeight == -1 && rBitmap.Ok()) + nHeight = rBitmap.GetHeight() + 2 * m_marginY; + + ULONG ulOS2Style = WS_VISIBLE | WS_TABSTOP | BS_USERBUTTON; + + if (m_windowStyle & wxCLIP_SIBLINGS) + ulOS2Style |= WS_CLIPSIBLINGS; + + m_hWnd = (WXHWND)::WinCreateWindow( GetHwndOf(pParent) + ,WC_BUTTON + ,wxT("") + ,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 - SetFont(parent->GetFont()) ; - - SetSize(x, y, width, height); - - return FALSE; -} - -void wxBitmapButton::SetBitmapLabel(const wxBitmap& bitmap) +bool wxBitmapButton::OS2OnDraw( + WXDRAWITEMSTRUCT* pItem +) { - m_buttonBitmap = bitmap; -} + PUSERBUTTON pUser = (PUSERBUTTON)pItem; + bool bAutoDraw = (GetWindowStyleFlag() & wxBU_AUTODRAW) != 0; -// TODO: -/* -bool wxBitmapButton::MSWOnDraw(WXDRAWITEMSTRUCT *item) -{ -#if defined(__WIN95__) - long style = GetWindowLong((HWND) GetHWND(), GWL_STYLE); - if (style & BS_BITMAP) - { - // Let default procedure draw the bitmap, which is defined - // in the Windows resource. + if (!pUser) return FALSE; - } -#endif - LPDRAWITEMSTRUCT lpDIS = (LPDRAWITEMSTRUCT) item; - - wxBitmap* bitmap = &m_buttonBitmap; - - UINT state = lpDIS->itemState; - if ((state & ODS_SELECTED) && m_buttonBitmapSelected.Ok()) - bitmap = &m_buttonBitmapSelected; - else if ((state & ODS_FOCUS) && m_buttonBitmapFocus.Ok()) - bitmap = &m_buttonBitmapFocus; - else if ((state & ODS_DISABLED) && m_buttonBitmapDisabled.Ok()) - bitmap = &m_buttonBitmapDisabled; - - if ( !bitmap->Ok() ) - return FALSE; - - HDC hDC = lpDIS->hDC; - HDC memDC = ::CreateCompatibleDC(hDC); - - HBITMAP old = (HBITMAP) ::SelectObject(memDC, (HBITMAP) bitmap->GetHBITMAP()); + 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; - if (!old) + if (!pBitmap->Ok() ) return FALSE; - int x = lpDIS->rcItem.left; - int y = lpDIS->rcItem.top; - int width = lpDIS->rcItem.right - x; - int height = lpDIS->rcItem.bottom - y; - - // Draw the face, if auto-drawing - if ( GetWindowStyleFlag() & wxBU_AUTODRAW ) - DrawFace((WXHDC) hDC, lpDIS->rcItem.left, lpDIS->rcItem.top, lpDIS->rcItem.right, lpDIS->rcItem.bottom, - ((state & ODS_SELECTED) == ODS_SELECTED)); + // // Centre the bitmap in the control area - int x1 = (int) (x + ((width - bitmap->GetWidth()) / 2)); - int y1 = (int) (y + ((height - bitmap->GetHeight()) / 2)); - - if ( (state & ODS_SELECTED) && (GetWindowStyleFlag() & wxBU_AUTODRAW) ) + // + 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(); + + nX1 = nX + (nWidth - nBmpWidth) / 2; + nY1 = nX + (nHeight - nBmpHeight) / 2; + + if (bIsSelected && bAutoDraw) { - x1 ++; - y1 ++; + nX1++; + nY1++; } - ::BitBlt(hDC, x1, y1, bitmap->GetWidth(), bitmap->GetHeight(), memDC, 0, 0, SRCCOPY); - - if ( (state & ODS_DISABLED) && (GetWindowStyleFlag() & wxBU_AUTODRAW) ) - DrawButtonDisable( (WXHDC) hDC, lpDIS->rcItem.left, lpDIS->rcItem.top, lpDIS->rcItem.right, lpDIS->rcItem.bottom, TRUE ) ; - else if ( (state & ODS_FOCUS) && (GetWindowStyleFlag() & wxBU_AUTODRAW) ) - DrawButtonFocus( (WXHDC) hDC, lpDIS->rcItem.left, lpDIS->rcItem.top, lpDIS->rcItem.right, lpDIS->rcItem.bottom, ((state & ODS_SELECTED) == ODS_SELECTED)); - - ::SelectObject(memDC, old); - - ::DeleteDC(memDC); - - return TRUE; -} -*/ + // + // Draw the button face + // + { + DrawFace( vDc + ,bIsSelected + ); + } -void wxBitmapButton::DrawFace( WXHDC dc, int left, int top, int right, int bottom, bool sel ) -{ -// TODO: -/* - HPEN oldp; - HBRUSH oldb ; - - HPEN penBorder; - HPEN penLight; - HPEN penShadow; - HBRUSH brushFace; - COLORREF ms_color; - - ms_color = GetSysColor(COLOR_WINDOWFRAME) ; - penBorder = CreatePen(PS_SOLID,0,ms_color) ; - - ms_color = GetSysColor(COLOR_BTNSHADOW) ; - penShadow = CreatePen(PS_SOLID,0,ms_color) ; - - ms_color = GetSysColor(COLOR_BTNHIGHLIGHT) ; - penLight = CreatePen(PS_SOLID,0,ms_color) ; - - ms_color = GetSysColor(COLOR_BTNFACE) ; - brushFace = CreateSolidBrush(ms_color) ; - - oldp = (HPEN) SelectObject( (HDC) dc, GetStockObject( NULL_PEN ) ) ; - oldb = (HBRUSH) SelectObject( (HDC) dc, brushFace ) ; - Rectangle( (HDC) dc, left, top, right, bottom ) ; - SelectObject( (HDC) dc, penBorder) ; - MoveToEx((HDC) dc,left+1,top,NULL);LineTo((HDC) dc,right-1,top); - MoveToEx((HDC) dc,left,top+1,NULL);LineTo((HDC) dc,left,bottom-1); - MoveToEx((HDC) dc,left+1,bottom-1,NULL);LineTo((HDC) dc,right-1,bottom-1); - MoveToEx((HDC) dc,right-1,top+1,NULL);LineTo((HDC) dc,right-1,bottom-1); - - SelectObject( (HDC) dc, penShadow) ; - if (sel) + // + // Draw the bitmap + // + vDc.DrawBitmap( *pBitmap + ,nX1 + ,nY1 + ,TRUE + ); + + // + // Draw focus / disabled state, if auto-drawing + // + if ((pUser->fsState == BDS_DISABLED) && bAutoDraw) { - MoveToEx((HDC) dc,left+1 ,bottom-2 ,NULL) ; - LineTo((HDC) dc, left+1 ,top+1) ; - LineTo((HDC) dc, right-2 ,top+1) ; + DrawButtonDisable( vDc + ,*pBitmap + ); } - else + else if ((pUser->fsState == BDS_DEFAULT) && bAutoDraw) { - MoveToEx((HDC) dc,left+1 ,bottom-2 ,NULL) ; - LineTo((HDC) dc, right-2 ,bottom-2) ; - LineTo((HDC) dc, right-2 ,top) ; - MoveToEx((HDC) dc,left+2 ,bottom-3 ,NULL) ; - LineTo((HDC) dc, right-3 ,bottom-3) ; - LineTo((HDC) dc, right-3 ,top+1) ; - - SelectObject( (HDC) dc, penLight) ; - - MoveToEx((HDC) dc,left+1 ,bottom-2 ,NULL) ; - LineTo((HDC) dc, left+1 ,top+1) ; - LineTo((HDC) dc, right-2 ,top+1) ; + DrawButtonFocus(vDc); } - SelectObject((HDC) dc,oldp) ; - SelectObject((HDC) dc,oldb) ; - - DeleteObject(penBorder); - DeleteObject(penLight); - DeleteObject(penShadow); - DeleteObject(brushFace); -*/ -} - -#define FOCUS_MARGIN 6 + return TRUE; +} // end of wxBitmapButton::OS2OnDraw -void wxBitmapButton::DrawButtonFocus( WXHDC dc, int left, int top, int right, int bottom, bool sel ) +void wxBitmapButton::DrawFace ( + wxClientDC& rDC +, bool bSel +) { - // TODO: -/* - RECT rect; - rect.left = left; - rect.top = top; - rect.right = right; - rect.bottom = bottom; - InflateRect( &rect, - FOCUS_MARGIN, - FOCUS_MARGIN ) ; - if ( sel ) - OffsetRect( &rect, 1, 1 ) ; - DrawFocusRect( (HDC) dc, &rect ) ; -*/ -} - -// extern HBRUSH wxDisableButtonBrush; - -void wxBitmapButton::DrawButtonDisable( WXHDC dc, int left, int top, int right, int bottom, bool with_marg ) + // + // 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 + + // + // 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 + ,rDC.m_vRclPaint.yTop + ,rDC.m_vRclPaint.xRight - 1 + ,rDC.m_vRclPaint.yTop + ); + rDC.DrawLine( rDC.m_vRclPaint.xLeft + ,rDC.m_vRclPaint.yTop + 1 + ,rDC.m_vRclPaint.xLeft + ,rDC.m_vRclPaint.yBottom - 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.DrawLine( rDC.m_vRclPaint.xLeft + 1 + ,rDC.m_vRclPaint.yTop + 2 + ,rDC.m_vRclPaint.xLeft + 1 + ,rDC.m_vRclPaint.yBottom - 2 + ); + + 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 +) { -// TODO: -/* - HBRUSH old = (HBRUSH) SelectObject( (HDC) dc, wxDisableButtonBrush ) ; - - if ( with_marg ) - ::PatBlt( (HDC) dc, left + m_marginX, top + m_marginY, - right - 2 * m_marginX, bottom - 2 * m_marginY, -#ifdef __SALFORDC__ - 0xfa0089L ) ; -#else - 0xfa0089UL ) ; -#endif - else ::PatBlt( (HDC) dc, left, top, right, bottom, -#ifdef __SALFORDC__ - 0xfa0089L ) ; -#else - 0xfa0089UL ) ; -#endif - ::SelectObject( (HDC) dc, old ) ; -*/ -} + wxPen vBlackPen(wxColour(0, 0, 0), 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(wxColour(128, 128, 128), 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 void wxBitmapButton::SetDefault() { wxButton::SetDefault(); } + +#endif // ndef for wxUSE_BMPBUTTON + diff --git a/src/os2/settings.cpp b/src/os2/settings.cpp index 4c70221cb8..de9acf20c8 100644 --- a/src/os2/settings.cpp +++ b/src/os2/settings.cpp @@ -149,6 +149,17 @@ wxColour wxSystemSettingsNative::GetColour( ); break; + case wxSYS_COLOUR_BTNDARKSHADOW: + vRef = (ULONG)::WinQuerySysColor( HWND_DESKTOP + ,SYSCLR_BUTTONDARK + ,0L + ); + vCol.Set( GetRValue(vRef) + ,GetGValue(vRef) + ,GetBValue(vRef) + ); + break; + case wxSYS_COLOUR_MENUBAR: vRef = (ULONG)::WinQuerySysColor( HWND_DESKTOP ,SYSCLR_MENU diff --git a/src/os2/toolbar.cpp b/src/os2/toolbar.cpp index e432c1b1c6..1d296bda35 100644 --- a/src/os2/toolbar.cpp +++ b/src/os2/toolbar.cpp @@ -28,222 +28,6 @@ bool wxToolBar::m_bInitialized = FALSE; -// --------------------------------------------------------------------------- -// Helper for taking a regular bitmap and giving it a disabled look -// --------------------------------------------------------------------------- -wxBitmap wxDisableBitmap( - const wxBitmap& rBmp -, long lColor -) -{ - wxMask* pMask = rBmp.GetMask(); - - if (!pMask) - return(wxNullBitmap); - - DEVOPENSTRUC vDop = {0L, "DISPLAY", NULL, 0L, 0L, 0L, 0L, 0L, 0L}; - SIZEL vSize = {0, 0}; - HDC hDC = ::DevOpenDC(vHabmain, OD_MEMORY, "*", 5L, (PDEVOPENDATA)&vDop, NULLHANDLE); - HPS hPS = ::GpiCreatePS(vHabmain, hDC, &vSize, PU_PELS | GPIA_ASSOC); - BITMAPINFOHEADER2 vHeader; - BITMAPINFO2 vInfo; - ERRORID vError; - wxString sError; - HBITMAP hBitmap = (HBITMAP)rBmp.GetHBITMAP(); - HBITMAP hOldBitmap = NULLHANDLE; - HBITMAP hOldMask = NULLHANDLE; - HBITMAP hMask = (HBITMAP)rBmp.GetMask()->GetMaskBitmap(); - unsigned char* pucBits; // buffer that will contain the bitmap data - unsigned char* pucData; // pointer to use to traverse bitmap data - unsigned char* pucBitsMask; // buffer that will contain the mask data - unsigned char* pucDataMask; // pointer to use to traverse mask data - LONG lScans = 0L; - LONG lScansSet = 0L; - bool bpp16 = (wxDisplayDepth() == 16); - - memset(&vHeader, '\0', 16); - vHeader.cbFix = 16; - - memset(&vInfo, '\0', 16); - vInfo.cbFix = 16; - vInfo.cx = (ULONG)rBmp.GetWidth(); - vInfo.cy = (ULONG)rBmp.GetHeight(); - vInfo.cPlanes = 1; - vInfo.cBitCount = 24; // Set to desired count going in - - // - // Create the buffers for data....all wxBitmaps are 24 bit internally - // - int nBytesPerLine = rBmp.GetWidth() * 3; - int nSizeDWORD = sizeof(DWORD); - int nLineBoundary = nBytesPerLine % nSizeDWORD; - int nPadding = 0; - int i; - int j; - - // - // Bitmap must be ina double-word alligned address so we may - // have some padding to worry about - // - if (nLineBoundary > 0) - { - nPadding = nSizeDWORD - nLineBoundary; - nBytesPerLine += nPadding; - } - pucBits = (unsigned char *)malloc(nBytesPerLine * rBmp.GetHeight()); - memset(pucBits, '\0', (nBytesPerLine * rBmp.GetHeight())); - pucBitsMask = (unsigned char *)malloc(nBytesPerLine * rBmp.GetHeight()); - memset(pucBitsMask, '\0', (nBytesPerLine * rBmp.GetHeight())); - - // - // Extract the bitmap and mask data - // - if ((hOldBitmap = ::GpiSetBitmap(hPS, hBitmap)) == HBM_ERROR) - { - vError = ::WinGetLastError(vHabmain); - sError = wxPMErrorToStr(vError); - } - ::GpiQueryBitmapInfoHeader(hBitmap, &vHeader); - vInfo.cBitCount = 24; - if ((lScans = ::GpiQueryBitmapBits( hPS - ,0L - ,(LONG)rBmp.GetHeight() - ,(PBYTE)pucBits - ,&vInfo - )) == GPI_ALTERROR) - { - vError = ::WinGetLastError(vHabmain); - sError = wxPMErrorToStr(vError); - } - if ((hOldMask = ::GpiSetBitmap(hPS, hMask)) == HBM_ERROR) - { - vError = ::WinGetLastError(vHabmain); - sError = wxPMErrorToStr(vError); - } - ::GpiQueryBitmapInfoHeader(hMask, &vHeader); - vInfo.cBitCount = 24; - if ((lScans = ::GpiQueryBitmapBits( hPS - ,0L - ,(LONG)rBmp.GetHeight() - ,(PBYTE)pucBitsMask - ,&vInfo - )) == GPI_ALTERROR) - { - vError = ::WinGetLastError(vHabmain); - sError = wxPMErrorToStr(vError); - } - if (( hMask = ::GpiSetBitmap(hPS, hOldMask)) == HBM_ERROR) - { - vError = ::WinGetLastError(vHabmain); - sError = wxPMErrorToStr(vError); - } - pucData = pucBits; - pucDataMask = pucBitsMask; - - // - // Get the mask value - // - for (i = 0; i < rBmp.GetHeight(); i++) - { - for (j = 0; j < rBmp.GetWidth(); j++) - { - // Byte 1 - if (bpp16 && *pucDataMask == 0xF8) // 16 bit display gobblygook - { - *pucData = 0x7F; - pucData++; - } - else if (*pucDataMask == 0xFF) // set to grey - { - *pucData = 0x7F; - pucData++; - } - else - { - *pucData = ((unsigned char)(lColor >> 16)); - pucData++; - } - - // Byte 2 - if (bpp16 && *(pucDataMask + 1) == 0xFC) // 16 bit display gobblygook - { - *pucData = 0x7F; - pucData++; - } - else if (*(pucDataMask + 1) == 0xFF) // set to grey - { - *pucData = 0x7F; - pucData++; - } - else - { - *pucData = ((unsigned char)(lColor >> 8)); - pucData++; - } - - // Byte 3 - if (bpp16 && *(pucDataMask + 2) == 0xF8) // 16 bit display gobblygook - { - *pucData = 0x7F; - pucData++; - } - else if (*(pucDataMask + 2) == 0xFF) // set to grey - { - *pucData = 0x7F; - pucData++; - } - else - { - *pucData = ((unsigned char)lColor); - pucData++; - } - pucDataMask += 3; - } - for (j = 0; j < nPadding; j++) - { - pucData++; - pucDataMask++; - } - } - - // - // Create a new bitmap and set the modified bits - // - wxBitmap vNewBmp( rBmp.GetWidth() - ,rBmp.GetHeight() - ,24 - ); - HBITMAP hNewBmp = (HBITMAP)vNewBmp.GetHBITMAP(); - - if ((hOldBitmap = ::GpiSetBitmap(hPS, hNewBmp)) == HBM_ERROR) - { - vError = ::WinGetLastError(vHabmain); - sError = wxPMErrorToStr(vError); - } - if ((lScansSet = ::GpiSetBitmapBits( hPS - ,0L - ,(LONG)rBmp.GetHeight() - ,(PBYTE)pucBits - ,&vInfo - )) == GPI_ALTERROR) - - { - vError = ::WinGetLastError(vHabmain); - sError = wxPMErrorToStr(vError); - } - wxMask* pNewMask; - - pNewMask = new wxMask(pMask->GetMaskBitmap()); - vNewBmp.SetMask(pNewMask); - free(pucBits); - ::GpiSetBitmap(hPS, NULLHANDLE); - ::GpiDestroyPS(hPS); - ::DevCloseDC(hDC); - if (vNewBmp.Ok()) - return(vNewBmp); - return(wxNullBitmap); -} // end of wxDisableBitmap - // ---------------------------------------------------------------------------- // private classes // ---------------------------------------------------------------------------- diff --git a/src/os2/utils.cpp b/src/os2/utils.cpp index 6710cdf97c..4ff213b9de 100644 --- a/src/os2/utils.cpp +++ b/src/os2/utils.cpp @@ -1303,3 +1303,221 @@ void wxOS2SetFont( } ::WinSetPresParam(hWnd, PP_FONTNAMESIZE, strlen(zFont) + 1, (PVOID)zFont); } // end of wxOS2SetFont + +// --------------------------------------------------------------------------- +// Helper for taking a regular bitmap and giving it a disabled look +// --------------------------------------------------------------------------- +wxBitmap wxDisableBitmap( + const wxBitmap& rBmp +, long lColor +) +{ + wxMask* pMask = rBmp.GetMask(); + + if (!pMask) + return(wxNullBitmap); + + DEVOPENSTRUC vDop = {0L, "DISPLAY", NULL, 0L, 0L, 0L, 0L, 0L, 0L}; + SIZEL vSize = {0, 0}; + HDC hDC = ::DevOpenDC(vHabmain, OD_MEMORY, "*", 5L, (PDEVOPENDATA)&vDop, NULLHANDLE); + HPS hPS = ::GpiCreatePS(vHabmain, hDC, &vSize, PU_PELS | GPIA_ASSOC); + BITMAPINFOHEADER2 vHeader; + BITMAPINFO2 vInfo; + ERRORID vError; + wxString sError; + HBITMAP hBitmap = (HBITMAP)rBmp.GetHBITMAP(); + HBITMAP hOldBitmap = NULLHANDLE; + HBITMAP hOldMask = NULLHANDLE; + HBITMAP hMask = (HBITMAP)rBmp.GetMask()->GetMaskBitmap(); + unsigned char* pucBits; // buffer that will contain the bitmap data + unsigned char* pucData; // pointer to use to traverse bitmap data + unsigned char* pucBitsMask; // buffer that will contain the mask data + unsigned char* pucDataMask; // pointer to use to traverse mask data + LONG lScans = 0L; + LONG lScansSet = 0L; + bool bpp16 = (wxDisplayDepth() == 16); + + memset(&vHeader, '\0', 16); + vHeader.cbFix = 16; + + memset(&vInfo, '\0', 16); + vInfo.cbFix = 16; + vInfo.cx = (ULONG)rBmp.GetWidth(); + vInfo.cy = (ULONG)rBmp.GetHeight(); + vInfo.cPlanes = 1; + vInfo.cBitCount = 24; // Set to desired count going in + + // + // Create the buffers for data....all wxBitmaps are 24 bit internally + // + int nBytesPerLine = rBmp.GetWidth() * 3; + int nSizeDWORD = sizeof(DWORD); + int nLineBoundary = nBytesPerLine % nSizeDWORD; + int nPadding = 0; + int i; + int j; + + // + // Bitmap must be ina double-word alligned address so we may + // have some padding to worry about + // + if (nLineBoundary > 0) + { + nPadding = nSizeDWORD - nLineBoundary; + nBytesPerLine += nPadding; + } + pucBits = (unsigned char *)malloc(nBytesPerLine * rBmp.GetHeight()); + memset(pucBits, '\0', (nBytesPerLine * rBmp.GetHeight())); + pucBitsMask = (unsigned char *)malloc(nBytesPerLine * rBmp.GetHeight()); + memset(pucBitsMask, '\0', (nBytesPerLine * rBmp.GetHeight())); + + // + // Extract the bitmap and mask data + // + if ((hOldBitmap = ::GpiSetBitmap(hPS, hBitmap)) == HBM_ERROR) + { + vError = ::WinGetLastError(vHabmain); + sError = wxPMErrorToStr(vError); + } + ::GpiQueryBitmapInfoHeader(hBitmap, &vHeader); + vInfo.cBitCount = 24; + if ((lScans = ::GpiQueryBitmapBits( hPS + ,0L + ,(LONG)rBmp.GetHeight() + ,(PBYTE)pucBits + ,&vInfo + )) == GPI_ALTERROR) + { + vError = ::WinGetLastError(vHabmain); + sError = wxPMErrorToStr(vError); + } + if ((hOldMask = ::GpiSetBitmap(hPS, hMask)) == HBM_ERROR) + { + vError = ::WinGetLastError(vHabmain); + sError = wxPMErrorToStr(vError); + } + ::GpiQueryBitmapInfoHeader(hMask, &vHeader); + vInfo.cBitCount = 24; + if ((lScans = ::GpiQueryBitmapBits( hPS + ,0L + ,(LONG)rBmp.GetHeight() + ,(PBYTE)pucBitsMask + ,&vInfo + )) == GPI_ALTERROR) + { + vError = ::WinGetLastError(vHabmain); + sError = wxPMErrorToStr(vError); + } + if (( hMask = ::GpiSetBitmap(hPS, hOldMask)) == HBM_ERROR) + { + vError = ::WinGetLastError(vHabmain); + sError = wxPMErrorToStr(vError); + } + pucData = pucBits; + pucDataMask = pucBitsMask; + + // + // Get the mask value + // + for (i = 0; i < rBmp.GetHeight(); i++) + { + for (j = 0; j < rBmp.GetWidth(); j++) + { + // Byte 1 + if (bpp16 && *pucDataMask == 0xF8) // 16 bit display gobblygook + { + *pucData = 0x7F; + pucData++; + } + else if (*pucDataMask == 0xFF) // set to grey + { + *pucData = 0x7F; + pucData++; + } + else + { + *pucData = ((unsigned char)(lColor >> 16)); + pucData++; + } + + // Byte 2 + if (bpp16 && *(pucDataMask + 1) == 0xFC) // 16 bit display gobblygook + { + *pucData = 0x7F; + pucData++; + } + else if (*(pucDataMask + 1) == 0xFF) // set to grey + { + *pucData = 0x7F; + pucData++; + } + else + { + *pucData = ((unsigned char)(lColor >> 8)); + pucData++; + } + + // Byte 3 + if (bpp16 && *(pucDataMask + 2) == 0xF8) // 16 bit display gobblygook + { + *pucData = 0x7F; + pucData++; + } + else if (*(pucDataMask + 2) == 0xFF) // set to grey + { + *pucData = 0x7F; + pucData++; + } + else + { + *pucData = ((unsigned char)lColor); + pucData++; + } + pucDataMask += 3; + } + for (j = 0; j < nPadding; j++) + { + pucData++; + pucDataMask++; + } + } + + // + // Create a new bitmap and set the modified bits + // + wxBitmap vNewBmp( rBmp.GetWidth() + ,rBmp.GetHeight() + ,24 + ); + HBITMAP hNewBmp = (HBITMAP)vNewBmp.GetHBITMAP(); + + if ((hOldBitmap = ::GpiSetBitmap(hPS, hNewBmp)) == HBM_ERROR) + { + vError = ::WinGetLastError(vHabmain); + sError = wxPMErrorToStr(vError); + } + if ((lScansSet = ::GpiSetBitmapBits( hPS + ,0L + ,(LONG)rBmp.GetHeight() + ,(PBYTE)pucBits + ,&vInfo + )) == GPI_ALTERROR) + + { + vError = ::WinGetLastError(vHabmain); + sError = wxPMErrorToStr(vError); + } + wxMask* pNewMask; + + pNewMask = new wxMask(pMask->GetMaskBitmap()); + vNewBmp.SetMask(pNewMask); + free(pucBits); + ::GpiSetBitmap(hPS, NULLHANDLE); + ::GpiDestroyPS(hPS); + ::DevCloseDC(hDC); + if (vNewBmp.Ok()) + return(vNewBmp); + return(wxNullBitmap); +} // end of wxDisableBitmap + + diff --git a/src/os2/wx23.def b/src/os2/wx23.def index 67a5e1ad80..5305ce8e68 100644 --- a/src/os2/wx23.def +++ b/src/os2/wx23.def @@ -4,7 +4,7 @@ DATA MULTIPLE NONSHARED READWRITE LOADONCALL CODE LOADONCALL EXPORTS -;From library: H:\DEV\WX2\WXWINDOWS\LIB\wx.lib +;From library: F:\DEV\WX2\WXWINDOWS\LIB\WX.lib ;From object file: dummy.cpp ;PUBDEFs (Symbols available from object file): wxDummyChar @@ -1963,7 +1963,7 @@ EXPORTS wxEVT_NC_LEFT_DCLICK wxEVT_INIT_DIALOG wxEVT_COMMAND_SET_FOCUS - ;From object file: H:\DEV\WX2\WXWINDOWS\src\common\extended.c + ;From object file: F:\DEV\WX2\WXWINDOWS\src\common\extended.c ;PUBDEFs (Symbols available from object file): ConvertToIeeeExtended ConvertFromIeeeExtended @@ -6246,7 +6246,7 @@ EXPORTS Read32__17wxTextInputStreamFv ;wxTextInputStream::SkipIfEndOfLine(char) SkipIfEndOfLine__17wxTextInputStreamFc - ;From object file: H:\DEV\WX2\WXWINDOWS\src\common\unzip.c + ;From object file: F:\DEV\WX2\WXWINDOWS\src\common\unzip.c ;PUBDEFs (Symbols available from object file): unzReadCurrentFile unzGetCurrentFileInfo @@ -11735,23 +11735,23 @@ EXPORTS SetMask__8wxBitmapFP6wxMask ;From object file: ..\os2\bmpbuttn.cpp ;PUBDEFs (Symbols available from object file): - ;wxBitmapButton::DrawFace(unsigned long,int,int,int,int,unsigned long) - DrawFace__14wxBitmapButtonFUliN32T1 - ;wxBitmapButton::SetBitmapLabel(const wxBitmap&) - SetBitmapLabel__14wxBitmapButtonFRC8wxBitmap + ;wxBitmapButton::OS2OnDraw(void**) + OS2OnDraw__14wxBitmapButtonFPPv + ;wxBitmapButton::DrawButtonFocus(wxClientDC&) + DrawButtonFocus__14wxBitmapButtonFR10wxClientDC + ;wxBitmapButton::DrawFace(wxClientDC&,unsigned long) + DrawFace__14wxBitmapButtonFR10wxClientDCUl __vft14wxBitmapButton8wxObject - ;wxBitmapButton::DrawButtonDisable(unsigned long,int,int,int,int,unsigned long) - DrawButtonDisable__14wxBitmapButtonFUliN32T1 ;wxConstructorForwxBitmapButton() wxConstructorForwxBitmapButton__Fv ;wxBitmapButton::SetDefault() SetDefault__14wxBitmapButtonFv ;wxBitmapButton::Create(wxWindow*,int,const wxBitmap&,const wxPoint&,const wxSize&,long,const wxValidator&,const wxString&) Create__14wxBitmapButtonFP8wxWindowiRC8wxBitmapRC7wxPointRC6wxSizelRC11wxValidatorRC8wxString + ;wxBitmapButton::DrawButtonDisable(wxClientDC&,wxBitmap&) + DrawButtonDisable__14wxBitmapButtonFR10wxClientDCR8wxBitmap ;wxBitmapButton::sm_classwxBitmapButton sm_classwxBitmapButton__14wxBitmapButton - ;wxBitmapButton::DrawButtonFocus(unsigned long,int,int,int,int,unsigned long) - DrawButtonFocus__14wxBitmapButtonFUliN32T1 ;From object file: ..\os2\brush.cpp ;PUBDEFs (Symbols available from object file): ;wxBrush::FreeResource(unsigned long) @@ -14773,8 +14773,6 @@ EXPORTS GetEventTable__9wxToolBarCFv ;wxToolBar::CreateTool(int,const wxString&,const wxBitmap&,const wxBitmap&,wxItemKind,wxObject*,const wxString&,const wxString&) CreateTool__9wxToolBarFiRC8wxStringRC8wxBitmapT310wxItemKindP8wxObjectN22 - ;wxDisableBitmap(const wxBitmap&,long) - wxDisableBitmap__FRC8wxBitmapl ;wxConstructorForwxToolBar() wxConstructorForwxToolBar__Fv ;wxToolBar::m_bInitialized @@ -14925,6 +14923,8 @@ EXPORTS wxShell__FRC8wxString ;wxGetUserHome(const wxString&) wxGetUserHome__FRC8wxString + ;wxDisableBitmap(const wxBitmap&,long) + wxDisableBitmap__FRC8wxBitmapl ;wxWriteResource(const wxString&,const wxString&,const wxString&,const wxString&) wxWriteResource__FRC8wxStringN31 ;wxWriteResource(const wxString&,const wxString&,long,const wxString&)