1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: wxCursor class
4 // Author: Julian Smart
8 // Copyright: (c) Julian Smart and Markus Holzem
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
13 #pragma implementation "cursor.h"
16 // For compilers that support precompilation, includes "wx.h".
17 #include "wx/wxprec.h"
29 #include "wx/cursor.h"
33 #include "wx/msw/private.h"
34 #include "wx/msw/dib.h"
38 #if wxUSE_RESOURCE_LOADING_IN_MSW
39 #include "wx/msw/curico.h"
40 #include "wx/msw/curicop.h"
43 #if !USE_SHARED_LIBRARIES
44 IMPLEMENT_DYNAMIC_CLASS(wxCursor
, wxBitmap
)
47 wxCursorRefData::wxCursorRefData(void)
49 m_width
= 32; m_height
= 32;
51 m_destroyCursor
= FALSE
;
54 wxCursorRefData::~wxCursorRefData(void)
56 if ( m_hCursor
&& m_destroyCursor
)
58 ::DestroyCursor((HCURSOR
) m_hCursor
);
60 ::DestroyCursor((HICON
) m_hCursor
);
65 wxCursor::wxCursor(void)
69 wxCursor::wxCursor(const char WXUNUSED(bits
)[], int WXUNUSED(width
), int WXUNUSED(height
),
70 int WXUNUSED(hotSpotX
), int WXUNUSED(hotSpotY
), const char WXUNUSED(maskBits
)[])
74 wxCursor::wxCursor(const wxString
& cursor_file
, long flags
, int hotSpotX
, int hotSpotY
)
76 m_refData
= new wxIconRefData
;
78 M_CURSORDATA
->m_destroyCursor
= FALSE
;
79 M_CURSORDATA
->m_hCursor
= 0;
80 M_CURSORDATA
->m_ok
= FALSE
;
81 if (flags
& wxBITMAP_TYPE_CUR_RESOURCE
)
83 M_CURSORDATA
->m_hCursor
= (WXHCURSOR
) LoadCursor(wxGetInstance(), cursor_file
);
84 if (M_CURSORDATA
->m_hCursor
)
85 M_CURSORDATA
->m_ok
= TRUE
;
87 M_CURSORDATA
->m_ok
= FALSE
;
89 else if (flags
& wxBITMAP_TYPE_CUR
)
91 #if wxUSE_RESOURCE_LOADING_IN_MSW
92 M_CURSORDATA
->m_hCursor
= (WXHCURSOR
) ReadCursorFile(WXSTRINGCAST cursor_file
, wxGetInstance(), &M_CURSORDATA
->m_width
, &M_CURSORDATA
->m_height
);
93 M_CURSORDATA
->m_destroyCursor
= TRUE
;
96 else if (flags
& wxBITMAP_TYPE_ICO
)
98 #if wxUSE_RESOURCE_LOADING_IN_MSW
99 M_CURSORDATA
->m_hCursor
= (WXHCURSOR
) IconToCursor(WXSTRINGCAST cursor_file
, wxGetInstance(), hotSpotX
, hotSpotY
, &M_CURSORDATA
->m_width
, &M_CURSORDATA
->m_height
);
100 M_CURSORDATA
->m_destroyCursor
= TRUE
;
103 else if (flags
& wxBITMAP_TYPE_BMP
)
105 #if wxUSE_RESOURCE_LOADING_IN_MSW
107 HPALETTE hPalette
= 0;
108 bool success
= ReadDIB(MBSTRINGCAST cursor_file
.mb_str(wxConvFile
), &hBitmap
, &hPalette
) != 0;
112 DeleteObject(hPalette
);
116 M_CURSORDATA
->m_hCursor
= (WXHCURSOR
) MakeCursorFromBitmap(wxGetInstance(), hBitmap
, &pnt
);
117 M_CURSORDATA
->m_destroyCursor
= TRUE
;
118 DeleteObject(hBitmap
);
119 if (M_CURSORDATA
->m_hCursor
)
120 M_CURSORDATA
->m_ok
= TRUE
;
125 // Cursors by stock number
126 wxCursor::wxCursor(int cursor_type
)
128 m_refData
= new wxIconRefData
;
133 M_CURSORDATA
->m_hCursor
= (WXHCURSOR
) LoadCursor((HINSTANCE
) NULL
, IDC_WAIT
);
136 M_CURSORDATA
->m_hCursor
= (WXHCURSOR
) LoadCursor((HINSTANCE
) NULL
, IDC_IBEAM
);
139 M_CURSORDATA
->m_hCursor
= (WXHCURSOR
) LoadCursor((HINSTANCE
) NULL
, IDC_CROSS
);
141 case wxCURSOR_SIZENWSE
:
142 M_CURSORDATA
->m_hCursor
= (WXHCURSOR
) LoadCursor((HINSTANCE
) NULL
, IDC_SIZENWSE
);
144 case wxCURSOR_SIZENESW
:
145 M_CURSORDATA
->m_hCursor
= (WXHCURSOR
) LoadCursor((HINSTANCE
) NULL
, IDC_SIZENESW
);
147 case wxCURSOR_SIZEWE
:
148 M_CURSORDATA
->m_hCursor
= (WXHCURSOR
) LoadCursor((HINSTANCE
) NULL
, IDC_SIZEWE
);
150 case wxCURSOR_SIZENS
:
151 M_CURSORDATA
->m_hCursor
= (WXHCURSOR
) LoadCursor((HINSTANCE
) NULL
, IDC_SIZENS
);
155 M_CURSORDATA
->m_hCursor
= (WXHCURSOR
) LoadCursor((HINSTANCE
) NULL
, IDC_ARROW
);
160 M_CURSORDATA
->m_hCursor
= (WXHCURSOR
) LoadCursor(wxGetInstance(), _T("wxCURSOR_HAND"));
163 case wxCURSOR_BULLSEYE
:
165 M_CURSORDATA
->m_hCursor
= (WXHCURSOR
) LoadCursor(wxGetInstance(), _T("wxCURSOR_BULLSEYE"));
168 case wxCURSOR_PENCIL
:
170 M_CURSORDATA
->m_hCursor
= (WXHCURSOR
) LoadCursor(wxGetInstance(), _T("wxCURSOR_PENCIL"));
173 case wxCURSOR_MAGNIFIER
:
175 M_CURSORDATA
->m_hCursor
= (WXHCURSOR
) LoadCursor(wxGetInstance(), _T("wxCURSOR_MAGNIFIER"));
178 case wxCURSOR_NO_ENTRY
:
180 M_CURSORDATA
->m_hCursor
= (WXHCURSOR
) LoadCursor(wxGetInstance(), _T("wxCURSOR_NO_ENTRY"));
183 case wxCURSOR_LEFT_BUTTON
:
185 M_CURSORDATA
->m_hCursor
= (WXHCURSOR
) LoadCursor((HINSTANCE
) NULL
, IDC_ARROW
);
188 case wxCURSOR_RIGHT_BUTTON
:
190 M_CURSORDATA
->m_hCursor
= (WXHCURSOR
) LoadCursor((HINSTANCE
) NULL
, IDC_ARROW
);
193 case wxCURSOR_MIDDLE_BUTTON
:
195 M_CURSORDATA
->m_hCursor
= (WXHCURSOR
) LoadCursor((HINSTANCE
) NULL
, IDC_ARROW
);
198 case wxCURSOR_SIZING
:
200 M_CURSORDATA
->m_hCursor
= (WXHCURSOR
) LoadCursor(wxGetInstance(), _T("wxCURSOR_SIZING"));
205 M_CURSORDATA
->m_hCursor
= (WXHCURSOR
) LoadCursor(wxGetInstance(), _T("wxCURSOR_WATCH"));
208 case wxCURSOR_SPRAYCAN
:
210 M_CURSORDATA
->m_hCursor
= (WXHCURSOR
) LoadCursor(wxGetInstance(), _T("wxCURSOR_ROLLER"));
213 case wxCURSOR_PAINT_BRUSH
:
215 M_CURSORDATA
->m_hCursor
= (WXHCURSOR
) LoadCursor(wxGetInstance(), _T("wxCURSOR_PBRUSH"));
218 case wxCURSOR_POINT_LEFT
:
220 M_CURSORDATA
->m_hCursor
= (WXHCURSOR
) LoadCursor(wxGetInstance(), _T("wxCURSOR_PLEFT"));
223 case wxCURSOR_POINT_RIGHT
:
225 M_CURSORDATA
->m_hCursor
= (WXHCURSOR
) LoadCursor(wxGetInstance(), _T("wxCURSOR_PRIGHT"));
228 case wxCURSOR_QUESTION_ARROW
:
230 M_CURSORDATA
->m_hCursor
= (WXHCURSOR
) LoadCursor(wxGetInstance(), _T("wxCURSOR_QARROW"));
235 M_CURSORDATA
->m_hCursor
= (WXHCURSOR
) LoadCursor(wxGetInstance(), _T("wxCURSOR_BLANK"));
240 M_CURSORDATA
->m_hCursor
= (WXHCURSOR
) LoadCursor((HINSTANCE
) NULL
, IDC_ARROW
);
245 wxCursor::~wxCursor(void)
247 // FreeResource(TRUE);
250 bool wxCursor::FreeResource(bool WXUNUSED(force
))
252 if (M_CURSORDATA
&& M_CURSORDATA
->m_hCursor
&& M_CURSORDATA
->m_destroyCursor
)
254 DestroyCursor((HCURSOR
) M_CURSORDATA
->m_hCursor
);
255 M_CURSORDATA
->m_hCursor
= 0;
260 void wxCursor::SetHCURSOR(WXHCURSOR cursor
)
263 m_refData
= new wxCursorRefData
;
265 M_CURSORDATA
->m_hCursor
= cursor
;
268 // Global cursor setting
269 void wxSetCursor(const wxCursor
& cursor
)
271 extern wxCursor
*g_globalCursor
;
273 if ( cursor
.Ok() && cursor
.GetHCURSOR() )
275 ::SetCursor((HCURSOR
) cursor
.GetHCURSOR());
277 if ( g_globalCursor
)
278 (*g_globalCursor
) = cursor
;