wxBitmapButton transparency fixed by using wxDC API at all times
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@6373 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -23,6 +23,7 @@
|
|||||||
#ifndef WX_PRECOMP
|
#ifndef WX_PRECOMP
|
||||||
#include "wx/bmpbuttn.h"
|
#include "wx/bmpbuttn.h"
|
||||||
#include "wx/log.h"
|
#include "wx/log.h"
|
||||||
|
#include "wx/dcmemory.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "wx/msw/private.h"
|
#include "wx/msw/private.h"
|
||||||
@@ -115,12 +116,15 @@ bool wxBitmapButton::MSWOnDraw(WXDRAWITEMSTRUCT *item)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
LPDRAWITEMSTRUCT lpDIS = (LPDRAWITEMSTRUCT) item;
|
LPDRAWITEMSTRUCT lpDIS = (LPDRAWITEMSTRUCT) item;
|
||||||
|
HDC hDC = lpDIS->hDC;
|
||||||
|
UINT state = lpDIS->itemState;
|
||||||
|
bool isSelected = (state & ODS_SELECTED) != 0;
|
||||||
|
bool autoDraw = (GetWindowStyleFlag() & wxBU_AUTODRAW) != 0;
|
||||||
|
|
||||||
// choose the bitmap to use depending on the buttons state
|
|
||||||
|
// choose the bitmap to use depending on the button state
|
||||||
wxBitmap* bitmap;
|
wxBitmap* bitmap;
|
||||||
|
|
||||||
UINT state = lpDIS->itemState;
|
|
||||||
bool isSelected = (state & ODS_SELECTED) != 0;
|
|
||||||
if ( isSelected && m_buttonBitmapSelected.Ok() )
|
if ( isSelected && m_buttonBitmapSelected.Ok() )
|
||||||
bitmap = &m_buttonBitmapSelected;
|
bitmap = &m_buttonBitmapSelected;
|
||||||
else if ((state & ODS_FOCUS) && m_buttonBitmapFocus.Ok())
|
else if ((state & ODS_FOCUS) && m_buttonBitmapFocus.Ok())
|
||||||
@@ -133,29 +137,23 @@ bool wxBitmapButton::MSWOnDraw(WXDRAWITEMSTRUCT *item)
|
|||||||
if ( !bitmap->Ok() )
|
if ( !bitmap->Ok() )
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
// draw it on the memory DC
|
// centre the bitmap in the control area
|
||||||
HDC hDC = lpDIS->hDC;
|
int x = lpDIS->rcItem.left;
|
||||||
HDC memDC = ::CreateCompatibleDC(hDC);
|
int y = lpDIS->rcItem.top;
|
||||||
|
int width = lpDIS->rcItem.right - x;
|
||||||
|
int height = lpDIS->rcItem.bottom - y;
|
||||||
|
int wBmp = bitmap->GetWidth();
|
||||||
|
int hBmp = bitmap->GetHeight();
|
||||||
|
int x1 = x + (width - wBmp) / 2;
|
||||||
|
int y1 = y + (height - hBmp) / 2;
|
||||||
|
|
||||||
HBITMAP old = (HBITMAP) ::SelectObject(memDC, (HBITMAP) bitmap->GetHBITMAP());
|
if ( isSelected && autoDraw )
|
||||||
|
|
||||||
if (!old)
|
|
||||||
{
|
{
|
||||||
wxLogLastError(_T("SelectObject"));
|
x1++;
|
||||||
|
y1++;
|
||||||
return FALSE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int x = lpDIS->rcItem.left;
|
// draw the face, if auto-drawing
|
||||||
int y = lpDIS->rcItem.top;
|
|
||||||
int width = lpDIS->rcItem.right - x;
|
|
||||||
int height = lpDIS->rcItem.bottom - y;
|
|
||||||
|
|
||||||
int wBmp = bitmap->GetWidth(),
|
|
||||||
hBmp = bitmap->GetHeight();
|
|
||||||
|
|
||||||
// Draw the face, if auto-drawing
|
|
||||||
bool autoDraw = (GetWindowStyleFlag() & wxBU_AUTODRAW) != 0;
|
|
||||||
if ( autoDraw )
|
if ( autoDraw )
|
||||||
{
|
{
|
||||||
DrawFace((WXHDC) hDC,
|
DrawFace((WXHDC) hDC,
|
||||||
@@ -164,62 +162,12 @@ bool wxBitmapButton::MSWOnDraw(WXDRAWITEMSTRUCT *item)
|
|||||||
isSelected);
|
isSelected);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Centre the bitmap in the control area
|
// draw the bitmap
|
||||||
int x1 = x + (width - wBmp) / 2;
|
wxDC dst;
|
||||||
int y1 = y + (height - hBmp) / 2;
|
dst.SetHDC((WXHDC) hDC, FALSE);
|
||||||
|
dst.DrawBitmap(*bitmap, x1, y1, TRUE);
|
||||||
if ( isSelected && autoDraw )
|
|
||||||
{
|
|
||||||
x1++;
|
|
||||||
y1++;
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOL ok;
|
|
||||||
|
|
||||||
// no MaskBlt() under Win16
|
|
||||||
#ifdef __WIN32__
|
|
||||||
wxMask *mask = bitmap->GetMask();
|
|
||||||
if ( mask )
|
|
||||||
{
|
|
||||||
// the fg ROP is applied for the pixels of the mask bitmap which are 1
|
|
||||||
// (for a wxMask this means that this is a non transparent pixel), the
|
|
||||||
// bg ROP is applied for all the others
|
|
||||||
|
|
||||||
HBRUSH hbrBackground =
|
|
||||||
::CreateSolidBrush(wxColourToRGB(GetBackgroundColour()));
|
|
||||||
HBRUSH hbrOld = (HBRUSH)::SelectObject(hDC, hbrBackground);
|
|
||||||
|
|
||||||
ok = ::MaskBlt(
|
|
||||||
hDC, x1, y1, wBmp, hBmp, // dst
|
|
||||||
memDC, 0, 0, // src
|
|
||||||
(HBITMAP)mask->GetMaskBitmap(), 0, 0, // mask
|
|
||||||
MAKEROP4(SRCCOPY, // fg ROP
|
|
||||||
PATCOPY) // bg ROP
|
|
||||||
);
|
|
||||||
|
|
||||||
::SelectObject(hDC, hbrOld);
|
|
||||||
::DeleteObject(hbrBackground);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// this will make the check below fail and BitBlt() will be used if
|
|
||||||
// MaskBlt() is not supported (for example, under Win95)
|
|
||||||
ok = FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( !ok )
|
|
||||||
#endif // Win32
|
|
||||||
{
|
|
||||||
ok = ::BitBlt(hDC, x1, y1, wBmp, hBmp, // dst
|
|
||||||
memDC, 0, 0, // src
|
|
||||||
SRCCOPY); // ROP
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( !ok )
|
|
||||||
{
|
|
||||||
wxLogLastError(_T("Mask/BitBlt()"));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
// draw focus / disabled state, if auto-drawing
|
||||||
if ( (state & ODS_DISABLED) && autoDraw )
|
if ( (state & ODS_DISABLED) && autoDraw )
|
||||||
{
|
{
|
||||||
DrawButtonDisable((WXHDC) hDC,
|
DrawButtonDisable((WXHDC) hDC,
|
||||||
@@ -237,10 +185,6 @@ bool wxBitmapButton::MSWOnDraw(WXDRAWITEMSTRUCT *item)
|
|||||||
isSelected);
|
isSelected);
|
||||||
}
|
}
|
||||||
|
|
||||||
::SelectObject(memDC, old);
|
|
||||||
|
|
||||||
::DeleteDC(memDC);
|
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user