如何更新 Windows 轨迹栏控件的工具提示文本?

ble*_*tin 4 windows delphi vcl tooltip

Delphi 中的组件TTrackBar是标准 Windows 轨迹栏控件的包装器。当该PositionToolTip属性不是 None 时,拖动轨迹栏控件的滑块时会显示工具提示。

默认情况下,该工具提示显示控件的 Min 和 Max 之间的纯整数。有没有办法手动更新该位置工具提示文本,以便在音量控制的情况下可以将数值格式化为“80%”?

当查看Windows 轨迹栏控制文档时,似乎有一个TBM_GETTOOLTIPS消息,它允许检索工具提示的句柄。但不确定如何使用该句柄更新工具提示文本。

And*_*and 6

我认为最好的方法是使用TTN_NEEDTEXT通知并填充NMTTDISPINFO结构:

\n
unit Unit1;\n\ninterface\n\nuses\n  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,\n  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ComCtrls, CommCtrl;\n\ntype\n  TTrackBar = class(Vcl.ComCtrls.TTrackBar)\n    procedure WndProc(var Message: TMessage); override;\n  end;\n\n  TForm1 = class(TForm)\n    TrackBar1: TTrackBar;\n  private\n  public\n  end;\n\nimplementation\n\n{$R *.dfm}\n\nprocedure TTrackBar.WndProc(var Message: TMessage);\nbegin\n  inherited;\n  case Message.Msg of\n    WM_NOTIFY:\n      if PNMHdr(Message.LParam).code = TTN_NEEDTEXT then\n      begin\n        var S := Round(100 * Position / Max).ToString + \'%\';\n        FillChar(\n          PNMTTDispInfo(Message.LParam).szText,\n          Length(PNMTTDispInfo(Message.LParam).szText) * SizeOf(Char),\n          0);\n        if S.Length <= Length(PNMTTDispInfo(Message.LParam).szText) then\n          CopyMemory(\n            @PNMTTDispInfo(Message.LParam).szText,\n            Pointer(S),\n            S.Length * SizeOf(Char)\n          );\n      end;\n  end;\nend;\n\nend.\n
Run Code Online (Sandbox Code Playgroud)\n

工具提示的屏幕截图

\n

(大多数情况下,英语中的百分号前不使用空格。但是,在许多其他语言中,应该有一个空格。例如,在瑞典语中,百分号前始终有一个不间断空格.所以50%用英语,但50\xc2\xa0%用瑞典语。)

\n