2

TCustomHint気を散らさないように、うまくフェードインおよびフェードアウトするメッセージをユーザーに表示するために使用しようとしています。しかしShowHint、ポイントでオブジェクトを呼び出すと、ヒント ボックスは指定したポイントを中心に表示されます。私が望むのは、左上の座標が指定されたポイントになるようにボックスを表示することです。

これが私が使用しているコードですので、ヒントを示してください:

procedure ShowNotification(ATitle: UnicodeString; AMsg: UnicodeString);
var
  Box: TCustomHint;
  P: TPoint;
begin
    Box := TCustomHint.Create(MyForm);
    Box.Title := ATitle;
    Box.Description := AMsg;
    Box.Delay := 0;
    Box.HideAfter := 5000;
    Box.Style := bhsStandard;

    P.X := 0;
    P.Y := 0;

    Box.ShowHint(P);
end;

ポイントの X/Y 座標がフォームに関連していないことはわかっていますが、それは問題ではありません。

私が電話をかけたときに何が起こるかをたどってみましたが、内部のShowHint基礎となる最終的な幅をどうにかして制御できれば、私は仕事をしている可能性があります。TCustomHintWindowTCustomHint.ShowHint(Rect: TRect)

だから私の質問は: aTCustomHintが自分のポイントに集中するのを止める明白な方法はありますか? または、描画メソッドの継承、オーバーライドなどのプロセスを経る必要がありますか? シンプルなものが欠けていることを願っています。

4

1 に答える 1

3

やりたいことを実現するための特に簡単な方法はありません。このTCustomHintクラスは、非常に特定の目的に役立つように設計されています。施設で使用するために設計されましたTControl.CustomHint。のコードを見ると、どのように呼び出されるかがわかりますTCustomHint.ShowHint。関連する抜粋は次のとおりです。

if Control.CustomHint = Self then
begin
  ....
  GetCursorPos(Pos);
end
else
  Pos := Control.ClientToScreen(Point(Control.Width div 2, Control.Height));
ShowHint(Pos);

したがって、コントロールは、現在のカーソル位置を中心に水平方向に中央に表示されるか、関連付けられたコントロールの中央に水平方向に中央に表示されます。

TCustomHintここでの結論は、あなたが使用している方法で使用するように設計されていないということだと思います.

とにかく、あなたのコードをあなたが望むようにするかなり恐ろしい方法があります。表示しない一時TCustomHintWindowを作成し、それを使用して、表示するヒント ウィンドウの幅を計算できます。そして、それを使用して、渡したポイントを実際のヒント ウィンドウに移動します。飛ばすには、 のプライベート メンバーをクラックする必要がありますTCustomHintWindow

type
  TCustomHintWindowCracker = class helper for TCustomHintWindow
  private
    procedure SetTitleDescription(const Title, Description: string);
  end;

procedure TCustomHintWindowCracker.SetTitleDescription(const Title, Description: string);
begin
  Self.FTitle := Title;
  Self.FDescription := Description;
end;

procedure ShowNotification(ATitle: UnicodeString; AMsg: UnicodeString);
var
  Box: TCustomHint;
  SizingWindow: TCustomHintWindow;
  P: TPoint;
begin
  Box := TCustomHint.Create(Form5);
  Box.Title := ATitle;
  Box.Description := AMsg;
  Box.Delay := 0;
  Box.HideAfter := 5000;
  Box.Style := bhsStandard;

  P := Point(0, 0);
  SizingWindow := TCustomHintWindow.Create(nil);
  try
    SizingWindow.HintParent := Box;
    SizingWindow.HandleNeeded;
    SizingWindow.SetTitleDescription(ATitle, AMsg);
    SizingWindow.AutoSize;
    inc(P.X, SizingWindow.Width div 2);
  finally
    SizingWindow.Free;
  end;
  Box.ShowHint(P);
end;

これはあなたが求めたことを実行しますが、正直なところ、かなり気分が悪くなります。

于 2013-09-23T15:05:57.417 に答える