X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c0ed460c2e7802793d591c84f3cfdbff159c5549..c92d798f9d11d15acb4af65f7fc03187ea9eee7c:/src/msw/imaglist.cpp diff --git a/src/msw/imaglist.cpp b/src/msw/imaglist.cpp index 1ad87888ba..6c80416dd8 100644 --- a/src/msw/imaglist.cpp +++ b/src/msw/imaglist.cpp @@ -26,13 +26,18 @@ #include #include "wx/setup.h" #include "wx/window.h" -#include "wx/dcclient.h" +#include "wx/icon.h" +#include "wx/dc.h" +#include "wx/string.h" #endif +#include "wx/log.h" +#include "wx/intl.h" + #include "wx/msw/imaglist.h" #include "wx/msw/private.h" -#ifndef __GNUWIN32__ +#if (defined(__WIN95__) && !defined(__GNUWIN32__)) || defined(__TWIN32__) || defined(wxUSE_NORLANDER_HEADERS) #include #endif @@ -86,7 +91,37 @@ int wxImageList::Add(const wxBitmap& bitmap, const wxBitmap& mask) HBITMAP hBitmap2 = 0; if ( mask.Ok() ) hBitmap2 = (HBITMAP) mask.GetHBITMAP(); - return ImageList_Add((HIMAGELIST) GetHIMAGELIST(), hBitmap1, hBitmap2); + else if (bitmap.GetMask()) + hBitmap2 = (HBITMAP) bitmap.GetMask()->GetMaskBitmap(); + + HBITMAP hBitmapI=0; + if(hBitmap2!=0) { + // Microsoft imagelist masks are inverted from wxWindows mask standard (white is mask color) + BITMAP bm; + ::GetObject(hBitmap2,sizeof(BITMAP),(LPVOID)&bm); + int w=bm.bmWidth; + int h=bm.bmHeight; + HDC hdc = ::CreateCompatibleDC(NULL); + HDC hdci = ::CreateCompatibleDC(NULL); + hBitmapI = ::CreateCompatibleBitmap(hdci, w, h); + ::SelectObject(hdc, hBitmap2); + ::SelectObject(hdci, hBitmapI); + ::BitBlt(hdci, 0, 0, w, h, hdc, 0, 0, NOTSRCCOPY); + ::DeleteDC(hdc); + ::DeleteDC(hdci); + } + + int index = ImageList_Add((HIMAGELIST) GetHIMAGELIST(), hBitmap1, hBitmapI); + if ( index == -1 ) + { + wxLogError(_("Couldn't add an image to the image list.")); + } + + // Clean up inverted mask + if(hBitmapI!=0) + ::DeleteObject(hBitmapI); + + return index; } // Adds a bitmap, using the specified colour to create the mask bitmap @@ -94,9 +129,14 @@ int wxImageList::Add(const wxBitmap& bitmap, const wxBitmap& mask) // 'bitmap'. int wxImageList::Add(const wxBitmap& bitmap, const wxColour& maskColour) { +#ifdef __TWIN32__ + wxFAIL_MSG("ImageList_AddMasked not implemented in TWIN32"); + return -1; +#else HBITMAP hBitmap1 = (HBITMAP) bitmap.GetHBITMAP(); COLORREF colorRef = PALETTERGB(maskColour.Red(), maskColour.Green(), maskColour.Blue()); return ImageList_AddMasked((HIMAGELIST) GetHIMAGELIST(), hBitmap1, colorRef); +#endif } // Adds a bitmap and mask from an icon. @@ -111,11 +151,16 @@ int wxImageList::Add(const wxIcon& icon) // 'bitmap' and 'mask'. bool wxImageList::Replace(int index, const wxBitmap& bitmap, const wxBitmap& mask) { +#ifdef __TWIN32__ + wxFAIL_MSG("ImageList_Replace not implemented in TWIN32"); + return FALSE; +#else HBITMAP hBitmap1 = (HBITMAP) bitmap.GetHBITMAP(); HBITMAP hBitmap2 = 0; if ( mask.Ok() ) hBitmap2 = (HBITMAP) mask.GetHBITMAP(); return (ImageList_Replace((HIMAGELIST) GetHIMAGELIST(), index, hBitmap1, hBitmap2) != 0); +#endif } /* Not supported by Win95 @@ -140,7 +185,12 @@ bool wxImageList::Replace(int index, const wxIcon& icon) // Removes the image at the given index. bool wxImageList::Remove(int index) { +#ifdef __TWIN32__ + wxFAIL_MSG("ImageList_Replace not implemented in TWIN32"); + return FALSE; +#else return (ImageList_Remove((HIMAGELIST) GetHIMAGELIST(), index) != 0); +#endif } // Remove all images @@ -161,6 +211,10 @@ bool wxImageList::RemoveAll(void) bool wxImageList::Draw(int index, wxDC& dc, int x, int y, int flags, bool solidBackground) { +#ifdef __TWIN32__ + wxFAIL_MSG("ImageList_Replace not implemented in TWIN32"); + return FALSE; +#else HDC hDC = (HDC) dc.GetHDC(); if ( !hDC ) return FALSE; @@ -194,6 +248,7 @@ bool wxImageList::Draw(int index, wxDC& dc, int x, int y, return (ImageList_Draw((HIMAGELIST) GetHIMAGELIST(), index, hDC, x, y, style) != 0); +#endif } #endif