1
0

galeNotice.pas 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586
  1. unit galeNotice;
  2. interface
  3. uses
  4. System.Math.Vectors, FMX.Effects, FMX.Objects, FMX.Controls, FMX.Types, System.Generics.Collections,
  5. System.Types, System.Classes, FMX.Graphics, FMX.Forms, FMX.Ani, System.SysUtils, System.UITypes, System.Math;
  6. type
  7. TPlaceKind = (pkNone, pkLeftTop, pkTopCenter, pkRightTop, pkLeftBottom, pkBottomCenter, pkRightBottom);
  8. THanPos = (hpNone, hpTop, hpLeft, hpBottom, hpRight);
  9. TIconKind = (ikNone, ikInfo, ikSuccess, ikWarn, ikError, ikMail, ikQuestion);
  10. TNoticeInfo = record
  11. private type
  12. TNIText = record
  13. Value: string;
  14. FontColor: TAlphaColor;
  15. Font: record
  16. Family: string;
  17. Size: single;
  18. Style: TFontStyles;
  19. end;
  20. end;
  21. public
  22. Title: TNIText;
  23. Text: TNIText;
  24. Icon: TIconKind;
  25. PlaceKind: TPlaceKind;
  26. Pos: TPointF;
  27. BackColor: TAlphaColor;
  28. BorderColor: TAlphaColor;
  29. HanPos: THanPos;
  30. Shadow: single;
  31. Delay: single;
  32. CloseBtn: boolean;
  33. public
  34. procedure Init(AText: string = ''; ATitle: string = '消息'; AIcon: TIconKind = ikNone);
  35. end;
  36. TGaleNotice = class(TForm)
  37. private
  38. class var HindWins: TObjectList<TGaleNotice>;
  39. public
  40. class var DefFormPadding: single;
  41. class var DefGap: single;
  42. class var DefMargin: single;
  43. class var DefIconWidth: single;
  44. class var DefIconHeight: single;
  45. class var DefCalloutLen: single;
  46. class var DefHideDelay: single;
  47. class var DefMaxWidth: single;
  48. class var DefMinWidth: single;
  49. class var DefPlaceKind: TPlaceKind;
  50. class var DefShadow: single;
  51. class var DefColseBtn: boolean;
  52. class procedure RePlace;
  53. public
  54. class procedure ShowHint(const AInfo: TNoticeInfo);
  55. class procedure Info(AText: string; ATitle: string = '信息');
  56. class procedure Success(AText: string; ATitle: string = '成功');
  57. class procedure Warn(AText: string; ATitle: string = '警告');
  58. class procedure Error(AText: string; ATitle: string = '错误');
  59. private
  60. FNI: TNoticeInfo;
  61. FCalloutRectangle: TCalloutRectangle;
  62. ShadowEffect: TShadowEffect;
  63. FloatAnimation: TFloatAnimation;
  64. FTitleHeight: single;
  65. FCloseRect: TRectF;
  66. procedure SetCalloutPos(const ATPointF: TPointF);
  67. procedure OnCalloutRectangleClick(Sender: TObject);
  68. procedure OnCalloutRectangleEnter(Sender: TObject);
  69. procedure OnCalloutRectangleLeave(Sender: TObject);
  70. procedure OnCalloutRectanglePaint(Sender: TObject; Canvas: TCanvas; const ARect: TRectF);
  71. procedure OnFloatAnimationFinish(Sender: TObject);
  72. procedure SetNI(const AValue: TNoticeInfo);
  73. public
  74. property NI: TNoticeInfo read FNI write SetNI;
  75. public
  76. constructor Create(AOwner: TComponent); override;
  77. end;
  78. toastr = TGaleNotice;
  79. implementation
  80. { TNoticeInfo }
  81. // ==============================================================================
  82. // 消息显示参数
  83. // ==============================================================================
  84. procedure TNoticeInfo.Init(AText: string; ATitle: string; AIcon: TIconKind);
  85. begin
  86. Text.Value := AText;
  87. Text.FontColor := $FFFFFFFF;
  88. Text.Font.Family := 'Microsoft YaHei UI';
  89. Text.Font.Size := 12.0;
  90. Text.Font.Style := [];
  91. Title.Value := ATitle;
  92. Title.FontColor := $FFFFFFFF;
  93. Title.Font.Family := 'Microsoft YaHei UI';
  94. Title.Font.Size := 14.0;
  95. Title.Font.Style := [TFontStyle.fsBold];
  96. Icon := AIcon;
  97. PlaceKind := TGaleNotice.DefPlaceKind;
  98. Pos := Screen.MousePos;
  99. BackColor := TAlphaColorRec.White;
  100. BorderColor := TAlphaColorRec.White;
  101. Shadow := TGaleNotice.DefShadow;
  102. Title.FontColor := TAlphaColorRec.Black;
  103. Text.FontColor := TAlphaColorRec.Black;
  104. HanPos := hpNone;
  105. Delay := TGaleNotice.DefHideDelay;
  106. CloseBtn := TGaleNotice.DefColseBtn;
  107. end;
  108. { TGaleHintWindow }
  109. //==============================================================================
  110. // 显示提示
  111. //==============================================================================
  112. class procedure TGaleNotice.ShowHint(const AInfo: TNoticeInfo);
  113. var
  114. tmpHint: TGaleNotice;
  115. LActiveForm: TCommonCustomForm;
  116. begin
  117. tmpHint := TGaleNotice.Create(nil);
  118. tmpHint.NI := AInfo;
  119. tmpHint.FCalloutRectangle.Fill.Color := AInfo.BackColor;
  120. tmpHint.FCalloutRectangle.Stroke.Color := AInfo.BorderColor;
  121. HindWins.Add(tmpHint);
  122. LActiveForm := Screen.ActiveForm;
  123. tmpHint.Show;
  124. if Assigned(LActiveForm) then
  125. LActiveForm.Activate;
  126. tmpHint.BringToFront;
  127. tmpHint.FloatAnimation.Start;
  128. RePlace;
  129. end;
  130. //==============================================================================
  131. // 显示Info
  132. //==============================================================================
  133. class procedure TGaleNotice.Info(AText: string; ATitle: string);
  134. var
  135. NI: TNoticeInfo;
  136. begin
  137. NI.Init(AText, ATitle, ikInfo);
  138. NI.BackColor := $FF59ACC3;
  139. NI.BorderColor := $FF59ACC3;
  140. NI.Title.FontColor := $FFFFFFFF;
  141. NI.Text.FontColor := $FFFFFFFF;
  142. ShowHint(NI);
  143. end;
  144. //==============================================================================
  145. // 显示Info
  146. //==============================================================================
  147. class procedure TGaleNotice.Success(AText: string; ATitle: string);
  148. var
  149. NI: TNoticeInfo;
  150. begin
  151. NI.Init(AText, ATitle, ikSuccess);
  152. NI.BackColor := $FF74B575;
  153. NI.BorderColor := $FF74B575;
  154. NI.Title.FontColor := $FFFFFFFF;
  155. NI.Text.FontColor := $FFFFFFFF;
  156. ShowHint(NI);
  157. end;
  158. //==============================================================================
  159. // 显示警告
  160. //==============================================================================
  161. class procedure TGaleNotice.Warn(AText: string; ATitle: string);
  162. var
  163. NI: TNoticeInfo;
  164. begin
  165. NI.Init(AText, ATitle, ikWarn);
  166. NI.BackColor := $FFF9AA39;
  167. NI.BorderColor := $FFF9AA39;
  168. NI.Title.FontColor := $FFFFFFFF;
  169. NI.Text.FontColor := $FFFFFFFF;
  170. ShowHint(NI);
  171. end;
  172. //==============================================================================
  173. // 显示错误
  174. //==============================================================================
  175. class procedure TGaleNotice.Error(AText: string; ATitle: string);
  176. var
  177. NI: TNoticeInfo;
  178. begin
  179. NI.Init(AText, ATitle, ikError);
  180. NI.BackColor := $FFCA5E59;
  181. NI.BorderColor := $FFCA5E59;
  182. NI.Title.FontColor := $FFFFFFFF;
  183. NI.Text.FontColor := $FFFFFFFF;
  184. ShowHint(NI);
  185. end;
  186. //==============================================================================
  187. // 重新摆放队列中的消息框
  188. //==============================================================================
  189. class procedure TGaleNotice.RePlace;
  190. var
  191. fLeftTop, fTopCenter, fRightTop, fLeftBottom, fBottomCenter, fRightBottom: single;
  192. begin
  193. fLeftTop := Screen.WorkAreaRect.Top;
  194. fTopCenter := Screen.WorkAreaRect.Top;
  195. fRightTop := Screen.WorkAreaRect.Top;
  196. fLeftBottom := Screen.WorkAreaRect.Bottom - DefFormPadding;
  197. fBottomCenter := Screen.WorkAreaRect.Bottom - DefFormPadding;
  198. fRightBottom := Screen.WorkAreaRect.Bottom - DefFormPadding;
  199. for var item in HindWins do
  200. begin
  201. if not item.Visible then
  202. Continue;
  203. item.BringToFront;
  204. case item.NI.PlaceKind of
  205. TPlaceKind.pkLeftTop:
  206. begin
  207. item.Left := 0;
  208. item.Top := Round(fLeftTop);
  209. fLeftTop := fLeftTop + item.Height - DefFormPadding * 2 + DefGap;
  210. end;
  211. TPlaceKind.pkTopCenter:
  212. begin
  213. item.Left := Round((Screen.Width - item.Width) / 2);
  214. item.Top := Round(fTopCenter);
  215. fTopCenter := fTopCenter + item.Height - DefFormPadding * 2 + DefGap;
  216. end;
  217. TPlaceKind.pkRightTop:
  218. begin
  219. item.Left := Round(Screen.Width - item.Width);
  220. item.Top := Round(fRightTop);
  221. fRightTop := fRightTop + item.Height - DefFormPadding * 2 + DefGap;
  222. end;
  223. TPlaceKind.pkLeftBottom:
  224. begin
  225. item.Left := 0;
  226. fLeftBottom := fLeftBottom - item.Height + DefFormPadding * 2 - DefGap;
  227. item.Top := Round(fLeftBottom);
  228. end;
  229. TPlaceKind.pkBottomCenter:
  230. begin
  231. item.Left := Round((Screen.Width - item.Width) / 2);
  232. fBottomCenter := fBottomCenter - item.Height + DefFormPadding * 2 - DefGap;
  233. item.Top := Round(fBottomCenter);
  234. end;
  235. TPlaceKind.pkRightBottom:
  236. begin
  237. item.Left := Round(Screen.Width - item.Width);
  238. fRightBottom := fRightBottom - item.Height + DefFormPadding * 2 - DefGap;
  239. item.Top := Round(fRightBottom);
  240. end;
  241. end;
  242. end;
  243. end;
  244. //==============================================================================
  245. // 构造
  246. //==============================================================================
  247. constructor TGaleNotice.Create(AOwner: TComponent);
  248. begin
  249. inherited CreateNew(AOwner);
  250. FormStyle := TFormStyle.StayOnTop;
  251. Transparency := True;
  252. // 气泡框
  253. FCalloutRectangle := TCalloutRectangle.Create(self);
  254. FCalloutRectangle.Position.X := DefFormPadding;;
  255. FCalloutRectangle.Position.Y := DefFormPadding;
  256. FCalloutRectangle.XRadius := 3;
  257. FCalloutRectangle.YRadius := 3;
  258. FCalloutRectangle.CalloutWidth := DefCalloutLen;
  259. FCalloutRectangle.CalloutLength := DefCalloutLen;
  260. FCalloutRectangle.OnMouseEnter := OnCalloutRectangleEnter;
  261. FCalloutRectangle.OnMouseLeave := OnCalloutRectangleLeave;
  262. FCalloutRectangle.OnClick := OnCalloutRectangleClick;
  263. FCalloutRectangle.OnPaint := OnCalloutRectanglePaint;
  264. AddObject(FCalloutRectangle);
  265. // 阴影
  266. ShadowEffect := TShadowEffect.Create(FCalloutRectangle);
  267. FCalloutRectangle.AddObject(ShadowEffect);
  268. ShadowEffect.Enabled := True;
  269. // 消失动画
  270. FloatAnimation := TFloatAnimation.Create(FCalloutRectangle);
  271. FCalloutRectangle.AddObject(FloatAnimation);
  272. FloatAnimation.PropertyName := 'Opacity';
  273. FloatAnimation.Duration := 1.0;
  274. FloatAnimation.StartValue := 1.0;
  275. FloatAnimation.StopValue := 0;
  276. FloatAnimation.OnFinish := OnFloatAnimationFinish;
  277. end;
  278. //==============================================================================
  279. // 设置气球手柄位置坐标
  280. //==============================================================================
  281. procedure TGaleNotice.SetCalloutPos(const ATPointF: TPointF);
  282. var
  283. fTemp: single;
  284. begin
  285. if FCalloutRectangle.CalloutPosition in [TCalloutPosition.Top, TCalloutPosition.Bottom] then
  286. begin
  287. if FCalloutRectangle.CalloutOffset = 0 then
  288. fTemp := FCalloutRectangle.Width / 2
  289. else
  290. fTemp := FCalloutRectangle.CalloutOffset + FCalloutRectangle.CalloutWidth / 2;
  291. end
  292. else
  293. begin
  294. if FCalloutRectangle.CalloutOffset = 0 then
  295. fTemp := FCalloutRectangle.Height / 2
  296. else
  297. fTemp := FCalloutRectangle.CalloutOffset + FCalloutRectangle.Height / 2;
  298. end;
  299. case FCalloutRectangle.CalloutPosition of
  300. TCalloutPosition.Top:
  301. begin
  302. Left := Round(ATPointF.X - DefFormPadding - fTemp);
  303. Top := Round(ATPointF.Y - DefFormPadding);
  304. end;
  305. TCalloutPosition.Bottom:
  306. begin
  307. Left := Round(ATPointF.X - DefFormPadding - fTemp);
  308. Top := Round(ATPointF.Y - DefFormPadding - FCalloutRectangle.Height);
  309. end;
  310. TCalloutPosition.Left:
  311. begin
  312. Left := Round(ATPointF.X - DefFormPadding);
  313. Top := Round(ATPointF.Y - DefFormPadding - fTemp);
  314. end;
  315. TCalloutPosition.Right:
  316. begin
  317. Left := Round(ATPointF.X - DefFormPadding - FCalloutRectangle.Width);
  318. Top := Round(ATPointF.Y - DefFormPadding - fTemp);
  319. end;
  320. end;
  321. end;
  322. //==============================================================================
  323. // 消息窗口参数设置
  324. //==============================================================================
  325. procedure TGaleNotice.SetNI(const AValue: TNoticeInfo);
  326. var
  327. rct: TRectF;
  328. titleWidth: single;
  329. textWidth: single;
  330. begin
  331. FNI := AValue;
  332. ShadowEffect.Opacity := FNI.Shadow;
  333. FCalloutRectangle.Canvas.Font.Style := [TFontStyle.fsBold];
  334. FCalloutRectangle.Canvas.Font.Size := FNI.Title.Font.Size;
  335. rct := RectF(0, 0, DefMaxWidth, 1024);
  336. FCalloutRectangle.Canvas.MeasureText(rct, FNI.Title.Value, True, [], TTextAlign.Leading, TTextAlign.Leading);
  337. titleWidth := rct.Width;
  338. FTitleHeight := rct.Height;
  339. FCalloutRectangle.Canvas.Font.Style := [];
  340. FCalloutRectangle.Canvas.Font.Size := FNI.Text.Font.Size;
  341. rct := RectF(0, 0, DefMaxWidth, 1024);
  342. FCalloutRectangle.Canvas.MeasureText(rct, FNI.Text.Value, True, [], TTextAlign.Leading, TTextAlign.Leading);
  343. textWidth := rct.Width;
  344. rct.Width := Max(textWidth, titleWidth);
  345. rct.Width := Max(rct.Width, DefMinWidth);
  346. if FNI.Icon = ikNone then
  347. FCalloutRectangle.Width := DefMargin + rct.Width + DefMargin
  348. else
  349. FCalloutRectangle.Width := DefMargin + DefIconWidth + DefMargin + rct.Width + DefMargin;
  350. FCalloutRectangle.Height := DefMargin + FTitleHeight + rct.Height + DefMargin;
  351. if Ord(FNI.HanPos) > 0 then
  352. begin
  353. FCalloutRectangle.CalloutLength := DefCalloutLen;
  354. FCalloutRectangle.CalloutPosition := TCalloutPosition(Ord(FNI.HanPos) - 1);
  355. case FNI.HanPos of
  356. hpLeft, hpRight:
  357. FCalloutRectangle.Width := FCalloutRectangle.Width + DefCalloutLen;
  358. hpTop, hpBottom:
  359. FCalloutRectangle.Height := FCalloutRectangle.Height + DefCalloutLen;
  360. end;
  361. end
  362. else
  363. begin
  364. FCalloutRectangle.CalloutLength := 0;
  365. end;
  366. Width := Round(FCalloutRectangle.Width + DefFormPadding * 2);
  367. Height := Round(FCalloutRectangle.Height + DefFormPadding * 2);
  368. FloatAnimation.Delay := FNI.Delay;
  369. if FNI.PlaceKind = pkNone then
  370. SetCalloutPos(FNI.Pos);
  371. end;
  372. procedure TGaleNotice.OnCalloutRectangleEnter(Sender: TObject);
  373. var
  374. OldEvent: TNotifyEvent;
  375. begin
  376. OldEvent := FloatAnimation.OnFinish;
  377. FloatAnimation.OnFinish := nil;
  378. FloatAnimation.Stop;
  379. FloatAnimation.Delay := 1.0;
  380. FloatAnimation.OnFinish := OldEvent;
  381. end;
  382. procedure TGaleNotice.OnCalloutRectangleLeave(Sender: TObject);
  383. begin
  384. FloatAnimation.Start;
  385. end;
  386. //==============================================================================
  387. // 点击事件
  388. //==============================================================================
  389. procedure TGaleNotice.OnCalloutRectangleClick(Sender: TObject);
  390. var
  391. OldEvent: TNotifyEvent;
  392. begin
  393. // 点击在关闭按钮区域
  394. if FNI.CloseBtn and FCloseRect.Contains(FCalloutRectangle.ScreenToLocal(Screen.MousePos)) then
  395. begin
  396. OldEvent := FloatAnimation.OnFinish;
  397. FloatAnimation.OnFinish := nil;
  398. FloatAnimation.Stop;
  399. FloatAnimation.Delay := 0;
  400. FloatAnimation.OnFinish := OldEvent;
  401. FCalloutRectangle.OnMouseEnter := nil;
  402. FCalloutRectangle.OnMouseLeave := nil;
  403. FloatAnimation.Start;
  404. end;
  405. end;
  406. //==============================================================================
  407. // 气泡重绘
  408. //==============================================================================
  409. procedure TGaleNotice.OnCalloutRectanglePaint(Sender: TObject; Canvas: TCanvas; const ARect: TRectF);
  410. const
  411. pdClose = 'M10 0L100 90L90 100L0 10z M90 0L100 10L10 100L0 90z';
  412. pdInfo = 'M40 0 H60 V20 H40z M42 40L58 40L62 100L38 100z';
  413. pdSuccess = 'M940 160L396 704 83 384 0 467l313 313 83 83L1024 243z';
  414. pdWarn = 'M0 50a50 50 0 1 0 100 0a50 50 0 1 0-100 0M 40 10L 60 10L55 55L45 55zM 42 70L 58 70L58 86L42 86z';
  415. pdError = 'M0 50a50 50 0 1 0 100 0a50 50 0 1 0-100 0M 20 40L 80 40L80 60L20 60z';
  416. pdMail = 'M0 20 H100 V80 H0 V20 M0 27 L50 55L100 27';
  417. pdQuestion = 'M14 17L32 0H70L85 16V50L57 64V77H43V56L72 43V21L64 13H35L21 27z M44 86H56V99H44z';
  418. var
  419. WorkRect, IconRect, TitleRect, TextRect: TRectF;
  420. PathData: TPathData;
  421. begin
  422. WorkRect := ARect;
  423. if FCalloutRectangle.CalloutLength > 0 then
  424. begin
  425. case FCalloutRectangle.CalloutPosition of
  426. TCalloutPosition.Top:
  427. WorkRect.Top := WorkRect.Top + FCalloutRectangle.CalloutLength;
  428. TCalloutPosition.Bottom:
  429. WorkRect.Bottom := WorkRect.Bottom - FCalloutRectangle.CalloutLength;
  430. TCalloutPosition.Left:
  431. WorkRect.Left := WorkRect.Left + FCalloutRectangle.CalloutLength;
  432. TCalloutPosition.Right:
  433. WorkRect.Right := WorkRect.Right - FCalloutRectangle.CalloutLength;
  434. end;
  435. end;
  436. // 图标
  437. if FNI.Icon <> ikNone then
  438. begin
  439. IconRect.Left := WorkRect.Left + DefMargin;
  440. IconRect.Top := WorkRect.Top + (WorkRect.Height - DefIconHeight) / 2;
  441. IconRect.Width := DefIconWidth;
  442. IconRect.Height := DefIconHeight;
  443. PathData := TPathData.Create;
  444. try
  445. case FNI.Icon of
  446. ikInfo:
  447. PathData.Data := pdInfo;
  448. ikSuccess:
  449. PathData.Data := pdSuccess;
  450. ikWarn:
  451. PathData.Data := pdWarn;
  452. ikError:
  453. PathData.Data := pdError;
  454. ikMail:
  455. PathData.Data := pdMail;
  456. ikQuestion:
  457. PathData.Data := pdQuestion;
  458. else
  459. end;
  460. PathData.FitToRect(IconRect);
  461. FCalloutRectangle.Canvas.Fill.Color := NI.Title.FontColor;
  462. FCalloutRectangle.Canvas.FillPath(PathData, FCalloutRectangle.Opacity);
  463. finally
  464. PathData.Free
  465. end;
  466. end;
  467. // 关闭按钮
  468. if FNI.CloseBtn then
  469. begin
  470. FCloseRect.Right := WorkRect.Right - 5;
  471. FCloseRect.Top := WorkRect.Top + 5;
  472. FCloseRect.Left := FCloseRect.Right - 8;
  473. FCloseRect.Bottom := FCloseRect.Top + 8;
  474. PathData := TPathData.Create;
  475. try
  476. PathData.Data := pdClose;
  477. PathData.FitToRect(FCloseRect);
  478. FCalloutRectangle.Canvas.Stroke.Color := NI.Title.FontColor;
  479. FCalloutRectangle.Canvas.FillPath(PathData, FCalloutRectangle.Opacity);
  480. finally
  481. PathData.Free;
  482. end;
  483. end;
  484. // 标题
  485. if FNI.Icon <> ikNone then
  486. TitleRect.Left := WorkRect.Left + DefMargin + DefIconWidth + DefMargin
  487. else
  488. TitleRect.Left := WorkRect.Left + DefMargin;
  489. TitleRect.Top := WorkRect.Top + DefMargin - 2;
  490. TitleRect.Right := WorkRect.Right;
  491. TitleRect.Bottom := WorkRect.Bottom;
  492. FCalloutRectangle.Canvas.Fill.Color := FNI.Title.FontColor;
  493. FCalloutRectangle.Canvas.Font.Family := FNI.Title.Font.Family;
  494. FCalloutRectangle.Canvas.Font.Size := FNI.Title.Font.Size;
  495. FCalloutRectangle.Canvas.Font.Style := FNI.Title.Font.Style;
  496. FCalloutRectangle.Canvas.FillText(TitleRect, FNI.Title.Value, True, FCalloutRectangle.Opacity, [], TTextAlign.Leading, TTextAlign.Leading);
  497. // 内容
  498. TextRect.Left := TitleRect.Left;
  499. TextRect.Top := WorkRect.Top + DefMargin + FTitleHeight;
  500. TextRect.Right := WorkRect.Right - DefMargin;
  501. TextRect.Bottom := WorkRect.Bottom;
  502. FCalloutRectangle.Canvas.Fill.Color := FNI.Text.FontColor;
  503. FCalloutRectangle.Canvas.Font.Family := FNI.Text.Font.Family;
  504. FCalloutRectangle.Canvas.Font.Size := FNI.Text.Font.Size;
  505. FCalloutRectangle.Canvas.Font.Style := FNI.Text.Font.Style;
  506. FCalloutRectangle.Canvas.FillText(TextRect, FNI.Text.Value, True, FCalloutRectangle.Opacity, [], TTextAlign.Leading, TTextAlign.Leading);
  507. end;
  508. //==============================================================================
  509. // 显示动画结束,删除
  510. //==============================================================================
  511. procedure TGaleNotice.OnFloatAnimationFinish(Sender: TObject);
  512. begin
  513. HindWins.Remove(self);
  514. RePlace;
  515. end;
  516. initialization
  517. TGaleNotice.HindWins := TObjectList<TGaleNotice>.Create;
  518. TGaleNotice.DefFormPadding := 10.0;
  519. TGaleNotice.DefGap := 3.0;
  520. TGaleNotice.DefMargin := 10.0;
  521. TGaleNotice.DefIconWidth := 16.0;
  522. TGaleNotice.DefIconHeight := 16.0;
  523. TGaleNotice.DefCalloutLen := 10.0;
  524. TGaleNotice.DefHideDelay := 5.0;
  525. TGaleNotice.DefMaxWidth := 240.0;
  526. TGaleNotice.DefMinWidth := 100.0;
  527. TGaleNotice.DefPlaceKind := pkRightTop;
  528. TGaleNotice.DefShadow := 0.5;
  529. TGaleNotice.DefColseBtn := True;
  530. finalization
  531. TGaleNotice.HindWins.Free;
  532. end.