Delphi 设置提示时创建的MouseMove事件

Delphi 设置提示时创建的MouseMove事件,delphi,Delphi,我在XP机器上使用Delphi6 我在stringgrid中使用Onmousemove来获取单元格的内容。 然后我使用单元格内容设置提示。 然后我使用Application.ActivateHint来显示提示。 但每次我更新提示值时,操作系统都会发送另一个MouseMove事件。 这会导致非常糟糕的提示闪烁 我知道鼠标没有移动,但我被MouseMove事件淹没了。 鼠标移动导致提示更新,提示更新导致鼠标移动导致提示更新等。您采取的方法完全错误。不要使用OnMouseMove事件手动设置提示并调用

我在XP机器上使用Delphi6

我在stringgrid中使用Onmousemove来获取单元格的内容。 然后我使用单元格内容设置提示。 然后我使用Application.ActivateHint来显示提示。 但每次我更新提示值时,操作系统都会发送另一个MouseMove事件。 这会导致非常糟糕的提示闪烁

我知道鼠标没有移动,但我被MouseMove事件淹没了。
鼠标移动导致提示更新,提示更新导致鼠标移动导致提示更新等。

您采取的方法完全错误。不要使用
OnMouseMove
事件手动设置
提示
并调用
应用程序.ActivateHint()
,而是让VCL为您处理一切

使用
TApplication.OnShowHint
事件,或者将StringGrid子类化以拦截
CM\u HINTSHOW
消息,以自定义StringGrid的本机提示行为。任何一种方法都允许您访问记录,从而允许您在显示/更新当前提示之前对其进行自定义。特别是,
THintInfo.CursorRect
成员允许您设置VCL用于跟踪鼠标的矩形,并决定何时/是否需要触发新的
OnShowHint
事件或
CM_HINTSHOW
消息以更新当前提示,而鼠标仍在显示提示的控件内。该更新比
TApplication.ActivateHint()
所做的更干净、更无缝

例如:

procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnShowHint := AppShowHint;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Application.OnShowHint := nil;
end;

procedure TForm1.AppShowHint(var HintStr: string; var CanShow: Boolean; var HintInfo: THintInfo);
var
  Col, Row: Longint;
begin
  if HintInfo.HintControl := StringGrid1 then
  begin
    StringGrid1.MouseToCell(HintInfo.CursorPos.X, HintInfo.CursorPos.Y, Col, Row);
    if (Col >= 0) and (Row >= 0) then
    begin
      HintInfo.CursorRect := StringGrid1.CellRect(Col, Row);
      HintInfo.HintStr := StringGrid1.Cells[Col, Row];
    end;
  end;
end;
或:


如果希望在单元格内的每次鼠标移动时更新提示,只需将
THintInfo.CursorRect
设置为当前
THintInfo.CursorPos
位置的1x1矩形。如果您希望在鼠标未移动的情况下定期更新提示,请将THintInfo.ReshowTimeout设置为非零的毫秒间隔。

您采取的方法完全错误。不要使用
OnMouseMove
事件手动设置
提示
并调用
应用程序.ActivateHint()
,而是让VCL为您处理一切

使用
TApplication.OnShowHint
事件,或者将StringGrid子类化以拦截
CM\u HINTSHOW
消息,以自定义StringGrid的本机提示行为。任何一种方法都允许您访问记录,从而允许您在显示/更新当前提示之前对其进行自定义。特别是,
THintInfo.CursorRect
成员允许您设置VCL用于跟踪鼠标的矩形,并决定何时/是否需要触发新的
OnShowHint
事件或
CM_HINTSHOW
消息以更新当前提示,而鼠标仍在显示提示的控件内。该更新比
TApplication.ActivateHint()
所做的更干净、更无缝

例如:

procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnShowHint := AppShowHint;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Application.OnShowHint := nil;
end;

procedure TForm1.AppShowHint(var HintStr: string; var CanShow: Boolean; var HintInfo: THintInfo);
var
  Col, Row: Longint;
begin
  if HintInfo.HintControl := StringGrid1 then
  begin
    StringGrid1.MouseToCell(HintInfo.CursorPos.X, HintInfo.CursorPos.Y, Col, Row);
    if (Col >= 0) and (Row >= 0) then
    begin
      HintInfo.CursorRect := StringGrid1.CellRect(Col, Row);
      HintInfo.HintStr := StringGrid1.Cells[Col, Row];
    end;
  end;
end;
或:


如果希望在单元格内的每次鼠标移动时更新提示,只需将
THintInfo.CursorRect
设置为当前
THintInfo.CursorPos
位置的1x1矩形。如果您希望在鼠标未移动的情况下定期更新提示,请将
THintInfo.ReshowTimeout
设置为非零的毫秒间隔。

谢谢分享。如果您使用本机提示机制,比如截取将在应用程序的OnShowHint事件中显示的提示,然后对其进行修改,您可能会有更好的体验。谢谢分享。如果您使用本机提示机制,比如截取将在应用程序的OnShowHint事件中显示的提示,然后对其进行修改,您可能会有更好的体验。