mask corrections

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@4935 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
1999-12-13 23:15:02 +00:00
parent fc6bbc6dad
commit d9c8e68e58
2 changed files with 124 additions and 55 deletions

View File

@@ -122,12 +122,37 @@ bool wxBitmap::CopyFromIconOrCursor(const wxGDIImage& icon)
wxBitmapRefData *refData = new wxBitmapRefData; wxBitmapRefData *refData = new wxBitmapRefData;
m_refData = refData; m_refData = refData;
refData->m_width = icon.GetWidth(); int w = icon.GetWidth(),
refData->m_height = icon.GetHeight(); h = icon.GetHeight();
refData->m_width = w;
refData->m_height = h;
refData->m_depth = wxDisplayDepth(); refData->m_depth = wxDisplayDepth();
refData->m_hBitmap = (WXHBITMAP)iconInfo.hbmColor; refData->m_hBitmap = (WXHBITMAP)iconInfo.hbmColor;
refData->m_bitmapMask = new wxMask((WXHBITMAP)iconInfo.hbmMask);
// the mask returned by GetIconInfo() is inversed compared to the usual
// wxWin convention
HBITMAP hbmpMask = ::CreateBitmap(w, h, 1, 1, 0);
// the icons mask is opposite to the usual wxWin convention
HDC dcSrc = ::CreateCompatibleDC(NULL);
HDC dcDst = ::CreateCompatibleDC(NULL);
(void)SelectObject(dcSrc, iconInfo.hbmMask);
(void)SelectObject(dcDst, hbmpMask);
HBRUSH brush = ::CreateSolidBrush(RGB(255, 255, 255));
RECT rect = { 0, 0, w, h };
FillRect(dcDst, &rect, brush);
BitBlt(dcDst, 0, 0, w, h, dcSrc, 0, 0, SRCINVERT);
SelectObject(dcDst, NULL);
SelectObject(dcSrc, NULL);
DeleteDC(dcDst);
DeleteDC(dcSrc);
refData->m_bitmapMask = new wxMask((WXHBITMAP)hbmpMask);
#if WXWIN_COMPATIBILITY_2 #if WXWIN_COMPATIBILITY_2
refData->m_ok = TRUE; refData->m_ok = TRUE;

View File

