4

我有以下代码试图显示提示:

procedure TMyGrid.OnGridMouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
var
  aPoint: TPoint;
begin
  inherited;
  //Application.Hint := 'Hint Text';
  //Application.ShowHint := True;
  Grid.Hint := 'Hint Text';
  Grid.ShowHint := True;
  aPoint.X := X;
  aPoint.Y := Y;
  Application.ActivateHint(aPoint);
end;

但是没有任何提示出现。怎么了?

4

2 回答 2

11

与其试图TApplication在网格控件的事件中强制显示新的提示OnMouseMove,正确的方法是让网格处理CM_HINTSHOW消息以在正常显示时自定义当前提示。

CM_HINTSHOW消息为您提供了指向其值 THintInfo中记录的指针。有一个成员可以告诉您当前鼠标在控件客户区内的位置,以及一个允许您在控件客户区内定义当前提示应该有效的矩形的成员(还有其他用于进一步自定义提示的成员,suh作为文本、颜色、窗口类、显示/隐藏超时等)。当鼠标移出该矩形但仍在控件的客户区域内时,将再次生成消息以获取新信息以更新当前提示。 LPARAMTHintInfoCursorPosCursorRectTHintInfoCM_HINTSHOW

如果您需要在每次鼠标移动时更新提示,您可以定义一个CursorRect只包含 current的自定义CursorPos,例如:

type
  TMyGrid = class(...)
  private
    procedure CMHintShow(var Message: TCMHintShow); message CM_HINTSHOW;
  end;

procedure TMyGrid.CMHintShow(var Message: TCMHintShow);
begin
  with Message.HintInfo^ do
  begin
    HintStr := Format('Hint Text (%d,%d)', [CursorPos.X, CursorPos.Y]);
    CursorRect := Rect(CursorPos.X, CursorPos.Y, CursorPos.X, CursorPos.Y);
  end;
end;
于 2013-02-22T19:39:35.717 回答
8

ActivateHint希望您的点在屏幕坐标中,而不是在客户端坐标中。

来自文档:

ActivateHint 将控件或菜单​​项定位在 CursorPos 指定的位置,其中CursorPos 表示以像素为单位的屏幕坐标。找到控件后,ActivateHint 在提示窗口中显示控件的提示。

所以,你必须像这样改变你的方法:

procedure TMyGrid.OnGridMouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
var
  aPoint: TPoint;
begin
  inherited;
  //Application.Hint := 'Hint Text';
  Grid.Hint := 'Hint Text';
  Grid.ShowHint := True;
  aPoint.X := X;
  aPoint.Y := Y;
  aPoint := ClientToScreen(aPoint);
  Application.ActivateHint(aPoint);
end;
于 2013-02-22T18:53:16.357 回答