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
79 - CLASSE NOTIFYICON AVEC VCL.NET

PRÉSENTATION : Utilisation de la classe NotifyIcon dans une application VCL.NET.
ZIP : Téléchargez le zip APERÇUS :

NOTES : Voir ici pour une description complète de cette méthode : Utilisation de la classe NotifyIcon

CODE :
Unit Unit1;

Interface

Uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, System.Windows.Forms,System.Drawing, Borland.Vcl.Menus,
  System.ComponentModel, Borland.Vcl.ExtCtrls, Borland.Vcl.StdCtrls,
  System.Runtime.InteropServices;

Type
  TForm1 = Class(TForm)
    Timer1: TTimer;
    PopupMenu1: TPopupMenu;
    MenuRestaurer: TMenuItem;
    MenuReduire: TMenuItem;
    MenuFermer: TMenuItem;
    Label1: TLabel;
    Procedure FormCreate(Sender: TObject);
    Procedure FormDestroy(Sender: TObject);
    Procedure MenuFermerClick(Sender: TObject);
    Procedure MenuReduireClick(Sender: TObject);
    Procedure MenuRestaurerClick(Sender: TObject);
    Procedure Timer1Timer(Sender: TObject);
    Procedure FormCloseQuery(Sender: TObject; Var CanClose: Boolean);
  Private
    { Private declarations }
    DoitFermer : Boolean;
    // Il faut déclarer manuellement le composant WinForm
    NotifyIcon1: NotifyIcon;
    Ico:IntPtr;
    // Ainsi que les évènement associés
    Procedure NotifyIcon1_DoubleClick(sender: System.Object; e: System.EventArgs);
    Procedure NotifyIcon1_MouseDown(sender: System.Object; e: System.Windows.Forms.MouseEventArgs);
  Public
    { Public declarations }
  End;

Var
  Form1: TForm1;

Implementation

Uses ShellApi;

{$R *.nfm}

[DllImport('Shell32.dll', CharSet = CharSet.Auto, SetLastError = True, EntryPoint = 'ExtractIconEx')]
Function ExtractIco(lpszFile: String; nIconIndex: Integer;
  Out phiconLarge:IntPtr;Out phiconSmall: IntPtr; nIcons: UINT): UINT; external;

Procedure TForm1.FormCreate(Sender: TObject);
Var Small,Large:IntPtr;
Begin
  // L'instance de la classe NotifyIcon doit être créée dynamiquement
  // car les composants WinForm ne peuvent être déposés sur des fiches
  // VCLForm.
  NotifyIcon1:=System.Windows.Forms.NotifyIcon.Create;
  NotifyIcon1.Text:='Nono40 - Source 79';

  // Si l'icone est celle de l'exécutable
  ExtractIco(Forms.Application.ExeName,0,Large,Small,1);
  NotifyIcon1.Icon:=System.Drawing.Icon.FromHandle(Large);

  // Si l'icône est lue dans un fichier placé à coté de l'exécutable
  //  NotifyIcon1.Icon:=System.Drawing.Icon.Create('Nono.ico');

  // Si l'icone est stockée dans un TImage sur la fiche
  //  Ico:=IntPtr.Create(Image1.Picture.Icon.Handle);
  //  NotifyIcon1.Icon:=System.Drawing.Icon.FromHandle(Ico);

  // Association des méthodes aux évènements correspondants. Notez ici
  // la différence importante avec Delphi 7. Les évènements sont ajoutés
  // dans la liste des évènements. Ce n'est plus une simple affectation
  // d'adresse de méthode.
  Include(NotifyIcon1.DoubleClick,NotifyIcon1_DoubleClick);
  Include(NotifyIcon1.MouseDown  ,NotifyIcon1_MouseDown);
  // L'icône est affichée dans la barre de stâches
  NotifyIcon1.Visible:=True;

  DoitFermer := False;
End;

Procedure TForm1.FormDestroy(Sender: TObject);
Begin
  // L'instanc est créée sans propriétaire, donc ne pas
  // oublier de détruire l'instance.
  NotifyIcon1.Free;
End;

Procedure TForm1.MenuReduireClick(Sender: TObject);
Begin
  // L'option réduire permet de ... réduire la fenêtre !
  WindowState:=wsMinimized;
End;

Procedure TForm1.MenuRestaurerClick(Sender: TObject);
Begin
  // L'option restaurer permet de ... restaurer la fenêtre !
  WindowState:=wsNormal;
End;

Procedure TForm1.MenuFermerClick(Sender: TObject);
Begin
  // Il faut autoriser la feremeture cette fois-ci
  DoitFermer:=True;
  // et fermer la fenêtre
  Close
End;

Procedure TForm1.FormCloseQuery(Sender: TObject; Var CanClose: Boolean);
Begin
  // On teste si la fermeture de la fenêtre doit être effective
  If Not DoitFermer Then
  Begin
    // Dans le cas contraire, on se contente de réduire l'application
    CanClose:=False;
    WindowState:=wsMinimized;
  End;
End;

Procedure TForm1.NotifyIcon1_MouseDown(sender: TObject;
  e: System.Windows.Forms.MouseEventArgs);
Begin
  // Dans le cas d'un click gauche, on lance le timer pour
  // différencier le click, d'un double-click.
  If e.Button=System.Windows.Forms.MouseButtons.Left Then
    Timer1.Enabled:=True;
  // Dans le cas d'un click droit on affiche le menu. Le menu
  // contextuel ne peut pas être associé directement au NotifyIcon
  // car c'est un menu VCL et non WinForm. C'est pour cela qu'il
  // est affiché manuellement.
  If e.Button=System.Windows.Forms.MouseButtons.Right Then
    PopUpMenu1.Popup(Mouse.CursorPos.X,Mouse.CursorPos.Y);
End;

Procedure TForm1.NotifyIcon1_DoubleClick(sender: TObject;
  e: System.EventArgs);
Begin
  // Dans le cas d'un double-click, on arrête le timer lancé par le premier
  // click et on effectue l'action par défaut.
  Timer1.Enabled:=False;
  MenuRestaurerClick(Nil);
End;

Procedure TForm1.Timer1Timer(Sender: TObject);
Begin
  // Si le timer s'est écoulé, c'est qu'il n'y a pas eu de double-click.
  // Dans ce cas on affiche le menu là ou est la souris.
  Timer1.Enabled:=False;
  PopUpMenu1.Popup(Mouse.CursorPos.X,Mouse.CursorPos.Y);
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 -