当用户将鼠标向下移动到TCheckListBox中的项目列表时,如何显示特定于鼠标下项目的提示?
在Delphi 2010中。
汤姆
答案 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上消失。