【问题标题】:How can I show hints for droppeddown TComboBox items in Delphi 10.3.3?如何在 Delphi 10.3.3 中显示下拉 TComboBox 项目的提示?
【发布时间】:2022-01-13 14:41:37
【问题描述】:

我必须显示下拉 TComboBox 项目的提示。

为此,我可以使用OnMouseMove 事件来处理悬停消息。它将鼠标 X,Y 客户端坐标作为参数。如果我可以确定要绘制的第一个项目(带有垂直滚动条的下拉列表),那么我可以使用 ItemHeight 值确定光标下的项目。

是否有任何 Win32 API 调用消息来获取此值? IDE 不支持此信息,或者我找不到。

【问题讨论】:

  • 尝试使用GetComboBoxInfo()获取ComboBox下拉列表的HWND,然后给列表发送LB_ITEMFROMPOINT消息,
  • @RemyLebeau 我自己也收到了 CB_GETCOMBOBOXINFO 消息。感谢 LB_ITEMFROMPOINT 信息。不幸的是,我可以看到 OnMoseMove 不处理 DropDownList 鼠标事件。所以我必须在重写的 TMyForm.WndProc 中处理这些消息。但是我应该为此捕获什么样的消息? WM_MOUSEMOVE?但是我怎么知道它是 DrapDownList 事件而不是 TForm 本身触发的事件呢?
  • 为此,您必须对下拉列表进行子类化,以通过SetWindowLongPtr(GWLP_WNDPROC) 或SetWindowSubclass() 直接为其分配一个单独的WndProc(请参阅Subclassing controls 和How to Subclass a Combo Box)。您可以使用TComboBox.OnDropDown事件设置挂钩,然后使用TComboBox.OnCloseUp事件解除挂钩。
  • 这不是一个答案,但为了用户体验,在项目上显示一个提示以选择正确的值并不是很清楚。为什么不使用对用户更不稳定的价值?
  • @Bosshoss OwnerDraw 图形组合框需要它。再好不过了。我想使用提示来显示生成图形内容所需的参数。

标签: delphi hint tcombobox


【解决方案1】:

一种选择是使用 cxOwnerDrawXXXX 样式的 ComboBox 和 OnDrawItem 事件,它会告诉您何时绘制焦点项目。我自己曾经使用过这种方法来更新文本框中的静态提示,该提示提供有关焦点/悬停项目的更多信息。

将提示文本放入 StaticText 控件的示例:

procedure TForm1.ComboBox1CloseUp(Sender: TObject);
begin
  StaticText1.Caption := '';
end;

procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer; Rect:
    TRect; State: TOwnerDrawState);
begin
  // Update a hint on a static control
  if  (odSelected in State) and (Control as TComboBox).DroppedDown  then
    StaticText1.Caption := 'Hint for value:' + (Control as TComboBox).Items[Index];

  // Draw list item
  with (Control as TComboBox).Canvas do
  begin
    FillRect(Rect);
    TextOut(Rect.Left, Rect.Top, (Control as TComboBox).Items[Index]);
  end;
end;

可以适应激活/显示/存储提示而不是更新静态控件。

【讨论】:

  • 它只是修改了项目绘制事件的提示。当列表被下拉并且我只是用鼠标悬停时它不起作用。
猜你喜欢
  • 2020-12-12
  • 2017-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-31
相关资源
最近更新 更多