Developpez.com - Delphi
X

Choisissez d'abord la catégorieensuite la rubrique :

Nono40.developpez.com
Le petit coin du web de Nono40
SOURCES TESTS DELPHI WIN32 AUTOMATISMES DELPHI .NET QUICK-REPORT
Retour à l'accueil
41 - DESSINER DIRECTEMENT DANS LE SYSTRAY AVEC CREATEICON

PRÉSENTATION : Dessin directe d'une icône affichée dans le systray.
ZIP : Téléchargez le zip APERÇUS :

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 1And $F0
      Else XorMasque[j,i Shr 1] := XorMasque[j,i Shr 1And $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.

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2003 Bruno Guérangé. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Responsables bénévoles de la rubrique Delphi : Gilles Vasseur - Alcatîz -