2013-09-23 2 views
2

TCustomHint을 사용하여 내 사용자에게 너무 흐트러지지 않게 잘 페이드 인 및 아웃하는 메시지를 표시하려고합니다. 그러나 포인트가있는 객체에 ShowHint을 호출하면 힌트 상자가 내가 지정한 지점을 중심으로 표시됩니다. 내가 원하는 것은 좌상 좌표가 주어진 점이되도록 내 상자를 나타나도록하는 것입니다.TCustomHint가 내 주변에 센터링하지 못하도록하십시오.

는 여기에 지금 힌트를 보여 사용하고 코드입니다 :

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를 호출 할 때 어떻게되는지를 추적 한 어떻게 든 TCustomHint.ShowHint(Rect: TRect) 내부의 기본 TCustomHintWindow의 최종 폭을 제어 할 수 있다면 내가 사업을 할 수 있다는 것을 나타납니다.

제 질문은 : 내 시점에서 TCustomHint의 중심을 막을 수있는 확실한 방법이 있습니까? 아니면 상속, 무승부 메소드 오버라이드 등의 과정을 거쳐야합니까? 나는 단순한 뭔가를 놓치기를 바란다.

답변

2

원하는대로 할 수있는 특별한 방법이 없습니다. 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; 

이것은 사용자가 묻는 바를 나타내지 만 솔직히 말해서 나는 다소 기분이 좋지 않습니다.

+1

답장을 보내 주셔서 감사합니다. 이런 방식으로하는 것이 더 나은지, 아니면 TCustomHint를 "영감"으로 사용하고 처음부터 자신 만의 클래스를 만들어야하는지에 대해서 조롱해야 할 것입니다. 후자쪽으로 더 기울어 져 있습니다. – bstamour