1 pièce(s) jointe(s)
THintWindow, DrawText DT_CALCRECT
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, ...
Code:
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. |
EDIT : Dans le code ci dessus, remplacer PChar(Caption) par PChar(AHint) dans la fonction CalcHintRect.
Merci dvp.com
Pièce jointe 655518
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.