|
PRÉSENTATION :
Dessin directe d'une icône affichée dans le systray.
NOTES :
Ce programme affiche des barres de couleurs défilantes dans le systray. C'est un exemple de création dynamique d'icône
afin de dessiner dans le systray.
Pour plus d'onformation sur l'utilisation des icones dans le systray, regardez le source 0027.
CODE :
Unit Unit1;
// Dessiner directement l'icone de la barre des tâches.
//
// Par Nono40 : http://nono40.developpez.com http://nono40.fr.st
// mailTo:nono40@fr.st
//
// Le 06/03/2003
//
Interface
Uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, Menus, ExtDlgs, StdCtrls;
Type
TForm1 = Class(TForm)
TimerMiseAJour: TTimer;
Procedure FormDestroy(Sender: TObject);
Procedure FormCreate(Sender: TObject);
Procedure TimerMiseAJourTimer(Sender: TObject);
Private
{ Déclarations privées }
// Contient le Handle en cours d'affichage dans le Systray
IconeEnCours :HIcon;
Avance :Integer;
// Procédure d'ajout de l'icone, est appelée au début de l'application
Procedure AjouteIcone;
// Procédure de mise à jour de l'icone
Procedure ModifieIcone;
// Procédure de suppression de l'icone, est appelée à la fermeture
Procedure SupprimeIcone;
Public
{ Déclarations publiques }
End;
Var
Form1: TForm1;
Implementation
Uses ShellApi;
{$R *.dfm}
// Procédure d'ajout d'une icone dans la barre des taches
Procedure TForm1.AjouteIcone;
Var Info:TNotifyIconData;
Begin
// If faut tout d'abord remplir la structure Info
// avec ce que l'on veut faire
// cbSize doit contenir la taille de la structure
Info.cbSize := SizeOf(Info);
// Wnd doit contenir le Handle de la fenêtre qui recevra les messages de
// notification d'évènement de la souris
Info.Wnd := Handle;
// uID Numéro d'icone, c'est utile si plusieurs icones sont affichées en
// simultannées dans la barre des taches. Car c'est ce numéro qui permettra
// ensuite de modifier celle que l'on veut.
Info.uID := 1;
// szTip contient le texte de l'info bulle affiché au dessus de l'icone
Info.szTip := 'Exemple d''icones par Nono40';
// hIcon contient le handle de l'icone qui doit être affichée
Info.hIcon := IconeEnCours;
// uFlags doit contenir le liste des champs utilisés dans la structure
// parmis les champs szTip,hIcon et uCallBackMessage
Info.uFlags := NIF_TIP Or NIF_ICON;
// Appel de la fonction API ajoutant l'icone
Shell_NotifyIcon(NIM_ADD,@Info);
End;
Procedure TForm1.ModifieIcone;
Var Info:TNotifyIconData;
Begin
// If faut tout d'abord remplir la structure Info
// avec ce que l'on veut faire
// ( voir la procédure ci-dessus pour les détails )
Info.cbSize := SizeOf(Info);
Info.Wnd := Handle;
Info.uID := 1;
Info.uFlags := NIF_ICON;
Info.hIcon := IconeEnCours;
Shell_NotifyIcon(NIM_MODIFY,@Info);
End;
Procedure TForm1.SupprimeIcone;
Var Info:TNotifyIconData;
Begin
// Dans le cas de la suppression d'une icone, seuls les champs ci-dessous
// sont nécessaires
Info.cbSize := SizeOf(Info);
Info.Wnd := Handle;
Info.uID := 1;
Shell_NotifyIcon(NIM_DELETE,@Info);
End;
Procedure TForm1.FormCreate(Sender: TObject);
Begin
// Init au démarrage de l'application
IconeEnCours := 0;
Avance := 0;
End;
Procedure TForm1.FormDestroy(Sender: TObject);
Begin
// Si une icône est dessinée dans le systray, elle est effacée et détruite
If IconeEnCours<>0
Then Begin
SupprimeIcone;
DestroyIcon(IconeEnCours);
End;
End;
Procedure TForm1.TimerMiseAJourTimer(Sender: TObject);
// Tableau de définition du masque 'ET'
// Un bit correspond à un pixel de l'icone
// - Si le bit de ce tableau est à 0 alors le pixel
// correspondant du tableau 'XOR' sera dessiné tel quel
// - Si le bit de ce tableau est à 1 alors le pixel
// correspondant du tableau 'XOR' sera dessiné mixé avec un ou exclusif
// avec la couleur de base de l'écran. Donc si le pixel de Xor est à zéro,
// cela revient à rendre le point transparent
Const
AndMasque : Array[0..31]Of Array[0.. 3]Of Byte
=( ( $FF , $00 , $00 ,$00 ),
( $FE , $00 , $00 ,$00 ),
( $FC , $00 , $00 ,$00 ),
( $F8 , $00 , $00 ,$00 ),
( $F0 , $00 , $00 ,$00 ),
( $E0 , $00 , $00 ,$00 ),
( $C0 , $00 , $00 ,$00 ),
( $80 , $00 , $00 ,$00 ),
( $00 , $00 , $00 ,$00 ),
( $00 , $00 , $00 ,$00 ),
( $00 , $00 , $00 ,$00 ),
( $00 , $00 , $00 ,$00 ),
( $00 , $00 , $00 ,$00 ),
( $00 , $00 , $00 ,$00 ),
( $00 , $00 , $00 ,$00 ),
( $00 , $00 , $00 ,$00 ),
( $00 , $00 , $00 ,$00 ),
( $00 , $00 , $00 ,$00 ),
( $00 , $00 , $00 ,$00 ),
( $00 , $00 , $00 ,$00 ),
( $00 , $00 , $00 ,$01 ),
( $00 , $00 , $00 ,$03 ),
( $00 , $00 , $00 ,$07 ),
( $00 , $00 , $00 ,$0F ),
( $00 , $00 , $00 ,$1F ),
( $00 , $00 , $00 ,$3F ),
( $00 , $00 , $00 ,$7F ),
( $00 , $00 , $00 ,$FF ),
( $00 , $00 , $01 ,$FF ),
( $00 , $00 , $03 ,$FF ),
( $00 , $00 , $07 ,$FF ),
( $00 , $00 , $0F ,$FF ));
// Le tableau 'XOR' contient le dessin de l'icone, combiné avec le maque 'ET'
// ( voir ci-dessus )
// Pour une icone de 16 couleur, un octet du tableau défini deux points de
// l'icône.
Var XorMasque : Array[0..31]Of Array[0..15]Of Byte;
i,j : Integer;
Icone : HIcon;
Ancienne : Integer;
Begin
// Mise à jour du pas du petit graphique
Inc(Avance);
// Il faut garder le Handle de l'ancienne icone pour pouvoir la détruire
// après modification
Ancienne:=IconeEnCours;
// Dessin du graphique ( simples bandes de couleurs )
For j:=0 To 31 Do For i:=0 To 15 Do XorMasque[j,i]:=(((Avance+i) Div 8 )And 7 +8)*17;
// Mise à 0 du points de coin haut gauche de l'icône
// Le coin haut gauche sera donc transparent car cela correspons aussi
// à des bits à 1 dans le masque 'Et'
For i:=0 To 7 Do For j:=0 To 7-i Do
If Odd(i)
Then XorMasque[j,i Shr 1] := XorMasque[j,i Shr 1] And $F0
Else XorMasque[j,i Shr 1] := XorMasque[j,i Shr 1] And $0F;
// Création de l'icône
Icone := CreateIcon(HInstance
,32 // Une icône est toujours de taille 32x32
,32 //
,1 // Un seul plan dans le masque 'XOR'
,4 // 4 bits par couleur dans le maque 'XOR'
,@AndMasque // adresse du masque 'ET'
,@XorMasque); // adresse du masque 'XOR'
// Si l'icône est créée correctement, elle est mise à jour
If Icone<>0
Then Begin
// Mise à jour de l'icône dans la barre des tâches
IconeEnCours:=Icone;
If Ancienne<>0
Then Begin
ModifieIcone;
// Destruction de l'ancienne
DestroyIcon(Ancienne);
End
Else AjouteIcone;
End;
End;
End.
|
| |