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 #ifndef __WXMICROWIN__
43 #include "wx/msw/dib.h"
46 #if wxUSE_RESOURCE_LOADING_IN_MSW
47 #include "wx/msw/curico.h"
48 #include "wx/msw/curicop.h"
51 // ----------------------------------------------------------------------------
53 // ----------------------------------------------------------------------------
55 IMPLEMENT_DYNAMIC_CLASS(wxCursor
, wxCursorBase
)
57 // ----------------------------------------------------------------------------
59 // ----------------------------------------------------------------------------
61 // Current cursor, in order to hang on to cursor handle when setting the cursor
63 static wxCursor
*gs_globalCursor
= NULL
;
65 // ----------------------------------------------------------------------------
67 // ----------------------------------------------------------------------------
69 class wxCursorModule
: public wxModule
74 gs_globalCursor
= new wxCursor
;
81 delete gs_globalCursor
;
82 gs_globalCursor
= (wxCursor
*)NULL
;
86 // ============================================================================
88 // ============================================================================
90 // ----------------------------------------------------------------------------
92 // ----------------------------------------------------------------------------
94 wxCursorRefData::wxCursorRefData()
99 m_destroyCursor
= TRUE
;
102 void wxCursorRefData::Free()
106 #ifndef __WXMICROWIN__
107 if ( m_destroyCursor
)
108 ::DestroyCursor((HCURSOR
)m_hCursor
);
115 // ----------------------------------------------------------------------------
117 // ----------------------------------------------------------------------------
123 wxCursor::wxCursor(const char WXUNUSED(bits
)[],
125 int WXUNUSED(height
),
126 int WXUNUSED(hotSpotX
), int WXUNUSED(hotSpotY
),
127 const char WXUNUSED(maskBits
)[])
131 wxCursor::wxCursor(const wxString
& cursor_file
,
133 int hotSpotX
, int hotSpotY
)
135 #ifdef __WXMICROWIN__
138 wxCursorRefData
*refData
= new wxCursorRefData
;
141 if (flags
== wxBITMAP_TYPE_CUR_RESOURCE
)
144 refData
->m_hCursor
= (WXHCURSOR
) LoadImage(wxGetInstance(), cursor_file
, IMAGE_CURSOR
, 0, 0, 0);
146 refData
->m_hCursor
= (WXHCURSOR
) LoadCursor(wxGetInstance(), cursor_file
);
149 else if (flags
== wxBITMAP_TYPE_CUR
)
152 refData
->m_hCursor
= (WXHCURSOR
) LoadImage(wxGetInstance(), cursor_file
, IMAGE_CURSOR
, 0, 0, LR_LOADFROMFILE
);
154 #if wxUSE_RESOURCE_LOADING_IN_MSW
155 refData
->m_hCursor
= (WXHCURSOR
) ReadCursorFile(WXSTRINGCAST cursor_file
, wxGetInstance(), &refData
->m_width
, &refData
->m_height
);
159 else if (flags
== wxBITMAP_TYPE_ICO
)
161 #if wxUSE_RESOURCE_LOADING_IN_MSW
162 refData
->m_hCursor
= (WXHCURSOR
) IconToCursor(WXSTRINGCAST cursor_file
, wxGetInstance(), hotSpotX
, hotSpotY
, &refData
->m_width
, &refData
->m_height
);
165 else if (flags
== wxBITMAP_TYPE_BMP
)
167 #if wxUSE_RESOURCE_LOADING_IN_MSW
169 HPALETTE hPalette
= 0;
170 bool success
= wxReadDIB(WXSTRINGCAST cursor_file
, &hBitmap
, &hPalette
) != 0;
174 DeleteObject(hPalette
);
178 refData
->m_hCursor
= (WXHCURSOR
) MakeCursorFromBitmap(wxGetInstance(), hBitmap
, &pnt
);
179 DeleteObject(hBitmap
);
183 #if WXWIN_COMPATIBILITY_2
185 #endif // WXWIN_COMPATIBILITY_2
190 // Cursors by stock number
191 wxCursor::wxCursor(int cursor_type
)
193 #ifdef __WXMICROWIN__
196 wxCursorRefData
*refData
= new wxCursorRefData
;
201 case wxCURSOR_ARROWWAIT
:
203 refData
->m_hCursor
= (WXHCURSOR
) LoadCursor((HINSTANCE
) NULL
, IDC_APPSTARTING
);
207 refData
->m_hCursor
= (WXHCURSOR
) LoadCursor((HINSTANCE
) NULL
, IDC_WAIT
);
210 refData
->m_hCursor
= (WXHCURSOR
) LoadCursor((HINSTANCE
) NULL
, IDC_IBEAM
);
213 refData
->m_hCursor
= (WXHCURSOR
) LoadCursor((HINSTANCE
) NULL
, IDC_CROSS
);
215 case wxCURSOR_SIZENWSE
:
216 refData
->m_hCursor
= (WXHCURSOR
) LoadCursor((HINSTANCE
) NULL
, IDC_SIZENWSE
);
218 case wxCURSOR_SIZENESW
:
219 refData
->m_hCursor
= (WXHCURSOR
) LoadCursor((HINSTANCE
) NULL
, IDC_SIZENESW
);
221 case wxCURSOR_SIZEWE
:
222 refData
->m_hCursor
= (WXHCURSOR
) LoadCursor((HINSTANCE
) NULL
, IDC_SIZEWE
);
224 case wxCURSOR_SIZENS
:
225 refData
->m_hCursor
= (WXHCURSOR
) LoadCursor((HINSTANCE
) NULL
, IDC_SIZENS
);
229 refData
->m_hCursor
= (WXHCURSOR
) LoadCursor((HINSTANCE
) NULL
, IDC_ARROW
);
234 refData
->m_hCursor
= (WXHCURSOR
) LoadCursor(wxGetInstance(), wxT("wxCURSOR_HAND"));
237 case wxCURSOR_BULLSEYE
:
239 refData
->m_hCursor
= (WXHCURSOR
) LoadCursor(wxGetInstance(), wxT("wxCURSOR_BULLSEYE"));
242 case wxCURSOR_PENCIL
:
244 refData
->m_hCursor
= (WXHCURSOR
) LoadCursor(wxGetInstance(), wxT("wxCURSOR_PENCIL"));
247 case wxCURSOR_MAGNIFIER
:
249 refData
->m_hCursor
= (WXHCURSOR
) LoadCursor(wxGetInstance(), wxT("wxCURSOR_MAGNIFIER"));
252 case wxCURSOR_NO_ENTRY
:
254 refData
->m_hCursor
= (WXHCURSOR
) LoadCursor(wxGetInstance(), wxT("wxCURSOR_NO_ENTRY"));
257 case wxCURSOR_LEFT_BUTTON
:
259 refData
->m_hCursor
= (WXHCURSOR
) LoadCursor((HINSTANCE
) NULL
, IDC_ARROW
);
262 case wxCURSOR_RIGHT_BUTTON
:
264 refData
->m_hCursor
= (WXHCURSOR
) LoadCursor((HINSTANCE
) NULL
, IDC_ARROW
);
267 case wxCURSOR_MIDDLE_BUTTON
:
269 refData
->m_hCursor
= (WXHCURSOR
) LoadCursor((HINSTANCE
) NULL
, IDC_ARROW
);
272 case wxCURSOR_SIZING
:
274 refData
->m_hCursor
= (WXHCURSOR
) LoadCursor(wxGetInstance(), wxT("wxCURSOR_SIZING"));
279 refData
->m_hCursor
= (WXHCURSOR
) LoadCursor(wxGetInstance(), wxT("wxCURSOR_WATCH"));
282 case wxCURSOR_SPRAYCAN
:
284 refData
->m_hCursor
= (WXHCURSOR
) LoadCursor(wxGetInstance(), wxT("wxCURSOR_ROLLER"));
287 case wxCURSOR_PAINT_BRUSH
:
289 refData
->m_hCursor
= (WXHCURSOR
) LoadCursor(wxGetInstance(), wxT("wxCURSOR_PBRUSH"));
292 case wxCURSOR_POINT_LEFT
:
294 refData
->m_hCursor
= (WXHCURSOR
) LoadCursor(wxGetInstance(), wxT("wxCURSOR_PLEFT"));
297 case wxCURSOR_POINT_RIGHT
:
299 refData
->m_hCursor
= (WXHCURSOR
) LoadCursor(wxGetInstance(), wxT("wxCURSOR_PRIGHT"));
302 case wxCURSOR_QUESTION_ARROW
:
304 // refData->m_hCursor = (WXHCURSOR) LoadImage(wxGetInstance(), wxT("wxCURSOR_QARROW"), IMAGE_CURSOR, 16, 16, LR_MONOCHROME);
305 refData
->m_hCursor
= (WXHCURSOR
) LoadCursor(wxGetInstance(), wxT("wxCURSOR_QARROW"));
310 refData
->m_hCursor
= (WXHCURSOR
) LoadCursor(wxGetInstance(), wxT("wxCURSOR_BLANK"));
315 refData
->m_hCursor
= (WXHCURSOR
) LoadCursor((HINSTANCE
) NULL
, IDC_ARROW
);
320 // no need to destroy the stock cursors
321 refData
->m_destroyCursor
= FALSE
;
324 wxCursor::~wxCursor()
328 // ----------------------------------------------------------------------------
329 // Global cursor setting
330 // ----------------------------------------------------------------------------
332 const wxCursor
*wxGetGlobalCursor()
334 return gs_globalCursor
;
337 void wxSetCursor(const wxCursor
& cursor
)
341 #ifndef __WXMICROWIN__
342 ::SetCursor(GetHcursorOf(cursor
));
345 if ( gs_globalCursor
)
346 *gs_globalCursor
= cursor
;