IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

API, COM et SDKs Delphi Discussion :

[D7] Affichage d'un message


Sujet :

API, COM et SDKs Delphi

  1. #1
    Membre Expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 613
    Par défaut [D7] Affichage d'un message
    Bonjour,
    est ce qu'il existe une fonction de l'API Windows (ou autre) pour afficher un message éphémère dans le coin en bas à droite de l'écran dans un rectangle coloré sans bordure ?

    Merci
    A+
    Charly

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 93
    Par défaut
    salut je n'ai plus D7 mais teste ça qui devrait fonctionner (si j'ai bien compris ce que tu cherche)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    // ajouter ShellAPI, Windows;
    procedure AfficherNotification(const ATitre, AMessage: string);
    var
      nid: TNotifyIconData;
    begin
      FillChar(nid, SizeOf(nid), 0);
      nid.cbSize := SizeOf(TNotifyIconData);
      nid.Wnd := Application.Handle;      // ou Form1.Handle
      nid.uID := 1;
      nid.uFlags := NIF_ICON or NIF_INFO or NIF_TIP;
      nid.hIcon := Application.Icon.Handle;
      nid.szTip := 'MonApplication';
     
      // Le texte de la bulle
      StrPLCopy(nid.szInfo, AMessage, SizeOf(nid.szInfo) - 1);
      StrPLCopy(nid.szInfoTitle, ATitre, SizeOf(nid.szInfoTitle) - 1);
      nid.dwInfoFlags := NIIF_INFO;       // NIIF_INFO / NIIF_WARNING / NIIF_ERROR
      nid.uTimeout := 5000;               // durée en ms (ignorée depuis Vista, gérée par l'OS)
     
      Shell_NotifyIcon(NIM_ADD, @nid);    // ajoute l'icône si pas déjà présente
      Shell_NotifyIcon(NIM_MODIFY, @nid); // déclenche la bulle
    end;
     
    procedure TForm20.Button1Click(Sender: TObject);
    begin
      AfficherNotification('Changement d''imprimante',
        'Nouvelle imprimante ImprimanteParDefaut');
    end;

  3. #3
    Membre Expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 613
    Par défaut
    Merci, je vais tester
    A+
    Charly

  4. #4
    Invité de passage
    Homme Profil pro
         ​​​  
    Inscrit en
    Décembre 2025
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité :      ​​​  

    Informations forums :
    Inscription : Décembre 2025
    Messages : 93
    Par défaut
    Un THintWindow personnalisé fonctionne mieux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
     
    procedure ShowTip(const Msg: string; Seconds: integer);
    implementation
     uses Themes;
     
    type
      TTipWindow = class(THintWindow)
      protected
        FTimer: Cardinal;
        procedure Paint; override;
        procedure WndProc(var Message: TMessage); override;
      end;
     
    { TTipWindow }
    const
       DefaultWidth = 200;
       BtnMargin = 20;
    procedure TTipWindow.Paint;
    var
      R,C: TRect;
      Details: TThemedElementDetails;
    begin
      R := ClientRect;
      Canvas.Font.Color := Screen.HintFont.Color;
      Canvas.Brush.Style:=bsClear;
     
      Details := ThemeServices.GetElementDetails(tttBaloonNormal);
      ThemeServices.DrawElement(Canvas.Handle, Details, R, nil);
      C := Bounds(R.Right - BtnMargin, R.Top, BtnMargin, BtnMargin);
     
      Details := ThemeServices.GetElementDetails(tttCloseNormal);
      ThemeServices.DrawElement(Canvas.Handle, Details, C, nil);
     
      Inc(R.Left, 4);
      Inc(R.Top, 4);
      Dec(R.Right, BtnMargin);
      DrawText(Canvas.Handle, PChar(Caption), -1, R, DT_LEFT or DT_NOPREFIX or
              DT_WORDBREAK or DrawTextBiDiModeFlagsReadingOnly);
    end;
     
    procedure TTipWindow.WndProc(var Message: TMessage);
    begin
      case Message.Msg of
           WM_NCHITTEST: DefaultHandler(Message);
       WM_MOUSEACTIVATE: Message.Result := MA_NOACTIVATE;
           WM_LBUTTONUP, WM_TIMER:begin
                if FTimer <>0 then
                   KillTimer(Handle, FTimer);
                FTimer := 0;
                ReleaseHandle();
           end;
       else
          inherited;
      end;
    end;
     
    procedure ShowTip(const Msg: string; Seconds: integer);
    var
     R: TRect;
     W: Integer;
    begin
       with TTipWindow.Create(nil) do
       try
         R := CalcHintRect(DefaultWidth,  Msg, nil);
         W := R.Right + BtnMargin+10;
         R := Bounds(Screen.WorkAreaWidth - W,
              Screen.WorkAreaHeight- R.Bottom-10, W, R.Bottom +4);
         ActivateHint(R, Msg);
         FTimer := Settimer(Handle,1, Seconds *1000,nil);
       except
          Free;
       end;
    end;
    Test:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ShowTip(memo1.Lines.Text, 8);

  5. #5
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 277
    Par défaut
    Citation Envoyé par papyvore Voir le message
    Shell_NotifyIcon

    Citation Envoyé par Charly910 Voir le message
    Merci, je vais tester
    A+
    Charly
    Euh ... tu ne l'avais pas déjà fait : Épingler une application Delphi dans la barre des tâches de Windows

    Avec NotifyIcon +NIIF_INFO+ NIN_BALLOONSHOW
    Avec D7, je recommande TTntTrayIcon qui gère le BalloonHint en UNICODE
    Voir aussi EM_SHOWBALLOONTIP


    En D7, cela n'existe pas c'est TBalloonHint mais il y avait le TCoolTrayIcon (sur Phidels, on ne trouve plus de version compatible D7 maintenant)

    Cela se fait avec une TForm ou une THintWindows (le code Informt2025 n'est pas D7, faut au moins XE2 vu le code basé sur les styles)

    Par exemple : ICI Hint avec lien



    Tu peux étudier ce code joint en zip, le THMLCredit se replace par un TStaticText transparent
    Ballon.zip
    C'est garanti D6 et D7, ça date de 2005-2007, c'est lié à code sur le forum
    Cela avait deux objectifs, ajouter un Hint dans un NotifyIcon mais aussi afficher un Hint sur un control disabled (ce qui n'existe pas)

    Une chose à améliorer dans le code fourni serait l'ajout d'un CreateParams + WS_EX_NOACTIVATE
    Aide via F1 - Utilisez l'I.A. - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité ! Sachez-le : l'IA remplace la très grande majorité des développeurs, pas seulement les ignares ...

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  6. #6
    Invité de passage
    Homme Profil pro
         ​​​  
    Inscrit en
    Décembre 2025
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité :      ​​​  

    Informations forums :
    Inscription : Décembre 2025
    Messages : 93
    Par défaut
    Cela se fait avec une TForm ou une THintWindows
    Oui c'est possible avec une TForm j'avais fait les deux versions, pour l'affichage de TForm il ne faut pas appeler Show mais SetWindowPos avec SWP_NOACTIVATE or SWP_SHOWWINDOW
    (le code Informt2025 n'est pas D7, faut au moins XE2 vu le code basé sur les styles)
    Le code a été développé et testé sous D7 l'unité Themes existe dans cette version, la raison pour laquelle j'ai utilisé c'est que D7 applique partiellement les thèmes pour THindWindow uniquement les bordures.

  7. #7
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 277
    Par défaut
    Citation Envoyé par Informt2025 Voir le message
    Le code a été développé et testé sous D7 l'unité Themes existe dans cette version, la raison pour laquelle j'ai utilisé c'est que D7 applique partiellement les thèmes pour THindWindow uniquement les bordures.
    Eh ben ! C'est surprenant !

    Une unité surement bien cachée, surement lié aux nouvelles API à la sortie de Windows XP (dans UxThemes) et les possibilités offertes par la nouvelle version des Common Controls activée par le TXPManifest (cela changeait par exemple la couleur de fond du TTabSheet, cela m'aurait simplifié la vie si j'avais su que ThemeServices existait déjà en D7 Et dire que j'utilisais encore DrawFrameControl en D7 alors qu'un simple DrawElement aurait suffit sur WinXP )

    Je n'ai découvert ThemeServices qu'en XE2 - VER230 (Compilateur 23.0, VCL 160, Delphi RAD 9.0) Pulsar
    J'ignorais que cela existait déjà en D7 - VER150 (Compilateur 15.0, VCL 70) - Aurora

    Du coup, le code de Informt2025, Charly910, si vous souhaitez l'utiliser, l'unité XPMan doit être inclus au projet D7.
    Aide via F1 - Utilisez l'I.A. - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité ! Sachez-le : l'IA remplace la très grande majorité des développeurs, pas seulement les ignares ...

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  8. #8
    Membre Expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 613
    Par défaut
    Merci à tous,
    je suis en train de faire des essais avec tout ça, mis je n'avance pas vite

    (j'essaye de reproduire les notifications Toast de Windows 10)

    A+
    Charly

  9. #9
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 277
    Par défaut
    En Delphi 10, c'est natif (en pourtant il a déjà 10 ans) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure TForm1.Button1Click(Sender: TObject);
    var
      MyNotification: TNotification;
    begin
      MyNotification := NotificationCenter1.CreateNotification;
      try
        MyNotification.Name := 'Notification ID';
        MyNotification.Title := 'Reproduire les notifications Toast de Windows 10';
        MyNotification.AlertBody := 'Charly910 va galérer en D7 ';
        NotificationCenter1.PresentNotification(MyNotification);
      finally
        MyNotification.Free;
      end;
    end;
    Nom : Sans titre.png
Affichages : 52
Taille : 87,9 Ko


    Faudrait creuser la dépendance API Windows : Marco Cantu Tech Blog - Windows 10 Notifications from a VCL app with the WinRT API et How to create toast notification in delphi with ToastGeneric
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
      // DualAPI Interface
      // Windows.UI.Notifications.IToastNotification
      [WinRTClassNameAttribute(SToastNotification)]
      IToastNotification = interface(IInspectable)
      ['{997E2675-059E-4E60-8B06-1760917C8B80}']
        function get_Content: Xml_Dom_IXmlDocument; safecall;
        procedure put_ExpirationTime(value: IReference_1__DateTime); safecall;
        function get_ExpirationTime: IReference_1__DateTime; safecall;
        function add_Dismissed(handler: TypedEventHandler_2__IToastNotification__IToastDismissedEventArgs): EventRegistrationToken; safecall;
        procedure remove_Dismissed(cookie: EventRegistrationToken); safecall;
        function add_Activated(handler: TypedEventHandler_2__IToastNotification__IInspectable): EventRegistrationToken; safecall;
        procedure remove_Activated(cookie: EventRegistrationToken); safecall;
        function add_Failed(handler: TypedEventHandler_2__IToastNotification__IToastFailedEventArgs): EventRegistrationToken; safecall;
        procedure remove_Failed(token: EventRegistrationToken); safecall;
        property Content: Xml_Dom_IXmlDocument read get_Content;
        property ExpirationTime: IReference_1__DateTime read get_ExpirationTime write put_ExpirationTime;
      end;
     
      // DualAPI Interface
      // Windows.UI.Notifications.IToastNotifier
      [WinRTClassNameAttribute(SToastNotifier)]
      IToastNotifier = interface(IInspectable)
      ['{75927B93-03F3-41EC-91D3-6E5BAC1B38E7}']
        procedure Show(notification: IToastNotification); safecall;
        procedure Hide(notification: IToastNotification); safecall;
        function get_Setting: NotificationSetting; safecall;
        procedure AddToSchedule(scheduledToast: IScheduledToastNotification); safecall;
        procedure RemoveFromSchedule(scheduledToast: IScheduledToastNotification); safecall;
        function GetScheduledToastNotifications: IVectorView_1__IScheduledToastNotification; safecall;
        property Setting: NotificationSetting read get_Setting;
      end;


    Si tu veux vraiment refaire les notifications Toast de Windows 10, avec l'enregistrement des notifications des paramètres > système > notification, tu vas galérer.
    Trouver les déclarations des interfaces compatibles D7, ça va être compliqué.

    Si tu veux juste l'afichage d'une Toast Form ou Ballon Hint, je ne vois pas ce qui peut poser problème, c'est comme un Hint juste localiser en dehors de l'application, j'ai fait ce genre de fenêtre en D7, BCBXE3, DXE3 et plus récemment en D10, pour afficher du texte mis en forme, avant en RTF puis HTML et plus récemment du Markdown.
    Aide via F1 - Utilisez l'I.A. - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité ! Sachez-le : l'IA remplace la très grande majorité des développeurs, pas seulement les ignares ...

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  10. #10
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 277
    Par défaut
    Je n'ai pas D7 mais j'ai déjà un chose similaire en BCBXE3, je ne sais plus comme était géré TransparentColor\TransparentColorValue en D7 (je crois que c'est peut-être apparu en D7 grace à XP)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TForm1.Button2Click(Sender: TObject);
    begin
      TForm2.ShowToast('Reproduire les notifications Toast de Windows 10', 'Simple TForm en D7')
    end;
    Nom : Sans titre.png
Affichages : 50
Taille : 77,1 Ko
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    unit Unit2;
     
    interface
     
    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
      Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.Buttons, Vcl.StdCtrls;
     
    type
      TForm2 = class(TForm)
        Shape1: TShape;
        Label1: TLabel;
        Label2: TLabel;
        SpeedButton1: TSpeedButton;
        Timer1: TTimer;
        procedure Timer1Timer(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
        class procedure ShowToast(const ATitle, ACaption: string; ADelay: Cardinal = 5000);
      end;
     
    implementation
     
    {$R *.dfm}
     
    class procedure TForm2.ShowToast(const ATitle, ACaption: string; ADelay: Cardinal = 5000);
    begin
      with Self.Create(nil) do
      begin
        Label1.Caption := ATitle;
        Label2.Caption := ACaption;
     
        Width := Label1.Width + Label1.Left * 2 + SpeedButton1.Width;
        Left := Monitor.WorkareaRect.Width - Width - 10 ;
        Top := Monitor.WorkareaRect.Height - Height;
     
        Timer1.Interval := ADelay;
        Timer1.Enabled := True;
     
        Show();
      end;
    end;
     
    procedure TForm2.Timer1Timer(Sender: TObject);
    begin
      Close();
    end;
     
    procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      Action := caFree;
    end;
    Code dfm : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
     
    object Form2: TForm2
      Left = 0
      Top = 0
      BorderStyle = bsNone
      Caption = 'Form2'
      ClientHeight = 123
      ClientWidth = 549
      Color = clFuchsia
      TransparentColor = True
      TransparentColorValue = clFuchsia
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -11
      Font.Name = 'Tahoma'
      Font.Style = []
      OldCreateOrder = False
      OnClose = FormClose
      DesignSize = (
        549
        123)
      PixelsPerInch = 96
      TextHeight = 13
      object Shape1: TShape
        Left = 0
        Top = 0
        Width = 549
        Height = 123
        Align = alClient
        Brush.Color = clMoneyGreen
        Shape = stRoundRect
        ExplicitWidth = 651
        ExplicitHeight = 169
      end
      object Label1: TLabel
        Left = 16
        Top = 8
        Width = 37
        Height = 13
        Caption = 'Label1'
        Font.Charset = DEFAULT_CHARSET
        Font.Color = clWindowText
        Font.Height = -11
        Font.Name = 'Tahoma'
        Font.Style = [fsBold]
        ParentFont = False
      end
      object Label2: TLabel
        Left = 16
        Top = 27
        Width = 525
        Height = 88
        Anchors = [akLeft, akTop, akRight, akBottom]
        AutoSize = False
        Caption = 'Label2'
      end
      object SpeedButton1: TSpeedButton
        Left = 518
        Top = 8
        Width = 23
        Height = 22
        Anchors = [akTop, akRight]
        Flat = True
        Glyph.Data = {
          36030000424D3603000000000000360000002800000010000000100000000100
          18000000000000030000120B0000120B00000000000000000000FF00FFFF00FF
          FF00FFFF00FFFF00FFB9B8B8BABABAB3B2B2B3B2B2BAB9B9B9B8B8FF00FFFF00
          FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFB3B2B2BCBABAD8D5D5D6D2D2CE
          CACAC9C4C4C4BEBEBCB6B6B4B2B2B3B2B2FF00FFFF00FFFF00FFFF00FFFF00FF
          AAA9A9DDDCDCD8D6DF817FBD4E4DC16B6BD96A6AD25151C68582B8C0BBBBB7B2
          B2AAA9A9FF00FFFF00FFFF00FFB4B3B3EEEEEEBBB8D42B2BC55A5AED9393F6A9
          A9F8ABABF89393F75555EF302EC0B0ABB6B8B3B3B3B2B2FF00FFFF00FFC8C7C7
          E0DFE62222BD3C3CD63E3EB24848C38C8CF58D8DF54949C33F3FB23F3FD92929
          BCC4BFBFB5B3B3FF00FFCBCACAECECEC7D7CC92929D35959BCCACACAACACC73A
          3ABC3B3BBCACACC7CACACA5555B82020D57472B8C2BDBDCCCBCBC5C4C4E4E3E3
          1F1FBD2323BA2626B1ACACC7C6C6C6B0B0CAB0B0CAC6C6C6ACACC72424AE2323
          BF2A2AB7CCC8C8C2C2C2B9B8B8CFCECE1313C21212A91E1EB82020ABAFAFCACE
          CECECECECEAFAFCA2121AB1F1FBA1414AC0505B4D3CFCFB4B3B3B9B8B8CCCBCB
          7777D66868D93838CA2020ABC7C7E1E9E9E9E9E9E9C7C7E12121AB3D3DCB6E6E
          DC4747C8D9D6D6B4B3B3BBBABAD6D6D67676CA8383DF3939B6CFCFEAFEFEFECF
          CFEACFCFEAFEFEFECFCFEA3535B28B8BE17B7AC2E4E1E1BABABAB8B8B8D5D5D5
          9291C5A1A1E67F7FCAFEFEFECFCFEA4242BF4242BFCFCFEAFEFEFE7878C6A2A2
          E78382BBE6E5E5B9B8B8FF00FFBEBEBEC5C5CE8484D08484D47979C66D6DCF7E
          7EDB7E7EDB6868CC7979C68787D68181C7E5E4EDBEBEBEFF00FFFF00FFB3B2B2
          D3D3D3C4C4CB8E8ED3B4B4E8A9A9E3A2A2E1A3A3E1ACACE4B5B5E8908FCDBDBC
          D6EDEDEDB4B3B3FF00FFFF00FFFF00FFACACACD3D3D3D3D3D8B7B6D7A8A8DC9E
          9EDA9D9DDAA4A3DBAFAED6E1E1E6E7E7E7ACABABFF00FFFF00FFFF00FFFF00FF
          FF00FFB3B2B2C2C1C1D4D4D4D9D9D9DFDEDEE0E0E0E3E3E3E3E3E3C5C5C5B4B3
          B3FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFC2C1C1BEBDBDB4
          B3B3B4B3B3BDBCBCC2C1C1FF00FFFF00FFFF00FFFF00FFFF00FF}
      end
      object Timer1: TTimer
        OnTimer = Timer1Timer
        Left = 200
        Top = 48
      end
    end
    Aide via F1 - Utilisez l'I.A. - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité ! Sachez-le : l'IA remplace la très grande majorité des développeurs, pas seulement les ignares ...

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  11. #11
    Membre Expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 613
    Par défaut
    Merci à tous pour vos suggestions. Après moult essais, j'ai opté pour une Form sans bords. Voici le résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    unit WinToast;
    { Affichage d'un simili Toast Notify de W10    -   Charly910
      Utilisation :
        ShowMessageTemporaire(Titre, Message, Durée en ms, Mode, CoinsRonds);
          Si Durée = 0 : affichage permanent fermeture avec la croix
          Mode : Clair (défaut) ou sombre
          Coinds rounds si CoinsRonds = True
     
          La fenêtre s'ajuste en fonction des longueurs de Titre et Message
    }
    interface
     
    uses
    Windows, Forms, Classes, Controls, Graphics, ExtCtrls, StdCtrls;
     
    Type
         TMode = (Clair, Sombre) ;
     
    procedure ShowMessageTemporaire(const Titre, Texte: string; Duree: Integer;
                                    Mode : TMode = Clair; CoinsRonds : Boolean = True );
     
    implementation
     
    { BMP 17 x 17 }
     
    const
      IconData: array[0..937] of Byte = (
        $42, $4D, $AA, $03, $00, $00, $00, $00, $00, $00, $36, $00, $00, $00, $28, $00,
        $00, $00, $11, $00, $00, $00, $11, $00, $00, $00, $01, $00, $18, $00, $00, $00,
        $00, $00, $74, $03, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
        $00, $00, $00, $00, $00, $00, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F,
        $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F,
        $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F,
        $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $00, $1F, $1F, $1F, $1F, $1F, $1F,
        $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F,
        $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F,
        $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $00, $1F, $1F,
        $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F,
        $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F,
        $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F,
        $1F, $00, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $D4, $D4, $D4, $D0, $D0,
        $D0, $D0, $D0, $D0, $D0, $D0, $D0, $D0, $D0, $D0, $A3, $A3, $A3, $1F, $1F, $1F,
        $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F,
        $1F, $1F, $1F, $1F, $1F, $00, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $AC,
        $AC, $AC, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $C0, $C0,
        $C0, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F,
        $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $00, $1F, $1F, $1F, $1F, $1F, $1F,
        $1F, $1F, $1F, $AC, $AC, $AC, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F,
        $1F, $1F, $C0, $C0, $C0, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F,
        $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $00, $1F, $1F,
        $1F, $1F, $1F, $1F, $1F, $1F, $1F, $AC, $AC, $AC, $1F, $1F, $1F, $1F, $1F, $1F,
        $1F, $1F, $1F, $1F, $1F, $1F, $C0, $C0, $C0, $1F, $1F, $1F, $1F, $1F, $1F, $1F,
        $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F,
        $1F, $00, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $AC, $AC, $AC, $1F, $1F,
        $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $C0, $C0, $C0, $1F, $1F, $1F,
        $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F,
        $1F, $1F, $1F, $1F, $1F, $00, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $E8,
        $E8, $E8, $C0, $C0, $C0, $C0, $C0, $C0, $C0, $C0, $C0, $C0, $C0, $C0, $ED, $ED,
        $ED, $C0, $C0, $C0, $C0, $C0, $C0, $C0, $C0, $C0, $C0, $C0, $C0, $A3, $A3, $A3,
        $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $00, $1F, $1F, $1F, $1F, $1F, $1F,
        $1F, $1F, $1F, $AC, $AC, $AC, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F,
        $1F, $1F, $C0, $C0, $C0, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F,
        $1F, $D0, $D0, $D0, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $00, $1F, $1F,
        $1F, $1F, $1F, $1F, $1F, $1F, $1F, $AC, $AC, $AC, $1F, $1F, $1F, $1F, $1F, $1F,
        $1F, $1F, $1F, $1F, $1F, $1F, $C0, $C0, $C0, $1F, $1F, $1F, $1F, $1F, $1F, $1F,
        $1F, $1F, $1F, $1F, $1F, $D0, $D0, $D0, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F,
        $1F, $00, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $AC, $AC, $AC, $1F, $1F,
        $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $C0, $C0, $C0, $1F, $1F, $1F,
        $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $D0, $D0, $D0, $1F, $1F, $1F, $1F,
        $1F, $1F, $1F, $1F, $1F, $00, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $AC,
        $AC, $AC, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $C0, $C0,
        $C0, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $D0, $D0, $D0,
        $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $00, $1F, $1F, $1F, $1F, $1F, $1F,
        $1F, $1F, $1F, $E0, $E0, $E0, $AC, $AC, $AC, $AC, $AC, $AC, $AC, $AC, $AC, $AC,
        $AC, $AC, $E8, $E8, $E8, $AC, $AC, $AC, $AC, $AC, $AC, $AC, $AC, $AC, $AC, $AC,
        $AC, $D4, $D4, $D4, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $00, $1F, $1F,
        $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F,
        $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F,
        $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F,
        $1F, $00, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F,
        $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F,
        $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F,
        $1F, $1F, $1F, $1F, $1F, $00, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F,
        $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F,
        $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F,
        $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $00
      );
     
    { Transparence : couleur du pixel (0,0) }
      IconTransparentColor = $1F1F1F;
     
     
    Type
      TTempMessage = class(TForm)
      private
        Timer: TTimer;
        ImgIcon: TImage;
        LabelTitre: TLabel;
        LabelMessage: TLabel;
        LabelFermer: TLabel;
        FMode : TMode ;
        procedure FermerClick(Sender: TObject);
        procedure FermerMouseEnter(Sender: TObject);
        procedure FermerMouseLeave(Sender: TObject);
        procedure TimerTimer(Sender: TObject);
        procedure SetRoundCorners;
        procedure LoadEmbeddedIcon(const Data; Size: Integer; Image: TImage);
     
        procedure AdjustLayout;
    //    function CalcLabelHeight(ALabel: TLabel): Integer;
      public
        constructor Create(AOwner: TComponent); override;
      end;
     
    { =========================================================== }
    procedure TTempMessage.LoadEmbeddedIcon(const Data; Size: Integer; Image: TImage);
    // Chargement de l'icone
    var
      MS: TMemoryStream;
    begin
      MS := TMemoryStream.Create;
      try
        MS.WriteBuffer(Data, Size);
        MS.Position := 0;
        Image.Picture.Bitmap.LoadFromStream(MS);
      finally
        MS.Free;
      end;
    end;
    { =========================================================== }
    {function TTempMessage.CalcLabelHeight(ALabel: TLabel): Integer;
    // Calcul de la hauteur d'un Label
    var
      R: TRect;
      Flags: Cardinal;
    begin
      R.Left := 0;
      R.Top := 0;
      R.Right := ALabel.Width;
      R.Bottom := 0;
      Flags := DT_WORDBREAK or DT_CALCRECT;
      DrawText(ALabel.Canvas.Handle, PChar(ALabel.Caption), Length(ALabel.Caption),
                                           R, Flags);
      Result := R.Bottom - R.Top;
      if Result < ALabel.Font.Height then
        Result := ALabel.Font.Height;
    end;     }
    { =========================================================== }
    procedure TTempMessage.AdjustLayout;
    const
      MargeHaut = 20;
      MargeBas = 15;
      EspaceTitreMessage = 5;
    var
      R: TRect;
      HTitre: Integer;
      HMessage: Integer;
      LargeurTexte: Integer;
    begin
      { Largeur réellement disponible pour le texte }
      LargeurTexte := Width - LabelMessage.Left - 25;
      {--------------------------------------------------}
      { Calcul de la hauteur du Titre                   }
      {--------------------------------------------------}
      R.Left := 0;
      R.Top := 0;
      R.Right := LargeurTexte;
      R.Bottom := 0;
      Canvas.Font.Assign(LabelTitre.Font);
      DrawText(
      Canvas.Handle,
      PChar(LabelTitre.Caption),
      Length(LabelTitre.Caption), R, DT_WORDBREAK or DT_CALCRECT);
      HTitre := R.Bottom - R.Top;
      { Hauteur minimale du titre }
      if HTitre < LabelTitre.Font.Height then
        HTitre := LabelTitre.Font.Height;
      {--------------------------------------------------}
      { Position et hauteur du Titre                   }
      {--------------------------------------------------}
      LabelTitre.Left := 40;
      LabelTitre.Top := MargeHaut;
      LabelTitre.Width := LargeurTexte;
      LabelTitre.Height := HTitre;
      {--------------------------------------------------}
      { Position du Message                            }
      {--------------------------------------------------}
      LabelMessage.Left := 40;
      LabelMessage.Top :=
      LabelTitre.Top +
      LabelTitre.Height +
      EspaceTitreMessage;
      LabelMessage.Width := LargeurTexte;
      {--------------------------------------------------}
      { Calcul de la hauteur du Message                }
      {--------------------------------------------------}
      R.Left := 0;
      R.Top := 0;
      R.Right := LabelMessage.Width;
      R.Bottom := 0;
      Canvas.Font.Assign(LabelMessage.Font);
      DrawText(Canvas.Handle, PChar(LabelMessage.Caption), Length(LabelMessage.Caption),
               R, DT_WORDBREAK or DT_CALCRECT);
      HMessage := R.Bottom - R.Top;
      { Hauteur minimale du message }
      if HMessage < LabelMessage.Font.Height then
        HMessage := LabelMessage.Font.Height;
      LabelMessage.Height := HMessage;
      {--------------------------------------------------}
      { Hauteur finale de la fenêtre                     }
      {--------------------------------------------------}
      Height := LabelMessage.Top + LabelMessage.Height + MargeBas;
      { Hauteur minimale éventuelle }
      if Height < 60 then Height := 60;
    end;
    { =========================================================== }
    constructor TTempMessage.Create(AOwner: TComponent);
    begin
      inherited CreateNew(AOwner);
      BorderStyle := bsNone;
      FormStyle := fsStayOnTop;
      Position := poDesigned;
      Color := RGB(245, 245, 245);
      Width := 360;
      Height := 120;
      {--------------------------------------------------}
      { Icône                                             }
      {--------------------------------------------------}
      ImgIcon := TImage.Create(Self);
      ImgIcon.Parent := Self;
      ImgIcon.Left := 16;
      ImgIcon.Top := 18;
      ImgIcon.Width := 17;
      ImgIcon.Height := 17;
      ImgIcon.AutoSize := False;
      ImgIcon.Stretch := False;
      ImgIcon.Center := False;
      ImgIcon.Transparent := True;
      ImgIcon.Picture.Bitmap.TransparentColor :=
      IconTransparentColor;
      LoadEmbeddedIcon(IconData, SizeOf(IconData), ImgIcon);
     
      {--------------------------------------------------}
      { Croix de fermeture                                }
      {--------------------------------------------------}
      LabelFermer := TLabel.Create(Self);
      LabelFermer.Parent := Self;
      LabelFermer.Left := Width - 32;
      LabelFermer.Top := 5;
      LabelFermer.Width := 24;
      LabelFermer.Height := 24;
      LabelFermer.AutoSize := False;
      LabelFermer.Alignment := taCenter;
      LabelFermer.Layout := tlCenter;
      LabelFermer.Caption := '×';
      LabelFermer.Font.Name := 'Segoe UI';
      LabelFermer.Font.Size := 18;
      LabelFermer.Font.Color := RGB(100, 100, 100);
      LabelFermer.Transparent := True;
      LabelFermer.Cursor := crHandPoint;
      LabelFermer.OnClick := FermerClick;
      LabelFermer.OnMouseEnter := FermerMouseEnter;
      LabelFermer.OnMouseLeave := FermerMouseLeave;
     
     
      {--------------------------------------------------}
      { Mode Clair ou sombre                                             }
      {--------------------------------------------------}
      FMode := Clair ;
     
      {--------------------------------------------------}
      { Titre                                             }
      {--------------------------------------------------}
      LabelTitre := TLabel.Create(Self);
      LabelTitre.Parent := Self;
      LabelTitre.Left := 40;
      LabelTitre.Top := 15;
      LabelTitre.Width := Width - 75;
      LabelTitre.Height := 30;
      LabelTitre.AutoSize := False;
      LabelTitre.Alignment := taLeftJustify;
      LabelTitre.Layout := tlTop;
      LabelTitre.WordWrap := True;
      LabelTitre.Font.Name := 'Segoe UI';
      LabelTitre.Font.Size := 12;
      LabelTitre.Font.Color := RGB(32, 32, 32);
      LabelTitre.Transparent := True;
      {--------------------------------------------------}
      { Message                                           }
      {--------------------------------------------------}
      LabelMessage := TLabel.Create(Self);
      LabelMessage.Parent := Self;
      LabelMessage.Left := 40;
      LabelMessage.Top := 40;
      LabelMessage.Width := Width - 55;
      LabelMessage.Height := Height - 50;
      LabelMessage.AutoSize := False;
      LabelMessage.Alignment := taLeftJustify;
      LabelMessage.Layout := tlTop;
      LabelMessage.WordWrap := True;
      LabelMessage.Font.Name := 'Segoe UI';
      LabelMessage.Font.Size := 12;
      LabelMessage.Font.Color := RGB(32, 32, 32);
      LabelMessage.Transparent := True;
      {--------------------------------------------------}
      { Timer                                             }
      {--------------------------------------------------}
      Timer := TTimer.Create(Self);
      Timer.Enabled := False;
      Timer.OnTimer := TimerTimer;
    end;
    { =========================================================== }
    procedure TTempMessage.SetRoundCorners;
    { Coins arrondis de 10 pixels }
    begin
      SetWindowRgn(Handle, CreateRoundRectRgn(0, 0, Width + 1, Height + 1, 20, 20), True);
    end;
    { =========================================================== }
    procedure TTempMessage.FermerClick(Sender: TObject);
    begin
      Timer.Enabled := False;
      { Fermeture de la fenêtre }
      Release;
    end;
    { =========================================================== }
    procedure TTempMessage.FermerMouseEnter(Sender: TObject);
    begin
      LabelFermer.Font.Color := RGB(40, 40, 40);
      LabelFermer.Font.Color := RGB(0,0,0);
    //  LabelFermer.Font.Color := ClRed ;
     
      If FMode = Sombre Then
        LabelFermer.Font.Color := RGB(255, 255, 255);
    end;
    { =========================================================== }
    procedure TTempMessage.FermerMouseLeave(Sender: TObject);
    begin
      LabelFermer.Font.Color := RGB(100, 100, 100);
    end;
    { =========================================================== }
    procedure TTempMessage.TimerTimer(Sender: TObject);
    begin
      Timer.Enabled := False;
      { Libération de la fenêtre }
      Release;
    end;
    { =========================================================== }
    procedure ShowMessageTemporaire(const Titre, Texte: string; Duree: Integer;
                                    Mode : TMode = Clair; CoinsRonds : Boolean = True );
    {  Affichage de la notification pendant Duree en ms, mode Sombre ou Clair, Coins arrondis ou non }
    { Duree = 0 : Affichage permanent, fermeture avec la croix }                                 
    var
      F: TTempMessage;
      R: TRect;
    begin
      F := TTempMessage.Create(nil);
      try
        { Mode sombre ou clair }
        F.FMode := Mode ;
        If Mode = Sombre Then
          Begin
            F.Color := RGB(31, 31, 31) ;
            F.LabelTitre.Font.Color := RGB(180, 180, 180) ;
            F.LabelMessage.Font.Color := RGB(180, 180, 180) ;
          End ;
        { Affectation des textes }
        F.LabelTitre.Caption := Titre;
        F.LabelMessage.Caption := Texte;
        { Calcul automatique des hauteurs et de la hauteur totale de la fenêtre }
        F.AdjustLayout;
        { Zone de travail Windows }
        SystemParametersInfo(SPI_GETWORKAREA, 0, @R, 0);
        { Position en bas à droite }
        F.Left := R.Right - F.Width - 1;
        F.Top := R.Bottom - F.Height - 1;
        { Coins arrondis }
        If CoinsRonds Then F.SetRoundCorners;
        { Durée d'affichage }
        F.Timer.Interval := Duree;
        F.Timer.Enabled := True;
        { Affichage }
        F.Show;
        F.Update;
      except
        F.Free;
      raise;
      end;
    end;
    { =========================================================== }
     
    end.
    A+
    Charly

    PS: bien sûr on peut aussi mettre l'icone en ressource

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Affichage d'un message avec "Alert"
    Par lodan dans le forum Général JavaScript
    Réponses: 14
    Dernier message: 30/07/2006, 15h18
  2. Affichage d'un message
    Par jmde dans le forum Access
    Réponses: 2
    Dernier message: 02/07/2006, 21h25
  3. [Débutant][Oracle 9.i]Affichage d'un message
    Par snoopy69 dans le forum Oracle
    Réponses: 3
    Dernier message: 12/06/2006, 10h15
  4. Probleme d'affichage de mon message
    Par zorba49 dans le forum ASP
    Réponses: 2
    Dernier message: 14/03/2006, 11h10
  5. Supprimer l'affichage d'un message d'erreur
    Par delphineleclerc1 dans le forum Access
    Réponses: 2
    Dernier message: 23/02/2006, 09h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo