1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: wxCursor class
4 // Author: Julian Smart
8 // Copyright: (c) Julian Smart and Markus Holzem
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
12 // ============================================================================
14 // ============================================================================
16 // ----------------------------------------------------------------------------
18 // ----------------------------------------------------------------------------
21 #pragma implementation "cursor.h"
24 // For compilers that support precompilation, includes "wx.h".
25 #include "wx/wxprec.h"
35 #include "wx/bitmap.h"
37 #include "wx/cursor.h"
40 #include "wx/module.h"
41 #include "wx/msw/private.h"
42 #include "wx/msw/dib.h"
44 #if wxUSE_RESOURCE_LOADING_IN_MSW
45 #include "wx/msw/curico.h"
46 #include "wx/msw/curicop.h"
49 // ----------------------------------------------------------------------------
51 // ----------------------------------------------------------------------------
53 IMPLEMENT_DYNAMIC_CLASS(wxCursor
, wxCursorBase
)
55 // ----------------------------------------------------------------------------
57 // ----------------------------------------------------------------------------
59 // Current cursor, in order to hang on to cursor handle when setting the cursor
61 static wxCursor
*gs_globalCursor
= NULL
;
63 // ----------------------------------------------------------------------------
65 // ----------------------------------------------------------------------------
67 class wxCursorModule
: public wxModule
72 gs_globalCursor
= new wxCursor
;
79 delete gs_globalCursor
;
80 gs_globalCursor
= (wxCursor
*)NULL
;
84 // ============================================================================
86 // ============================================================================
88 // ----------------------------------------------------------------------------
90 // ----------------------------------------------------------------------------
92 wxCursorRefData::wxCursorRefData()
97 m_destroyCursor
= FALSE
;
100 void wxCursorRefData::Free()
104 if ( m_destroyCursor
)
105 ::DestroyCursor((HCURSOR
)m_hCursor
);
111 // ----------------------------------------------------------------------------
113 // ----------------------------------------------------------------------------
119 wxCursor::wxCursor(const char WXUNUSED(bits
)[],
121 int WXUNUSED(height
),
122 int WXUNUSED(hotSpotX
), int WXUNUSED(hotSpotY
),
123 const char WXUNUSED(maskBits
)[])
127 wxCursor::wxCursor(const wxString
& cursor_file
,
129 int hotSpotX
, int hotSpotY
)
131 wxCursorRefData
*refData
= new wxCursorRefData
;
134 refData
->m_destroyCursor
= FALSE
;
136 if (flags
== wxBITMAP_TYPE_CUR_RESOURCE
)
139 refData
->m_hCursor
= (WXHCURSOR
) LoadImage(wxGetInstance(), cursor_file
, IMAGE_CURSOR
, 0, 0, 0);
141 refData
->m_hCursor
= (WXHCURSOR
) LoadCursor(wxGetInstance(), cursor_file
);
144 else if (flags
== wxBITMAP_TYPE_CUR
)
147 refData
->m_hCursor
= (WXHCURSOR
) LoadImage(wxGetInstance(), cursor_file
, IMAGE_CURSOR
, 0, 0, LR_LOADFROMFILE
);
149 #if wxUSE_RESOURCE_LOADING_IN_MSW
150 refData
->m_hCursor
= (WXHCURSOR
) ReadCursorFile(WXSTRINGCAST cursor_file
, wxGetInstance(), &refData
->m_width
, &refData
->m_height
);
151 refData
->m_destroyCursor
= TRUE
;
155 else if (flags
== wxBITMAP_TYPE_ICO
)
157 #if wxUSE_RESOURCE_LOADING_IN_MSW
158 refData
->m_hCursor
= (WXHCURSOR
) IconToCursor(WXSTRINGCAST cursor_file
, wxGetInstance(), hotSpotX
, hotSpotY
, &refData
->m_width
, &refData
->m_height
);
159 refData
->m_destroyCursor
= TRUE
;
162 else if (flags
== wxBITMAP_TYPE_BMP
)
164 #if wxUSE_RESOURCE_LOADING_IN_MSW
166 HPALETTE hPalette
= 0;
167 bool success
= wxReadDIB(WXSTRINGCAST cursor_file
, &hBitmap
, &hPalette
) != 0;
171 DeleteObject(hPalette
);
175 refData
->m_hCursor
= (WXHCURSOR
) MakeCursorFromBitmap(wxGetInstance(), hBitmap
, &pnt
);
176 refData
->m_destroyCursor
= TRUE
;
177 DeleteObject(hBitmap
);
181 #if WXWIN_COMPATIBILITY_2
183 #endif // WXWIN_COMPATIBILITY_2
186 // Cursors by stock number
187 wxCursor::wxCursor(int cursor_type
)
189 wxCursorRefData
*refData
= new wxCursorRefData
;
195 refData
->m_hCursor
= (WXHCURSOR
) LoadCursor((HINSTANCE
) NULL
, IDC_WAIT
);
198 refData
->m_hCursor
= (WXHCURSOR
) LoadCursor((HINSTANCE
) NULL
, IDC_IBEAM
);
201 refData
->m_hCursor
= (WXHCURSOR
) LoadCursor((HINSTANCE
) NULL
, IDC_CROSS
);
203 case wxCURSOR_SIZENWSE
:
204 refData
->m_hCursor
= (WXHCURSOR
) LoadCursor((HINSTANCE
) NULL
, IDC_SIZENWSE
);
206 case wxCURSOR_SIZENESW
:
207 refData
->m_hCursor
= (WXHCURSOR
) LoadCursor((HINSTANCE
) NULL
, IDC_SIZENESW
);
209 case wxCURSOR_SIZEWE
:
210 refData
->m_hCursor
= (WXHCURSOR
) LoadCursor((HINSTANCE
) NULL
, IDC_SIZEWE
);
212 case wxCURSOR_SIZENS
:
213 refData
->m_hCursor
= (WXHCURSOR
) LoadCursor((HINSTANCE
) NULL
, IDC_SIZENS
);
217 refData
->m_hCursor
= (WXHCURSOR
) LoadCursor((HINSTANCE
) NULL
, IDC_ARROW
);
222 refData
->m_hCursor
= (WXHCURSOR
) LoadCursor(wxGetInstance(), wxT("wxCURSOR_HAND"));
225 case wxCURSOR_BULLSEYE
:
227 refData
->m_hCursor
= (WXHCURSOR
) LoadCursor(wxGetInstance(), wxT("wxCURSOR_BULLSEYE"));
230 case wxCURSOR_PENCIL
:
232 refData
->m_hCursor
= (WXHCURSOR
) LoadCursor(wxGetInstance(), wxT("wxCURSOR_PENCIL"));
235 case wxCURSOR_MAGNIFIER
:
237 refData
->m_hCursor
= (WXHCURSOR
) LoadCursor(wxGetInstance(), wxT("wxCURSOR_MAGNIFIER"));
240 case wxCURSOR_NO_ENTRY
:
242 refData
->m_hCursor
= (WXHCURSOR
) LoadCursor(wxGetInstance(), wxT("wxCURSOR_NO_ENTRY"));
245 case wxCURSOR_LEFT_BUTTON
:
247 refData
->m_hCursor
= (WXHCURSOR
) LoadCursor((HINSTANCE
) NULL
, IDC_ARROW
);
250 case wxCURSOR_RIGHT_BUTTON
:
252 refData
->m_hCursor
= (WXHCURSOR
) LoadCursor((HINSTANCE
) NULL
, IDC_ARROW
);
255 case wxCURSOR_MIDDLE_BUTTON
:
257 refData
->m_hCursor
= (WXHCURSOR
) LoadCursor((HINSTANCE
) NULL
, IDC_ARROW
);
260 case wxCURSOR_SIZING
:
262 refData
->m_hCursor
= (WXHCURSOR
) LoadCursor(wxGetInstance(), wxT("wxCURSOR_SIZING"));
267 refData
->m_hCursor
= (WXHCURSOR
) LoadCursor(wxGetInstance(), wxT("wxCURSOR_WATCH"));
270 case wxCURSOR_SPRAYCAN
:
272 refData
->m_hCursor
= (WXHCURSOR
) LoadCursor(wxGetInstance(), wxT("wxCURSOR_ROLLER"));
275 case wxCURSOR_PAINT_BRUSH
:
277 refData
->m_hCursor
= (WXHCURSOR
) LoadCursor(wxGetInstance(), wxT("wxCURSOR_PBRUSH"));
280 case wxCURSOR_POINT_LEFT
:
282 refData
->m_hCursor
= (WXHCURSOR
) LoadCursor(wxGetInstance(), wxT("wxCURSOR_PLEFT"));
285 case wxCURSOR_POINT_RIGHT
:
287 refData
->m_hCursor
= (WXHCURSOR
) LoadCursor(wxGetInstance(), wxT("wxCURSOR_PRIGHT"));
290 case wxCURSOR_QUESTION_ARROW
:
292 // refData->m_hCursor = (WXHCURSOR) LoadImage(wxGetInstance(), wxT("wxCURSOR_QARROW"), IMAGE_CURSOR, 16, 16, LR_MONOCHROME);
293 refData
->m_hCursor
= (WXHCURSOR
) LoadCursor(wxGetInstance(), wxT("wxCURSOR_QARROW"));
298 refData
->m_hCursor
= (WXHCURSOR
) LoadCursor(wxGetInstance(), wxT("wxCURSOR_BLANK"));
303 refData
->m_hCursor
= (WXHCURSOR
) LoadCursor((HINSTANCE
) NULL
, IDC_ARROW
);
308 wxCursor::~wxCursor()
312 // ----------------------------------------------------------------------------
313 // Global cursor setting
314 // ----------------------------------------------------------------------------
316 const wxCursor
*wxGetGlobalCursor()
318 return gs_globalCursor
;
321 void wxSetCursor(const wxCursor
& cursor
)
325 ::SetCursor(GetHcursorOf(cursor
));
327 if ( gs_globalCursor
)
328 *gs_globalCursor
= cursor
;