From 18f2ae4965ed00722b7605ef186942ab89eec979 Mon Sep 17 00:00:00 2001 From: Kevin Ollivier Date: Mon, 20 Aug 2007 23:26:35 +0000 Subject: [PATCH] Fix for wxMemoryDC::GetAsBitmap() not working on Windows. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@48235 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/msw/bitmap.h | 4 ++++ include/wx/msw/dcmemory.h | 3 +++ src/msw/bitmap.cpp | 19 ++++++++++++------- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/include/wx/msw/bitmap.h b/include/wx/msw/bitmap.h index e0740f8832..8c239785af 100644 --- a/include/wx/msw/bitmap.h +++ b/include/wx/msw/bitmap.h @@ -118,6 +118,10 @@ public: // get the given part of bitmap wxBitmap GetSubBitmap( const wxRect& rect ) const; + // NB: This should not be called from user code. It is for wx internal + // use only. + wxBitmap GetSubBitmapOfHDC( const wxRect& rect, WXHDC hdc ) const; + // copies the contents and mask of the given (colour) icon to the bitmap bool CopyFromIcon(const wxIcon& icon, wxBitmapTransparency transp = wxBitmapTransparency_Auto); diff --git a/include/wx/msw/dcmemory.h b/include/wx/msw/dcmemory.h index 20f2005856..fd2c032c7d 100644 --- a/include/wx/msw/dcmemory.h +++ b/include/wx/msw/dcmemory.h @@ -28,6 +28,9 @@ protected: virtual void DoGetSize(int* width, int* height) const; virtual void DoSelect(const wxBitmap& bitmap); + virtual wxBitmap DoGetAsBitmap(const wxRect* subrect) const + { return subrect == NULL ? GetSelectedBitmap() : GetSelectedBitmap().GetSubBitmapOfHDC(*subrect, GetHDC() );} + // create DC compatible with the given one or screen if dc == NULL bool CreateCompatible(wxDC *dc); diff --git a/src/msw/bitmap.cpp b/src/msw/bitmap.cpp index 875fe9ff6a..f3221c6e73 100644 --- a/src/msw/bitmap.cpp +++ b/src/msw/bitmap.cpp @@ -1089,8 +1089,14 @@ bool wxBitmap::SaveFile(const wxString& filename, // ---------------------------------------------------------------------------- // sub bitmap extraction // ---------------------------------------------------------------------------- +wxBitmap wxBitmap::GetSubBitmap( const wxRect& rect ) const +{ + MemoryHDC dcSrc; + SelectInHDC selectSrc(dcSrc, GetHbitmap()); + return GetSubBitmapOfHDC( rect, (WXHDC)dcSrc ); +} -wxBitmap wxBitmap::GetSubBitmap( const wxRect& rect) const +wxBitmap wxBitmap::GetSubBitmapOfHDC( const wxRect& rect, WXHDC hdc ) const { wxCHECK_MSG( Ok() && (rect.x >= 0) && (rect.y >= 0) && @@ -1111,16 +1117,15 @@ wxBitmap wxBitmap::GetSubBitmap( const wxRect& rect) const dcDst; { - SelectInHDC selectSrc(dcSrc, GetHbitmap()), - selectDst(dcDst, GetHbitmapOf(ret)); - - if ( !selectSrc || !selectDst ) + SelectInHDC selectDst(dcDst, GetHbitmapOf(ret)); + + if ( !selectDst ) { - wxLogLastError(_T("SelectObjct(hBitmap)")); + wxLogLastError(_T("SelectObject(destBitmap)")); } if ( !::BitBlt(dcDst, 0, 0, rect.width, rect.height, - dcSrc, rect.x, rect.y, SRCCOPY) ) + (HDC)hdc, rect.x, rect.y, SRCCOPY) ) { wxLogLastError(_T("BitBlt")); }