TCheckListBox项目的唯一提示?

时间:2011-02-03 19:52:54

标签: delphi

当用户将鼠标向下移动到TCheckListBox中的项目列表时,如何显示特定于鼠标下项目的提示?

在Delphi 2010中。

汤姆

3 个答案:

答案 0 :(得分:6)

我这样做的方法是使用TApplication.OnShowHint事件。这允许您自定义HintStr参数,并且您可以根据HintInfo参数中包含的位置执行此操作。

正如Remy在评论中指出的那样,你也可以处理CM_HINTSHOW以达到同样的效果,如果你已经将标准VCL控件子类化了,那么在某些方面实现它会更清晰。

我已经实现了一个基于界面的框架,以便在我的应用程序中使用它。基本上在TApplication.OnShowHint中,HintInfo.HintControl会询问它是否支持此接口。如果是这样,那么它有机会自定义提示文本。它工作得很漂亮。

基础提示原始MouseMove事件的效果非常好但是在每个MouseMove事件上调用ItemAtPos似乎有点浪费,而不是等到实际显示提示的时间。这就是为什么我略微偏爱上述方法。

答案 1 :(得分:4)

创建一个TCheckListBox,其中包含四个名为“alpha”,“beta”,“gamma”和“delta”的项目(例如)。然后做

const
  CheckListBoxHints: array[0..3] of string = ('first hint', 'second hint', 'third hint', 'fourth hint');

var
  prevIndex: integer = -1;

procedure TForm1.CheckListBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  index: integer;
begin
  index := CheckListBox1.ItemAtPos(point(X, Y), true);
  if index <> -1 then
    CheckListBox1.Hint := CheckListBoxHints[index]
  else
    CheckListBox1.Hint := '';
  if index <> prevIndex then
    Application.CancelHint;
  prevIndex := index;
end;

端;

答案 2 :(得分:0)

我所知道的只有一种方式 - 艰难的做法......

您可以查询鼠标悬停的元素,并设置如下所示的提示:

procedure TForm2.CheckListBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var hintItem : Integer;
    point    : TPoint;
begin
     point.X := X;
     point.Y := y;
     hintItem := CheckListBox1.ItemAtPos(point,true);
     if hintItem >= 0 then begin
        CheckListBox1.Hint := CheckListBox1.Items[hintItem];
        CheckListBox1.ShowHint := true;
     end else begin
        CheckListBox1.Hint := '';
        CheckListBox1.ShowHint := false;
     end;
end;

稍微调整会使它更加优雅。我只能隐藏 MouseMove上的提示并启动(或重置)一个计时器来重新显示它。因此,当鼠标移动一段时间后会出现,当您开始移动鼠标时它会立即消失。

这是Windows期望的行为。我上面给出的实现有点不寻常,因为即使你移动鼠标,提示仍然可见。这是因为鼠标没有离开元素(TCheckListBox)。

哦,另外一件事:你也应该让提示在MouseLeave上消失。