Accueil
Rechercher:
sur developpez.com sur les forums
Forums | Tutoriels | F.A.Q's | Participez | Hébergement | Contacts
Club Emploi Blogs   TV   Dév. Web PHP XML Python Autres 2D-3D-Jeux Sécurité Windows Linux PC Mac
Accueil Conception Java DotNET Visual Basic  C  C++ Delphi MS-Office SQL & SGBD Oracle  4D  Business Intelligence
FORUMS DELPHI F.A.Q DELPHI TUTORIELS DELPHI LIVRES COMPOSANTS SOURCES DEFI TELECHARGEZ DELPHI TV
Nono40.developpez.com
Le petit coin du web de Nono40
SOURCES ARTICLES NONOVISU ACCUEIL NOUVELLES
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 : miroir 1 , miroir 2 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 oeuvre intellectuelle protégée par les droits d'auteurs. 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'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts. Cette page est déposée à la SACD.

Responsables bénévoles de la rubrique Delphi : Bruno Guérangé et Pierre Rodriguez - Contacter par EMail :
Vos questions techniques : forum d'entraide Delphi - Publiez vos articles, tutoriels et cours
et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones
Nous contacter - Copyright © 2000-2008 www.developpez.com - Legal informations.