Bonjour,
(Delphi 11.3; appli VCL)
Je dois modifier l'aspect des bulles d'aide dans mon programme, et je n'ai pas de résultat consistant avec DrawText et DT_CALCRECT.
Je reproduis exactement les même bugs avec un projet presque vide (juste des TButton avec des Hint contenant plusieurs mots).
Dans CalcHintRect, je récupère le clientRect, j'appelle DrawTExt avec CALCRECT pour que la fonction modifie le Rect qui est passé en VAR et ensuite j'Inflate le Rect pour avoir les marges voulue.
Puis dans le Paint je récupère le ClientRect Inflate inverse pour prendre en compte les marges puis je dessine le texte.
Le premier appel calcul un rect qui fait (0,0,0,0) mais ne renvoie pas 0 pour indiquer un échec, et même ensuite, le résultat du DrawText appelé dans le PAINT est différent avec une bulle souvent trop petite mais parfois trop grande, le saut de ligne à un endroit différent, ...
EDIT : Dans le code ci dessus, remplacer PChar(Caption) par PChar(AHint) dans la fonction CalcHintRect.
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 TMyHintWindow = class(THintWindow) protected procedure Paint; override; public function CalcHintRect(MaxWidth: Integer; const AHint: string; AData: Pointer): TRect; override; end; implementation { TMyHintWindow } const MargeVert = 4; MargeHorz = 8; FontName = 'Segoe UI'; FontHeight = -14; function TMyHintWindow.CalcHintRect(MaxWidth: Integer; const AHint: string; AData: Pointer): TRect; begin MaxWidth := 1000; Result := inherited CalcHintRect(MaxWidth, AHint, AData); if DrawText(Canvas.Handle, PChar(Caption), -1, Result, DT_LEFT or DT_NOPREFIX or DT_WORDBREAK or DT_CALCRECT) = 0 then Raise Exception.create('échec DrawText'); Result.Inflate(MargeHorz, MargeVert, MargeHorz, MargeVert); end; procedure TMyHintWindow.Paint; var ARect: TRect; begin //inherited; ARect := ClientRect; Canvas.Brush.Color := clTeal; Canvas.RoundRect(ARect, 4, 4); ARect.Inflate(-MargeHorz, -MargeVert, -MargeHorz, -MargeVert); DrawText(Canvas.Handle, PChar(Caption), -1, ARect, DT_LEFT or DT_NOPREFIX or DT_WORDBREAK or DT_NOCLIP); end; initialization HintWindowClass := TMyHintWindow; Screen.HintFont.Name := FontName; Screen.HintFont.Height := FontHeight; end.
Merci dvp.com
Comme vous pouvez le voir, le résultat n'est pas toujours identique.
J'ai essayé de modifier Screen.HintFont à d'autres endroits, ça ne change rien. Avant de trouver HintFont j'assignais Canvas.Font.name et Canvas.Font.Height dans les 2 procédures avant le DrawText, même résultat.
Qu'est ce que je peux faire différemment pour résoudre mon problème ?
Bonus : comment bloquer le dessin de l'ancêtre ?
Je pensais que commenter le inherited dans le Paint suffirait.
Partager