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
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
Mon site : http://lapaille.byethost24.com/index.htm
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;
Merci, je vais tester
A+
Charly
Mon site : http://lapaille.byethost24.com/index.htm
Un THintWindow personnalisé fonctionne mieux :
Test:
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;
Code : Sélectionner tout - Visualiser dans une fenêtre à part ShowTip(memo1.Lines.Text, 8);
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
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_SHOWWINDOWCela se fait avec une TForm ou une THintWindows
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.(le code Informt2025 n'est pas D7, faut au moins XE2 vu le code basé sur les styles)
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 D7Et 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
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
Mon site : http://lapaille.byethost24.com/index.htm
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;
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
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;
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
Merci à tous pour vos suggestions. Après moult essais, j'ai opté pour une Form sans bords. Voici le résultat :
A+
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.
Charly
PS: bien sûr on peut aussi mettre l'icone en ressource
Mon site : http://lapaille.byethost24.com/index.htm
Partager