delphi - 如何计算出 TListBox.ScrollWidth 使用哪些值?

标签 delphi winapi

我正在尝试弄清楚如何在 TListBox 上设置 ScrollWidth 来控制水平滚动条。这是我的第一次尝试:

program ListBoxSizing;

uses
  Math, Forms, StdCtrls;

var
  Form: TForm;
  ListBox: TListBox;

procedure BuildForm;
begin
  //Form.Font.Size := 9;
  Form.ClientWidth := 200;
  Form.ClientHeight := 100;
  ListBox := TListBox.Create(Form);
  ListBox.Parent := Form;
  ListBox.SetBounds(0, 0, Form.ClientWidth, Form.ClientHeight);
  ListBox.Items.Add('ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ');
end;

procedure SetScrollWidth;
var
  i, MaxWidth: Integer;
begin
  MaxWidth := -1;
  for i := 0 to ListBox.Items.Count-1 do
    MaxWidth := Max(MaxWidth, ListBox.Canvas.TextWidth(ListBox.Items[i]));
  if MaxWidth<>-1 then
    ListBox.ScrollWidth := MaxWidth;
end;

begin
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm, Form);
  BuildForm;
  SetScrollWidth;
  Application.Run;
end.

这是水平滚动条尽可能向右移动的结果:

enter image description here

请注意最终字符的最后部分是如何被砍掉的。

现在,如果我们取消注释更改表单字体大小的行,它看起来像这样:

enter image description here

现在,对 TextWidth 的后续调用似乎并未考虑到字体大小的更改。

所以,我的问题是,我需要使用什么代码才能根据列表框的当前内容准确设置 ScrollWidth

最佳答案

procedure SetScrollWidth;
var
  I, MaxWidth: Integer;
begin
  MaxWidth := -1;
  // assign control's font to canvas
  ListBox.Canvas.Font := ListBox.Font;
  for I := 0 to ListBox.Items.Count - 1 do
    MaxWidth := Max(MaxWidth, ListBox.Canvas.TextWidth(ListBox.Items[I]));
  // consider non-client area
  if MaxWidth <> -1 then
    ListBox.ScrollWidth := MaxWidth + ListBox.Width - ListBox.ClientWidth;
end;

关于delphi - 如何计算出 TListBox.ScrollWidth 使用哪些值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13643698/

相关文章:

delphi - 音频文件标记(读/写)库?

delphi - Microsoft Access 的 dbExpress 驱动程序

delphi - 以公制单位准确计算文本宽度

c++ - 将 C++ 结构移植到 Delphi

winapi - 在 Windows XP 和 Vista 上设置线程 UI 语言?

c++ - 如何获取对话框项文本的长度?

java - FireMonkey Android - JAR对象的处理回调消息(JHandle)

c - 使用 Win32 API 实现流畅的动画 - 无需控制消息泵

c++ - Win32 : How to access Windows Listview Header Control Filters

c++ - 非托管 C++ 中的 WinForm 样式 Invoke()