]> git.saurik.com Git - wxWidgets.git/blob - include/wx/msw/dragimag.h
Added wxPaintDCEx class, to handle the case where an HDC
[wxWidgets.git] / include / wx / msw / dragimag.h
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: wx/msw/dragimag.h
3 // Purpose: wxDragImage class: a kind of a cursor, that can cope
4 // with more sophisticated images
5 // Author: Julian Smart
6 // Modified by:
7 // Created: 08/04/99
8 // RCS-ID: $Id$
9 // Copyright: (c) Julian Smart
10 // Licence: wxWindows licence
11 /////////////////////////////////////////////////////////////////////////////
12
13 #ifndef _WX_DRAGIMAG_H_
14 #define _WX_DRAGIMAG_H_
15
16 #ifdef __GNUG__
17 #pragma interface "dragimag.h"
18 #endif
19
20 #include "wx/bitmap.h"
21 #include "wx/icon.h"
22 #include "wx/cursor.h"
23 #include "wx/treectrl.h"
24 #include "wx/listctrl.h"
25
26 // If 1, use a simple wxCursor instead of ImageList_SetDragCursorImage
27 #define wxUSE_SIMPLER_DRAGIMAGE 0
28
29 /*
30 To use this class, create a wxDragImage when you start dragging, for example:
31
32 void MyTreeCtrl::OnBeginDrag(wxTreeEvent& event)
33 {
34 #ifdef __WXMSW__
35 ::UpdateWindow((HWND) GetHWND()); // We need to implement this in wxWindows
36 #endif
37
38 CaptureMouse();
39
40 m_dragImage = new wxDragImage(* this, itemId);
41 m_dragImage->BeginDrag(wxPoint(0, 0), this);
42 m_dragImage->Move(pt, this);
43 m_dragImage->Show(this);
44 ...
45 }
46
47 In your OnMouseMove function, hide the image, do any display updating required,
48 then move and show the image again:
49
50 void MyTreeCtrl::OnMouseMove(wxMouseEvent& event)
51 {
52 if (m_dragMode == MY_TREE_DRAG_NONE)
53 {
54 event.Skip();
55 return;
56 }
57
58 // Prevent screen corruption by hiding the image
59 if (m_dragImage)
60 m_dragImage->Hide(this);
61
62 // Do some updating of the window, such as highlighting the drop target
63 ...
64
65 #ifdef __WXMSW__
66 if (updateWindow)
67 ::UpdateWindow((HWND) GetHWND());
68 #endif
69
70 // Move and show the image again
71 m_dragImage->Move(event.GetPosition(), this);
72 m_dragImage->Show(this);
73 }
74
75 Eventually we end the drag and delete the drag image.
76
77 void MyTreeCtrl::OnLeftUp(wxMouseEvent& event)
78 {
79 ...
80
81 // End the drag and delete the drag image
82 if (m_dragImage)
83 {
84 m_dragImage->EndDrag(this);
85 delete m_dragImage;
86 m_dragImage = NULL;
87 }
88 ReleaseMouse();
89 }
90 */
91
92 /*
93 Notes for Unix version:
94 Can we simply use cursors instead, creating a cursor dynamically, setting it into the window
95 in BeginDrag, and restoring the old cursor in EndDrag?
96 For a really bog-standard implementation, we could simply use a normal dragging cursor
97 and ignore the image.
98 */
99
100 /*
101 * wxDragImage
102 */
103
104 class WXDLLEXPORT wxDragImage: public wxObject
105 {
106 public:
107
108 // Ctors & dtor
109 ////////////////////////////////////////////////////////////////////////////
110
111 wxDragImage();
112 wxDragImage(const wxBitmap& image, const wxCursor& cursor = wxNullCursor)
113 {
114 Init();
115
116 Create(image, cursor);
117 }
118
119 // Deprecated form of the above
120 wxDragImage(const wxBitmap& image, const wxCursor& cursor, const wxPoint& cursorHotspot)
121 {
122 Init();
123
124 Create(image, cursor, cursorHotspot);
125 }
126
127 wxDragImage(const wxIcon& image, const wxCursor& cursor = wxNullCursor)
128 {
129 Init();
130
131 Create(image, cursor);
132 }
133
134 // Deprecated form of the above
135 wxDragImage(const wxIcon& image, const wxCursor& cursor, const wxPoint& cursorHotspot)
136 {
137 Init();
138
139 Create(image, cursor, cursorHotspot);
140 }
141
142 wxDragImage(const wxString& str, const wxCursor& cursor = wxNullCursor)
143 {
144 Init();
145
146 Create(str, cursor);
147 }
148
149 // Deprecated form of the above
150 wxDragImage(const wxString& str, const wxCursor& cursor, const wxPoint& cursorHotspot)
151 {
152 Init();
153
154 Create(str, cursor, cursorHotspot);
155 }
156
157 #if wxUSE_TREECTRL
158 wxDragImage(const wxTreeCtrl& treeCtrl, wxTreeItemId& id)
159 {
160 Init();
161
162 Create(treeCtrl, id);
163 }
164 #endif
165
166 #if wxUSE_LISTCTRL
167 wxDragImage(const wxListCtrl& listCtrl, long id)
168 {
169 Init();
170
171 Create(listCtrl, id);
172 }
173 #endif
174
175 ~wxDragImage();
176
177 // Attributes
178 ////////////////////////////////////////////////////////////////////////////
179
180 // Operations
181 ////////////////////////////////////////////////////////////////////////////
182
183 // Create a drag image from a bitmap and optional cursor
184 bool Create(const wxBitmap& image, const wxCursor& cursor = wxNullCursor);
185 bool Create(const wxBitmap& image, const wxCursor& cursor, const wxPoint& WXUNUSED(cursorHotspot))
186 {
187 wxLogDebug(wxT("wxDragImage::Create: use of a cursor hotspot is now deprecated. Please omit this argument."));
188 return Create(image, cursor);
189 }
190
191 // Create a drag image from an icon and optional cursor
192 bool Create(const wxIcon& image, const wxCursor& cursor = wxNullCursor);
193 bool Create(const wxIcon& image, const wxCursor& cursor, const wxPoint& WXUNUSED(cursorHotspot))
194 {
195 wxLogDebug(wxT("wxDragImage::Create: use of a cursor hotspot is now deprecated. Please omit this argument."));
196 return Create(image, cursor);
197 }
198
199 // Create a drag image from a string and optional cursor
200 bool Create(const wxString& str, const wxCursor& cursor = wxNullCursor);
201 bool Create(const wxString& str, const wxCursor& cursor, const wxPoint& WXUNUSED(cursorHotspot))
202 {
203 wxLogDebug(wxT("wxDragImage::Create: use of a cursor hotspot is now deprecated. Please omit this argument."));
204 return Create(str, cursor);
205 }
206
207 #if wxUSE_TREECTRL
208 // Create a drag image for the given tree control item
209 bool Create(const wxTreeCtrl& treeCtrl, wxTreeItemId& id);
210 #endif
211
212 #if wxUSE_LISTCTRL
213 // Create a drag image for the given list control item
214 bool Create(const wxListCtrl& listCtrl, long id);
215 #endif
216
217 // Begin drag. hotspot is the location of the drag position relative to the upper-left
218 // corner of the image.
219 bool BeginDrag(const wxPoint& hotspot, wxWindow* window, bool fullScreen = FALSE, wxRect* rect = (wxRect*) NULL);
220
221 // Begin drag. hotspot is the location of the drag position relative to the upper-left
222 // corner of the image. This is full screen only. fullScreenRect gives the
223 // position of the window on the screen, to restrict the drag to.
224 bool BeginDrag(const wxPoint& hotspot, wxWindow* window, wxWindow* fullScreenRect);
225
226 // End drag
227 bool EndDrag();
228
229 // Move the image: call from OnMouseMove. Pt is in window client coordinates if window
230 // is non-NULL, or in screen coordinates if NULL.
231 bool Move(const wxPoint& pt);
232
233 // Show the image
234 bool Show();
235
236 // Hide the image
237 bool Hide();
238
239 // Implementation
240 ////////////////////////////////////////////////////////////////////////////
241
242 // Initialize variables
243 void Init();
244
245 // Returns the native image list handle
246 WXHIMAGELIST GetHIMAGELIST() const { return m_hImageList; }
247
248 #if !wxUSE_SIMPLER_DRAGIMAGE
249 // Returns the native image list handle for the cursor
250 WXHIMAGELIST GetCursorHIMAGELIST() const { return m_hCursorImageList; }
251 #endif
252
253 protected:
254 WXHIMAGELIST m_hImageList;
255
256 #if wxUSE_SIMPLER_DRAGIMAGE
257 wxCursor m_oldCursor;
258 #else
259 WXHIMAGELIST m_hCursorImageList;
260 #endif
261
262 wxCursor m_cursor;
263 // wxPoint m_cursorHotspot; // Obsolete
264 wxPoint m_position;
265 wxWindow* m_window;
266 wxRect m_boundingRect;
267 bool m_fullScreen;
268
269 private:
270 DECLARE_DYNAMIC_CLASS(wxDragImage)
271 DECLARE_NO_COPY_CLASS(wxDragImage)
272 };
273
274 #endif
275 // _WX_DRAGIMAG_H_