]>
Commit | Line | Data |
---|---|---|
23324ae1 FM |
1 | ///////////////////////////////////////////////////////////////////////////// |
2 | // Name: scrolwin.h | |
3 | // Purpose: documentation for wxScrolledWindow class | |
4 | // Author: wxWidgets team | |
5 | // RCS-ID: $Id$ | |
6 | // Licence: wxWindows license | |
7 | ///////////////////////////////////////////////////////////////////////////// | |
8 | ||
9 | /** | |
10 | @class wxScrolledWindow | |
11 | @wxheader{scrolwin.h} | |
12 | ||
13 | The wxScrolledWindow class manages scrolling for its client area, transforming | |
14 | the coordinates according to the scrollbar positions, and setting the | |
15 | scroll positions, thumb sizes and ranges according to the area in view. | |
16 | ||
17 | Starting from version 2.4 of wxWidgets, there are several ways to use a | |
18 | wxScrolledWindow. In particular, there are now three ways to set the | |
19 | size of the scrolling area: | |
20 | ||
21 | One way is to set the scrollbars directly using a call to | |
22 | wxScrolledWindow::SetScrollbars. | |
23 | This is the way it used to be in any previous version of wxWidgets | |
24 | and it will be kept for backwards compatibility. | |
25 | ||
26 | An additional method of manual control, which requires a little less | |
27 | computation of your own, is to set the total size of the scrolling area by | |
28 | calling either wxWindow::SetVirtualSize, | |
29 | or wxWindow::FitInside, and setting the | |
30 | scrolling increments for it by calling | |
31 | wxScrolledWindow::SetScrollRate. | |
32 | Scrolling in some orientation is enabled by setting a non-zero increment | |
33 | for it. | |
34 | ||
35 | The most automatic and newest way is to simply let sizers determine the | |
36 | scrolling area. This is now the default when you set an interior sizer | |
37 | into a wxScrolledWindow with wxWindow::SetSizer. | |
38 | The scrolling area will be set to the size requested by the sizer and | |
39 | the scrollbars will be assigned for each orientation according to the need | |
40 | for them and the scrolling increment set by | |
41 | wxScrolledWindow::SetScrollRate. | |
42 | As above, scrolling is only enabled in orientations with a non-zero | |
43 | increment. You can influence the minimum size of the scrolled area | |
44 | controlled by a sizer by calling | |
45 | wxWindow::SetVirtualSizeHints. | |
46 | (calling wxScrolledWindow::SetScrollbars | |
47 | has analogous effects in wxWidgets 2.4 -- in later versions it may not continue | |
48 | to override the sizer) | |
49 | ||
50 | Note: if Maximum size hints are still supported by SetVirtualSizeHints, use | |
51 | them at your own dire risk. They may or may not have been removed for 2.4, | |
52 | but it really only makes sense to set minimum size hints here. We should | |
53 | probably replace SetVirtualSizeHints with SetMinVirtualSize or similar | |
54 | and remove it entirely in future. | |
55 | ||
56 | As with all windows, an application can draw onto a wxScrolledWindow using | |
57 | a @ref overview_dcoverview "device context". | |
58 | ||
59 | You have the option of handling the OnPaint handler | |
60 | or overriding the wxScrolledWindow::OnDraw function, which is | |
61 | passed a pre-scrolled device context (prepared by | |
62 | wxScrolledWindow::DoPrepareDC). | |
63 | ||
64 | If you don't wish to calculate your own scrolling, you must call DoPrepareDC | |
65 | when not drawing from | |
66 | within OnDraw, to set the device origin for the device context according to the | |
67 | current | |
68 | scroll position. | |
69 | ||
70 | A wxScrolledWindow will normally scroll itself and therefore its child windows | |
71 | as well. It | |
72 | might however be desired to scroll a different window than itself: e.g. when | |
73 | designing a | |
74 | spreadsheet, you will normally only have to scroll the (usually white) cell | |
75 | area, whereas the | |
76 | (usually grey) label area will scroll very differently. For this special | |
77 | purpose, you can | |
78 | call wxScrolledWindow::SetTargetWindow which means that pressing | |
79 | the scrollbars will scroll a different window. | |
80 | ||
81 | Note that the underlying system knows nothing about scrolling coordinates, so | |
82 | that all system | |
83 | functions (mouse events, expose events, refresh calls etc) as well as the | |
84 | position of subwindows | |
85 | are relative to the "physical" origin of the scrolled window. If the user | |
86 | insert a child window at | |
87 | position (10,10) and scrolls the window down 100 pixels (moving the child | |
88 | window out of the visible | |
89 | area), the child window will report a position of (10,-90). | |
90 | ||
91 | @beginStyleTable | |
92 | @style{wxRETAINED}: | |
93 | Uses a backing pixmap to speed refreshes. Motif only. | |
94 | @endStyleTable | |
95 | ||
96 | @library{wxcore} | |
97 | @category{miscwnd} | |
98 | ||
99 | @seealso | |
100 | wxScrollBar, wxClientDC, wxPaintDC, wxVScrolledWindow | |
101 | */ | |
102 | class wxScrolledWindow : public wxPanel | |
103 | { | |
104 | public: | |
105 | //@{ | |
106 | /** | |
107 | Constructor. | |
108 | ||
109 | @param parent | |
110 | Parent window. | |
111 | ||
112 | @param id | |
113 | Window identifier. The value wxID_ANY indicates a default value. | |
114 | ||
115 | @param pos | |
116 | Window position. If a position of (-1, -1) is specified then a default position | |
117 | is chosen. | |
118 | ||
119 | @param size | |
120 | Window size. If a size of (-1, -1) is specified then the window is sized | |
121 | appropriately. | |
122 | ||
123 | @param style | |
124 | Window style. See wxScrolledWindow. | |
125 | ||
126 | @param name | |
127 | Window name. | |
128 | ||
129 | @remarks The window is initially created without visible scrollbars. Call | |
130 | SetScrollbars() to specify how big | |
131 | the virtual window size should be. | |
132 | */ | |
133 | wxScrolledWindow(); | |
134 | wxScrolledWindow(wxWindow* parent, wxWindowID id = -1, | |
135 | const wxPoint& pos = wxDefaultPosition, | |
136 | const wxSize& size = wxDefaultSize, | |
137 | long style = wxHSCROLL | wxVSCROLL, | |
138 | const wxString& name = "scrolledWindow"); | |
139 | //@} | |
140 | ||
141 | /** | |
142 | Destructor. | |
143 | */ | |
144 | ~wxScrolledWindow(); | |
145 | ||
146 | /** | |
147 | Translates the logical coordinates to the device ones. For example, if a window | |
148 | is | |
149 | scrolled 10 pixels to the bottom, the device coordinates of the origin are (0, | |
150 | 0) | |
151 | (as always), but the logical coordinates are (0, 10) and so the call to | |
152 | CalcScrolledPosition(0, 10, xx, yy) will return 0 in yy. | |
153 | ||
154 | @sa CalcUnscrolledPosition() | |
155 | */ | |
156 | void CalcScrolledPosition(int x, int y, int * xx, int * yy); | |
157 | ||
158 | /** | |
159 | Translates the device coordinates to the logical ones. For example, if a window | |
160 | is | |
161 | scrolled 10 pixels to the bottom, the device coordinates of the origin are (0, | |
162 | 0) | |
163 | (as always), but the logical coordinates are (0, 10) and so the call to | |
164 | CalcUnscrolledPosition(0, 0, xx, yy) will return 10 in yy. | |
165 | ||
166 | @sa CalcScrolledPosition() | |
167 | */ | |
168 | void CalcUnscrolledPosition(int x, int y, int * xx, int * yy); | |
169 | ||
170 | /** | |
171 | Creates the window for two-step construction. Derived classes | |
172 | should call or replace this function. See wxScrolledWindow() | |
173 | for details. | |
174 | */ | |
175 | bool Create(wxWindow* parent, wxWindowID id = -1, | |
176 | const wxPoint& pos = wxDefaultPosition, | |
177 | const wxSize& size = wxDefaultSize, | |
178 | long style = wxHSCROLL | wxVSCROLL, | |
179 | const wxString& name = "scrolledWindow"); | |
180 | ||
181 | /** | |
182 | Call this function to prepare the device context for drawing a scrolled image. | |
183 | It | |
184 | sets the device origin according to the current scroll position. | |
185 | ||
186 | DoPrepareDC is called automatically within the default OnPaint() event | |
187 | handler, so your OnDraw() override | |
188 | will be passed a 'pre-scrolled' device context. However, if you wish to draw | |
189 | from | |
190 | outside of OnDraw (via OnPaint), or you wish to implement OnPaint yourself, you | |
191 | must | |
192 | call this function yourself. For example: | |
193 | */ | |
194 | void DoPrepareDC(wxDC& dc); | |
195 | ||
196 | /** | |
197 | Enable or disable physical scrolling in the given direction. Physical | |
198 | scrolling is the physical transfer of bits up or down the | |
199 | screen when a scroll event occurs. If the application scrolls by a | |
200 | variable amount (e.g. if there are different font sizes) then physical | |
201 | scrolling will not work, and you should switch it off. Note that you | |
202 | will have to reposition child windows yourself, if physical scrolling | |
203 | is disabled. | |
204 | ||
205 | @param xScrolling | |
206 | If @true, enables physical scrolling in the x direction. | |
207 | ||
208 | @param yScrolling | |
209 | If @true, enables physical scrolling in the y direction. | |
210 | ||
211 | @remarks Physical scrolling may not be available on all platforms. Where | |
212 | it is available, it is enabled by default. | |
213 | */ | |
214 | void EnableScrolling(bool xScrolling, bool yScrolling); | |
215 | ||
216 | /** | |
217 | Get the number of pixels per scroll unit (line), in each direction, as set | |
218 | by SetScrollbars(). A value of zero indicates no | |
219 | scrolling in that direction. | |
220 | ||
221 | @param xUnit | |
222 | Receives the number of pixels per horizontal unit. | |
223 | ||
224 | @param yUnit | |
225 | Receives the number of pixels per vertical unit. | |
226 | ||
227 | @sa SetScrollbars(), GetVirtualSize() | |
228 | */ | |
229 | void GetScrollPixelsPerUnit(int* xUnit, int* yUnit); | |
230 | ||
231 | /** | |
232 | Get the position at which the visible portion of the window starts. | |
233 | ||
234 | @param x | |
235 | Receives the first visible x position in scroll units. | |
236 | ||
237 | @param y | |
238 | Receives the first visible y position in scroll units. | |
239 | ||
240 | @remarks If either of the scrollbars is not at the home position, x | |
241 | and/or y will be greater than zero. Combined with | |
242 | wxWindow::GetClientSize, the application can use this | |
243 | function to efficiently redraw only the visible | |
244 | portion of the window. The positions are in logical | |
245 | scroll units, not pixels, so to convert to pixels you | |
246 | will have to multiply by the number of pixels per | |
247 | scroll increment. | |
248 | ||
249 | @sa SetScrollbars() | |
250 | */ | |
251 | void GetViewStart(int* x, int* y); | |
252 | ||
253 | /** | |
254 | Gets the size in device units of the scrollable window area (as | |
255 | opposed to the client size, which is the area of the window currently | |
256 | visible). | |
257 | ||
258 | @param x | |
259 | Receives the length of the scrollable window, in pixels. | |
260 | ||
261 | @param y | |
262 | Receives the height of the scrollable window, in pixels. | |
263 | ||
264 | @remarks Use wxDC::DeviceToLogicalX and wxDC::DeviceToLogicalY to | |
265 | translate these units to logical units. | |
266 | ||
267 | @sa SetScrollbars(), GetScrollPixelsPerUnit() | |
268 | */ | |
269 | void GetVirtualSize(int* x, int* y); | |
270 | ||
271 | /** | |
272 | Motif only: @true if the window has a backing bitmap. | |
273 | */ | |
274 | bool IsRetained(); | |
275 | ||
276 | /** | |
277 | Called by the default paint event handler to allow the application to define | |
278 | painting behaviour without having to worry about calling | |
279 | DoPrepareDC(). | |
280 | ||
281 | Instead of overriding this function you may also just process the paint event | |
282 | in the derived class as usual, but then you will have to call DoPrepareDC() | |
283 | yourself. | |
284 | */ | |
285 | virtual void OnDraw(wxDC& dc); | |
286 | ||
287 | /** | |
288 | This function is for backwards compatibility only and simply calls | |
289 | DoPrepareDC() now. Notice that it is | |
290 | not called by the default paint event handle (DoPrepareDC() is), so | |
291 | overriding this method in your derived class is useless. | |
292 | */ | |
293 | void PrepareDC(wxDC& dc); | |
294 | ||
295 | /** | |
296 | Scrolls a window so the view start is at the given point. | |
297 | ||
298 | @param x | |
299 | The x position to scroll to, in scroll units. | |
300 | ||
301 | @param y | |
302 | The y position to scroll to, in scroll units. | |
303 | ||
304 | @remarks The positions are in scroll units, not pixels, so to convert to | |
305 | pixels you will have to multiply by the number of | |
306 | pixels per scroll increment. If either parameter is | |
307 | -1, that position will be ignored (no change in that | |
308 | direction). | |
309 | ||
310 | @sa SetScrollbars(), GetScrollPixelsPerUnit() | |
311 | */ | |
312 | void Scroll(int x, int y); | |
313 | ||
314 | /** | |
315 | Set the horizontal and vertical scrolling increment only. See the pixelsPerUnit | |
316 | parameter in SetScrollbars. | |
317 | */ | |
318 | void SetScrollRate(int xstep, int ystep); | |
319 | ||
320 | /** | |
321 | Sets up vertical and/or horizontal scrollbars. | |
322 | ||
323 | @param pixelsPerUnitX | |
324 | Pixels per scroll unit in the horizontal direction. | |
325 | ||
326 | @param pixelsPerUnitY | |
327 | Pixels per scroll unit in the vertical direction. | |
328 | ||
329 | @param noUnitsX | |
330 | Number of units in the horizontal direction. | |
331 | ||
332 | @param noUnitsY | |
333 | Number of units in the vertical direction. | |
334 | ||
335 | @param xPos | |
336 | Position to initialize the scrollbars in the horizontal direction, in scroll | |
337 | units. | |
338 | ||
339 | @param yPos | |
340 | Position to initialize the scrollbars in the vertical direction, in scroll | |
341 | units. | |
342 | ||
343 | @param noRefresh | |
344 | Will not refresh window if @true. | |
345 | ||
346 | @remarks The first pair of parameters give the number of pixels per | |
347 | 'scroll step', i.e. amount moved when the up or down | |
348 | scroll arrows are pressed. The second pair gives the | |
349 | length of scrollbar in scroll steps, which sets the | |
350 | size of the virtual window. | |
351 | ||
352 | @sa wxWindow::SetVirtualSize | |
353 | */ | |
354 | void SetScrollbars(int pixelsPerUnitX, int pixelsPerUnitY, | |
355 | int noUnitsX, | |
356 | int noUnitsY, | |
357 | int xPos = 0, | |
358 | int yPos = 0, | |
359 | bool noRefresh = @false); | |
360 | ||
361 | /** | |
362 | Call this function to tell wxScrolledWindow to perform the actual scrolling on | |
363 | a different window (and not on itself). | |
364 | */ | |
365 | void SetTargetWindow(wxWindow* window); | |
366 | }; |