@@ -114,66 +114,107 @@ bool wxBitmapButton::MSWOnDraw(WXDRAWITEMSTRUCT *item)
LPDRAWITEMSTRUCT lpDIS = (LPDRAWITEMSTRUCT) item; LPDRAWITEMSTRUCT lpDIS = (LPDRAWITEMSTRUCT) item;
wxBitmap* bitmap = &m_buttonBitmap; // choose the bitmap to use depending on the buttons state
wxBitmap* bitmap;
UINT state = lpDIS->itemState; UINT state = lpDIS->itemState;
if ((state & ODS_SELECTED) && m_buttonBitmapSelected.Ok()) bool isSelected = (state & ODS_SELECTED) != 0;
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())
bitmap = &m_buttonBitmapFocus; bitmap = &m_buttonBitmapFocus;
else if ((state & ODS_DISABLED) && m_buttonBitmapDisabled.Ok()) else if ((state & ODS_DISABLED) && m_buttonBitmapDisabled.Ok())
bitmap = &m_buttonBitmapDisabled; bitmap = &m_buttonBitmapDisabled;
else
bitmap = &m_buttonBitmap;
if ( !bitmap->Ok() ) if ( !bitmap->Ok() )
return FALSE; return FALSE;
// draw it on the memory DC
HDC hDC = lpDIS->hDC; HDC hDC = lpDIS->hDC;
HDC memDC = ::CreateCompatibleDC(hDC); HDC memDC = ::CreateCompatibleDC(hDC);
HBITMAP old = (HBITMAP) ::SelectObject(memDC, (HBITMAP) bitmap->GetHBITMAP()); HBITMAP old = (HBITMAP) ::SelectObject(memDC, (HBITMAP) bitmap->GetHBITMAP());
if (!old) if (!old)
{
wxLogLastError(_T("SelectObject"));
return FALSE; return FALSE;
}
int x = lpDIS->rcItem.left; int x = lpDIS->rcItem.left;
int y = lpDIS->rcItem.top; int y = lpDIS->rcItem.top;
int width = lpDIS->rcItem.right - x; int width = lpDIS->rcItem.right - x;
int height = lpDIS->rcItem.bottom - y; int height = lpDIS->rcItem.bottom - y;
int wBmp = bitmap->GetWidth(),
hBmp = bitmap->GetHeight();
// Draw the face, if auto-drawing // Draw the face, if auto-drawing
if ( GetWindowStyleFlag() & wxBU_AUTODRAW ) bool autoDraw = (GetWindowStyleFlag() & wxBU_AUTODRAW) != 0;
DrawFace((WXHDC) hDC, lpDIS->rcItem.left, lpDIS->rcItem.top, lpDIS->rcItem.right, lpDIS->rcItem.bottom, if ( autoDraw )
((state & ODS_SELECTED) == ODS_SELECTED)); {
DrawFace((WXHDC) hDC,
lpDIS->rcItem.left, lpDIS->rcItem.top,
lpDIS->rcItem.right, lpDIS->rcItem.bottom,
isSelected);
}
// Centre the bitmap in the control area // Centre the bitmap in the control area
int x1 = (int) (x + ((width - bitmap->GetWidth()) / 2)); int x1 = x + (width - wBmp) / 2;
int y1 = (int) (y + ((height - bitmap->GetHeight()) / 2)); int y1 = y + (height - hBmp) / 2;
if ( (state & ODS_SELECTED) && (GetWindowStyleFlag() & wxBU_AUTODRAW) ) if ( isSelected && autoDraw )
{ {
x1++; x1++;
y1++; y1++;
} }
BOOL ok;
wxMask *mask = bitmap->GetMask(); wxMask *mask = bitmap->GetMask();
if ( mask ) if ( mask )
{ {
::MaskBlt(hDC, x1, y1, bitmap->GetWidth(), bitmap->GetHeight(), // dst // 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
ok = ::MaskBlt(
hDC, x1, y1, wBmp, hBmp, // dst
memDC, 0, 0, // src memDC, 0, 0, // src
(HBITMAP)mask->GetMaskBitmap(), 0, 0, // mask (HBITMAP)mask->GetMaskBitmap(), 0, 0, // mask
MAKEROP4(SRCPAINT, SRCCOPY)); MAKEROP4(SRCCOPY, // fg ROP
SRCPAINT) // bg ROP
);
} }
else else
{ {
::BitBlt(hDC, x1, y1, bitmap->GetWidth(), bitmap->GetHeight(), // dst ok = ::BitBlt(hDC, x1, y1, wBmp, hBmp, // dst
memDC, 0, 0, // src memDC, 0, 0, // src
SRCCOPY); SRCCOPY); // ROP
} }
if ( (state & ODS_DISABLED) && (GetWindowStyleFlag() & wxBU_AUTODRAW) ) if ( !ok )
DrawButtonDisable( (WXHDC) hDC, lpDIS->rcItem.left, lpDIS->rcItem.top, lpDIS->rcItem.right, lpDIS->rcItem.bottom, TRUE ) ; {
else if ( (state & ODS_FOCUS) && (GetWindowStyleFlag() & wxBU_AUTODRAW) ) wxLogLastError(_T("Mask/BitBlt()"));
DrawButtonFocus( (WXHDC) hDC, lpDIS->rcItem.left, lpDIS->rcItem.top, lpDIS->rcItem.right, lpDIS->rcItem.bottom, ((state & ODS_SELECTED) == ODS_SELECTED)); }
if ( (state & ODS_DISABLED) && autoDraw )
{
DrawButtonDisable((WXHDC) hDC,
lpDIS->rcItem.left, lpDIS->rcItem.top,
lpDIS->rcItem.right, lpDIS->rcItem.bottom,
TRUE);
}
else if ( (state & ODS_FOCUS) && autoDraw )
{
DrawButtonFocus((WXHDC) hDC,
lpDIS->rcItem.left,
lpDIS->rcItem.top,
lpDIS->rcItem.right,
lpDIS->rcItem.bottom,
isSelected);
}
::SelectObject(memDC, old); ::SelectObject(memDC, old);
@@ -266,20 +307,23 @@ void wxBitmapButton::DrawButtonDisable( WXHDC dc, int left, int top, int right,
{ {
HBRUSH old = (HBRUSH) SelectObject( (HDC) dc, wxDisableButtonBrush ) ; HBRUSH old = (HBRUSH) SelectObject( (HDC) dc, wxDisableButtonBrush ) ;
// VZ: what's this?? there is no such ROP AFAIK
#ifdef __SALFORDC__
DWORD dwRop = 0xFA0089L;
#else
DWORD dwRop = 0xFA0089UL;
#endif
if ( with_marg ) if ( with_marg )
::PatBlt( (HDC) dc, left + m_marginX, top + m_marginY, {
right - 2 * m_marginX, bottom - 2 * m_marginY, left += m_marginX;
#ifdef __SALFORDC__ top += m_marginY;
0xfa0089L ) ; right -= 2 * m_marginX;
#else bottom -= 2 * m_marginY;
0xfa0089UL ) ; }
#endif
else ::PatBlt( (HDC) dc, left, top, right, bottom, ::PatBlt( (HDC) dc, left, top, right, bottom, dwRop);
#ifdef __SALFORDC__
0xfa0089L ) ;
#else
0xfa0089UL ) ;
#endif
::SelectObject( (HDC) dc, old ) ; ::SelectObject( (HDC) dc, old ) ;
} }