Les contrôles graphiques sont typiquement les éléments visibles de l'interface qui s'affichent à l'écran. La hiérarchie des contrôles disponible démarre à partir de l'objet
Screen
qui possède une propriété
Controls
qui contient la collection des contrôles directement dépendant de l'écran (on parle des contrôles
enfant d'un écran
parent). Chaque objet
Control
(ou objet dépendant) possède aussi lui-même une propriété
Controls
et peut à son tour avoir des contrôles enfant. C'est donc en créant une hiérarchie de contrôles que l'écran est finalement dessiné. Si un contrôle est défini comme étant caché, avec
SetVisible(false)
, alors tous les contrôles
enfants seront également masqués.
Même si un contrôle
enfant a des limites relatives à son
parent, il ne doit pas nécessairement être strictement contenu au sein de son contrôle
parent. On peut élaborer des mises en page qui intègrent une superposition d'objets et ainsi élargir le cadre trop étriqué des applications Windows Mobile classiques.
Il est possible d'étendre les contrôles disponibles par héritage. Le cas suivant montre un exemple simple où une nouvelle classe nommée
SuperpositionImage
étend les possibilités de la classe par défaut
Image
pour afficher une nouvelle image en surimpression de l'image en cours :
class SuperpositionImage : Image
{
void RafraichirImage(String nomFichier, String nomFichierSuperpose)
{
//chargement de l'image initiale
Surface.LoadFromFile(nomFichier);
//chargement de l'image superposée
Surface superpose;
superpose.LoadFromFile(nomFichierSuperpose);
//Dessin de l'image superposée sur l'image initiale
Renderer.Draw(Surface, superpose, 0, 0);
}
}
- Créer des contrôles personnalisés
En plus d'étendre les contrôles existants, il est possible de créer des contrôles personnalisés avec une combinaison de multiples autres contrôles. C'est vraiment pratique pour la réutilisation car il est possible de définir une fonctionnalité pour chaque contrôle de manière individuelle et collective. L'exemple suivant est issu de l'applet des Tâches. Chaque ligne affichée est un des contrôles. La fonctionnalité de base provient de
Button
, mais les contrôles
Label
et
Image
(optionnel) sont également affichés. Remarquez comment les manipulateurs (
handlers) d'évènement peuvent être configurés au sein de la classe
TaskRow
. Il est important de noter que les contrôles
enfants (comme le texte
lblSubject
dans l'exemple qui suit) doivent uniquement être ajouté une seule fois en utilisant
Controls.Add()
.
class TaskRow : Button
{
Label lblSubject;
int x, y, w, h;
String s;
int ObjectID;
bool isComplete;
void Load()
{
OnClick = OnClick_Handler;
Image.LoadFromFile("Row.Background.jif");
ImageSelected.LoadFromFile("Row.Background.Selected.jif");
lblSubject.SetAlign("Left", "Center");
lblSubject.SetFont("Font.Large");
Controls.Add(lblSubject);
}
void Set(DataTable tbl, int y, int delay)
{
w = Image.GetWidth();
h = Image.GetHeight();
//position correctly
SetBounds(0, y);
//get data from the table
tbl.GetValue("Subject", s);
lblSubject.SetText(s);
tbl.GetValue("ObjectID", ObjectID);
tbl.GetValue("Complete", isComplete);
w = GetWidth();
x = w / 24;
Image img;
img.Surface.LoadFromFile("Icon.Ring.Tick.jif");
img.SetBounds(x, y);
img.AnimateClear();
if (isComplete)
{
img.AnimateFade(0, 100, 5, delay);
}
else
{
img.AnimateFade(0, 30, 5, delay);
}
Controls.Add(img);
int padding, left;
padding = 20;
left = img.GetWidth() + padding;
lblSubject.SetBounds(0, 0, GetWidth(), GetHeight());
lblSubject.SetPadding(0, padding, 0, left);
lblSubject.AnimateClear();
lblSubject.AnimateFade(0, 100, 5, delay);
//show
SetVisible(true);
}
void OnClick_Handler(Control sender, int x, int y)
{
//show task
Tasks.Display(ObjectID);
}
}