 |
|
 |
|
 |
79 - CLASSE NOTIFYICON AVEC VCL.NET
|
|
|
|
PRÉSENTATION :
Utilisation de la classe NotifyIcon dans une application VCL.NET.
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.
|