]>
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 ::DestroyIcon((HICON
) m_hIcon
);
72 // ----------------------------------------------------------------------------
74 // ----------------------------------------------------------------------------
76 wxIcon::wxIcon(const char bits
[], int width
, int height
)
78 wxBitmap
bmp(bits
, width
, height
);
82 wxIcon::wxIcon(const wxString
& iconfile
,
88 LoadFile(iconfile
, flags
, desiredWidth
, desiredHeight
);
95 void wxIcon::CopyFromBitmap(const wxBitmap
& bmp
)
98 wxMask
*mask
= bmp
.GetMask();
101 // we must have a mask for an icon, so even if it's probably incorrect,
102 // do create it (grey is the "standard" transparent colour)
103 mask
= new wxMask(bmp
, *wxLIGHT_GREY
);
107 iconInfo
.fIcon
= TRUE
; // we want an icon, not a cursor
108 iconInfo
.hbmMask
= wxInvertMask((HBITMAP
)mask
->GetMaskBitmap());
109 iconInfo
.hbmColor
= GetHbitmapOf(bmp
);
111 /* GRG: black out the transparent area to preserve background
112 * colour, because Windows blits the original bitmap using
113 * SRCINVERT (XOR) after applying the mask to the dest rect.
115 HDC dcSrc
= ::CreateCompatibleDC(NULL
);
116 HDC dcDst
= ::CreateCompatibleDC(NULL
);
117 SelectObject(dcSrc
, (HBITMAP
)mask
->GetMaskBitmap());
118 SelectObject(dcDst
, iconInfo
.hbmColor
);
120 BitBlt(dcDst
, 0, 0, bmp
.GetWidth(), bmp
.GetHeight(), dcSrc
, 0, 0, SRCAND
);
122 SelectObject(dcDst
, NULL
);
123 SelectObject(dcSrc
, NULL
);
127 HICON hicon
= ::CreateIconIndirect(&iconInfo
);
130 wxLogLastError(wxT("CreateIconIndirect"));
134 SetHICON((WXHICON
)hicon
);
135 SetSize(bmp
.GetWidth(), bmp
.GetHeight());
138 if ( !bmp
.GetMask() )
140 // we created the mask, now delete it
144 // there are some functions in curico.cpp which probably could be used
146 // This probably doesn't work.
147 HBITMAP hBitmap
= (HBITMAP
) bmp
.GetHBITMAP();
148 HICON hIcon
= MakeIconFromBitmap((HINSTANCE
) wxGetInstance(), hBitmap
);
151 SetHICON((WXHICON
)hIcon
);
152 SetSize(bmp
.GetWidth(), bmp
.GetHeight());
155 // wxFAIL_MSG("Bitmap to icon conversion (including use of XPMs for icons) not implemented");
159 void wxIcon::CreateIconFromXpm(const char **data
)
165 bool wxIcon::LoadFile(const wxString
& filename
,
167 int desiredWidth
, int desiredHeight
)
171 wxGDIImageHandler
*handler
= FindHandler(type
);
179 return handler
->Load(this, filename
, type
, desiredWidth
, desiredHeight
);