| 1 | ///////////////////////////////////////////////////////////////////////////// |
| 2 | // Name: windowsizing.h |
| 3 | // Purpose: topic overview |
| 4 | // Author: wxWidgets team |
| 5 | // RCS-ID: $Id$ |
| 6 | // Licence: wxWindows license |
| 7 | ///////////////////////////////////////////////////////////////////////////// |
| 8 | |
| 9 | /** |
| 10 | |
| 11 | @page overview_windowsizing Window Sizing Overview |
| 12 | |
| 13 | It can sometimes be confusing to keep track of the various size-related |
| 14 | attributes of a wxWindow, how they relate to each other, and how they interact |
| 15 | with sizers. This document will attempt to clear the fog a little, and give |
| 16 | some simple explanations of things. |
| 17 | |
| 18 | @li @ref overview_windowsizing_glossary |
| 19 | @li @ref overview_windowsizing_func |
| 20 | |
| 21 | |
| 22 | <hr> |
| 23 | |
| 24 | |
| 25 | @section overview_windowsizing_glossary Glossary |
| 26 | |
| 27 | @li @b "Best Size": the best size of a widget depends on what kind of widget it is, |
| 28 | and usually also on the contents of the widget. For example a wxListBox's best |
| 29 | size will be calculated based on how many items it has, up to a certain limit, |
| 30 | or a wxButton's best size will be calculated based on its label size, but |
| 31 | normally won't be smaller than the platform default button size (unless a style |
| 32 | flag overrides that). |
| 33 | There is a special virtual method in the C++ window classes called |
| 34 | wxWindow::DoGetBestSize() that a class needs to override if it wants to calculate |
| 35 | its own best size based on its content. |
| 36 | |
| 37 | @li @b "Minimal Size": the minimal size of a widget is a size that is normally explicitly |
| 38 | set by the programmer either with the wxWindow::SetMinSize() method or with the |
| 39 | wxWindow::SetSizeHints() method. |
| 40 | Most controls will also set the minimal size to the size given in the control's |
| 41 | constructor if a non-default value is passed. |
| 42 | Top-level windows such as wxFrame will not allow the user to resize the frame below |
| 43 | the minimal size. |
| 44 | |
| 45 | @li @b "Maximum Size": just like for the minimal size, the maximum size is normally |
| 46 | explicitely set by the programmer with the wxWindow::SetMaxSize() method or |
| 47 | with wxWindow::SetSizeHints(). |
| 48 | Top-level windows such as wxFrame will not allow the user to resize the frame above |
| 49 | the maximum size. |
| 50 | |
| 51 | @li @b "Size": the size of a widget can be explicitly set or fetched with the |
| 52 | wxWindow::SetSize() or wxWindow::GetSize() methods. |
| 53 | This size value is the size that the widget is currently using on screen and is |
| 54 | the way to change the size of something that is not being managed by a sizer. |
| 55 | |
| 56 | @li @b "Client Size": the client size represents the widget's area inside of any |
| 57 | borders belonging to the widget and is the area that can be drawn upon in a |
| 58 | @c EVT_PAINT event. If a widget doesn't have a border then its client size is |
| 59 | the same as its size. |
| 60 | |
| 61 | @li @b "Initial Size": the initial size of a widget is the size given to the |
| 62 | constructor of the widget, if any. |
| 63 | As mentioned above most controls will also set this size value as the control's |
| 64 | minimal size. If the size passed to the constructor is the default ::wxDefaultSize, |
| 65 | or if the size is not fully specified (such as wxSize(150,-1)) then most controls |
| 66 | will fill in the missing size components using the best size and will set the |
| 67 | initial size of the control to the resulting size. |
| 68 | |
| 69 | @li @b "Virtual Size": the virtual size is the size of the potentially viewable |
| 70 | area of the widget. |
| 71 | The virtual size of a widget may be larger than its actual size and in this |
| 72 | case scrollbars will appear to the let the user 'explore' the full contents |
| 73 | of the widget. |
| 74 | See wxScrolled for more info. |
| 75 | |
| 76 | |
| 77 | @section overview_windowsizing_func Functions related to sizing |
| 78 | |
| 79 | @li wxWindow::GetEffectiveMinSize(): returns a blending of the widget's minimal size |
| 80 | and best size, giving precedence to the minimal size. |
| 81 | For example, if a widget's min size is set to (150, -1) and the best size is |
| 82 | (80, 22) then the best fitting size is (150, 22). If the min size is (50, 20) |
| 83 | then the best fitting size is (50, 20). This method is what is called by the |
| 84 | sizers when determining what the requirements of each item in the sizer is, |
| 85 | and is used for calculating the overall minimum needs of the sizer. |
| 86 | |
| 87 | @li wxWindow::SetInitialSize(): this is a little different than the typical size |
| 88 | setters. Rather than just setting an "initial size" attribute it actually sets |
| 89 | the minimal size to the value passed in, blends that value with the best size, |
| 90 | and then sets the size of the widget to be the result. |
| 91 | So you can consider this method to be a "Smart SetSize". This method is what is |
| 92 | called by the constructor of most controls to set the minimal size and the initial |
| 93 | size of the control. |
| 94 | |
| 95 | @li wxWindow::Fit(): this method sets the size of a window to fit around its children. |
| 96 | If it has no children then nothing is done, if it does have children then the size |
| 97 | of the window is set to the window's best size. |
| 98 | |
| 99 | @li wxSizer::Fit(): this sets the size of the window to be large enough to |
| 100 | accommodate the minimum size needed by the sizer, (along with a few other |
| 101 | constraints...). If the sizer is the one that is assigned to the window then |
| 102 | this should be equivalent to wxWindow::Fit(). |
| 103 | |
| 104 | @li wxSizer::Layout(): recalculates the minimum space needed by each item in the |
| 105 | sizer, and then lays out the items within the space currently allotted to the sizer. |
| 106 | |
| 107 | @li wxWindow::Layout(): if the window has a sizer then it sets the space given to |
| 108 | the sizer to the current size of the window, which results in a call to |
| 109 | wxSizer::Layout(). If the window has layout constraints instead of a sizer then |
| 110 | the constraints algorithm is run. The @c Layout() method is what is called by |
| 111 | the default @c EVT_SIZE handler for container windows. |
| 112 | |
| 113 | */ |
| 114 | |