| Before you read the hello.cs source code: | |
| Preface about GUI Programming Methodologies | |
| =========================================== | |
| The traditional GUI programming methodology for Windows GUI programmers | |
| is to assemble controls using a GUI builder. These GUI builders | |
| don't have good techniques for determining the size and position of the | |
| controls depending on their contents. Instead, they *hardcode* the | |
| size and positions of the controls in each panel, as fixed numbers, | |
| measured in pixels. | |
| What are the consequences? | |
| 1) Consequences for all users: | |
| Such panels would not look nice when the user resizes them. So the | |
| programmer simply makes the dialogs non-resizable. When such a | |
| panel then contains a scrollable list of items, with 100 items and | |
| a scroll window of 5 items, a user's normal reaction is to enlarge | |
| the dialog, to see more items. But the dialog is not resizable! | |
| Frustration. | |
| 2) Consequences for disabled users: | |
| Some users need bigger fonts for working comfortably. Guess what | |
| happens when the user changes the size of the default system font? | |
| Many labels in dialogs are truncated. | |
| 3) Consequences for internationalization: | |
| The translation of a term or label in another language often needs | |
| more screen space. For example, Japanese translations often are 30% | |
| longer than the original English label. Therefore, if only the strings | |
| of a dialog are localized, many labels are truncated. | |
| Problems 1 and 2 are usually accepted in the Windows programmers | |
| community. (Problem 1 is not fatal, only frustrating. And problem 2 | |
| affects only a small proportion of the users; they are simply ignored.) | |
| Problem 3 is "solved" by letting the localization team not only translate | |
| the strings, but also redo the layout of each dialog. | |
| In contrast, the methodology of programmers of the Qt/KDE, Gtk/GNOME, | |
| wxWidgets, AWT, Swing, Tk toolkits is to have the positions and sizes | |
| of controls determined at runtime, according to | |
| - the needs of the control itself, | |
| - the needs of the other controls in the panel, | |
| - the available panel size, given by the user through resizing. | |
| The common technology for this approach is to group related controls | |
| together in containers, and perform size and position propagations | |
| between the controls of the container, the container, the container's | |
| container etc. These computations are performed by so-called | |
| "layout manager" objects. | |
| Other technologies such as global constraint systems (as in Garnet) or | |
| spring-like attachments are not so much in use anymore nowadays. | |
| This programmed-resizing methodology solves the problems 1), 2) and 3). | |
| What are the associated costs and efforts? Taking the programmed-resizing | |
| methodology as baseline, the hardcoded sizes and positions approach has | |
| - the advantage that the programmer saves about 1/3 of the GUI | |
| programming work (namely choosing the layout managers and setting | |
| alignment hints), | |
| - the drawback that each localization team has much more work, namely | |
| to rearrange the controls in the panel. | |
| In most free software projects, there are at least ca. 5 localizations; | |
| successful projects even have 30 or 50 localizations. | |
| In other words, a program built with hardcoded sizes and positions | |
| cannot afford many localizations, or the effort for localization will | |
| be prohibitively high. | |
| For this reason, we strongly recommend to use the programmed-resizing | |
| methodology. In this example, since the Windows.Forms package lacks | |
| layout manager classes, we compute the layout by hand, through an | |
| override of the OnResize method. For larger programs, we would recommend | |
| to build a few simple layout managers, to get on par with the layout | |
| abilities found in Qt, Swing, etc. | |
| (The layout system of Gtk/GNOME is somewhat particular: It does not | |
| provide the ability to set a preferred alignment on controls like labels. | |
| Instead one uses intermediate containers for the purpose of alignment.) | |
| Acknowledgement: This preface borrows ideas from an article of Luke Plant. | |
| Copyright (C) 2006 Free Software Foundation, Inc. |