]>
git.saurik.com Git - wxWidgets.git/blob - src/msw/icon.cpp
1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: wxIcon class
4 // Author: Julian Smart
5 // Modified by: 20.11.99 (VZ): don't derive from wxBitmap any more
8 // Copyright: (c) Julian Smart and Markus Holzem
9 // Licence: wxWindows license
10 /////////////////////////////////////////////////////////////////////////////
12 // ============================================================================
14 // ============================================================================
16 // ----------------------------------------------------------------------------
18 // ----------------------------------------------------------------------------
21 #pragma implementation "icon.h"
24 // For compilers that support precompilation, includes "wx.h".
25 #include "wx/wxprec.h"
37 #include "wx/bitmap.h"
41 #include "wx/msw/private.h"
43 #if wxUSE_RESOURCE_LOADING_IN_MSW
44 #include "wx/msw/curico.h"
45 #include "wx/msw/curicop.h"
48 // ----------------------------------------------------------------------------
50 // ----------------------------------------------------------------------------
52 IMPLEMENT_DYNAMIC_CLASS(wxIcon
, wxIconBase
)
54 // ============================================================================
56 // ============================================================================
58 // ----------------------------------------------------------------------------
60 // ----------------------------------------------------------------------------
62 void wxIconRefData::Free()
66 #ifndef __WXMICROWIN__
67 ::DestroyIcon((HICON
) m_hIcon
);
74 // ----------------------------------------------------------------------------
76 // ----------------------------------------------------------------------------
78 wxIcon::wxIcon(const char bits
[], int width
, int height
)
80 wxBitmap
bmp(bits
, width
, height
);
84 wxIcon::wxIcon(const wxString
& iconfile
,
90 LoadFile(iconfile
, flags
, desiredWidth
, desiredHeight
);
97 void wxIcon::CopyFromBitmap(const wxBitmap
& bmp
)
99 #ifndef __WXMICROWIN__
101 wxMask
*mask
= bmp
.GetMask();
104 // we must have a mask for an icon, so even if it's probably incorrect,
105 // do create it (grey is the "standard" transparent colour)
106 mask
= new wxMask(bmp
, *wxLIGHT_GREY
);
110 iconInfo
.fIcon
= TRUE
; // we want an icon, not a cursor
111 iconInfo
.hbmMask
= wxInvertMask((HBITMAP
)mask
->GetMaskBitmap());
112 iconInfo
.hbmColor
= GetHbitmapOf(bmp
);
114 /* GRG: black out the transparent area to preserve background
115 * colour, because Windows blits the original bitmap using
116 * SRCINVERT (XOR) after applying the mask to the dest rect.
118 HDC dcSrc
= ::CreateCompatibleDC(NULL
);
119 HDC dcDst
= ::CreateCompatibleDC(NULL
);
120 SelectObject(dcSrc
, (HBITMAP
)mask
->GetMaskBitmap());
121 SelectObject(dcDst
, iconInfo
.hbmColor
);
123 BitBlt(dcDst
, 0, 0, bmp
.GetWidth(), bmp
.GetHeight(), dcSrc
, 0, 0, SRCAND
);
125 SelectObject(dcDst
, NULL
);
126 SelectObject(dcSrc
, NULL
);
130 HICON hicon
= ::CreateIconIndirect(&iconInfo
);
133 wxLogLastError(wxT("CreateIconIndirect"));
137 SetHICON((WXHICON
)hicon
);
138 SetSize(bmp
.GetWidth(), bmp
.GetHeight());
141 if ( !bmp
.GetMask() )
143 // we created the mask, now delete it
147 // there are some functions in curico.cpp which probably could be used
149 // This probably doesn't work.
150 HBITMAP hBitmap
= (HBITMAP
) bmp
.GetHBITMAP();
151 HICON hIcon
= MakeIconFromBitmap((HINSTANCE
) wxGetInstance(), hBitmap
);
154 SetHICON((WXHICON
)hIcon
);
155 SetSize(bmp
.GetWidth(), bmp
.GetHeight());
158 // wxFAIL_MSG("Bitmap to icon conversion (including use of XPMs for icons) not implemented");
163 void wxIcon::CreateIconFromXpm(const char **data
)
169 bool wxIcon::LoadFile(const wxString
& filename
,
171 int desiredWidth
, int desiredHeight
)
175 wxGDIImageHandler
*handler
= FindHandler(type
);
183 return handler
->Load(this, filename
, type
, desiredWidth
, desiredHeight
);