Pointui Home 2 - Contrôles graphiques

Modifié le vendredi, 06 février 2009 11:27 par Christophe — Catégorisé en: Pointui Home

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); 
	} 
} 


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); 
	} 
}