2017-12-19 24 views
1

ShowHint이 설정된 TListView가 있습니다. OnInfoTip 처리기에서 마우스가 가리키고있는 항목과 관련된 힌트 메시지가 생성됩니다. 메시지에는 줄 바꿈 (# 13 # 10) 문자가 포함될 수 있습니다.런타임시 팝업 힌트 메시지 (THintInfo :: HintStr)의 크기 결정

CM_HINTSHOW 메시지를 처리하기 위해 오버라이드가 생성되었으며 표시 할 힌트 메시지는 에 표시됩니다. 런타임시 크기를 계산할 수도 있지만 구현 세부 사항이 복잡하거나 플랫폼에 따라 다를 수 있으므로 위험합니다.

THintInfo에 '경계 사각형'을 쿼리 할 수 ​​있습니까? 아니면 표시 될 때 팝업 힌트 메시지의 크기를 정확하게 결정할 수있는 다른 방법이 있습니까?

힌트의 정확한 위치 (msg.HintInfo.HintPos)를 설정할 수 있어야합니다.

+1

[힌트 윈도우의 설정 크기 델파이/나사로의 (THintWindow)] (의 가능한 중복 https://stackoverflow.com/questions/11472874/setting-size-of-hint- window-thintwindow-in-delphi-lazarus) –

+0

예, 질문은 관련이 있습니다, 좋은 장소입니다! 나는이 질문이 닫히는 것에 반대하지 않지만 약간 다른 각도에서 문제에 직면한다. 이 질문에 더 밀접하게 관련되어있는 대답을 선호합니다. – AlainD

+0

하지만 프레임 워크가이를 처리해야합니다. 'CM_HINTSHOW' 메시지 핸들러에'HintPos'를 설정해야합니다. 아니면 뭔가를 놓친 것일 수도 있습니다 ... – kobik

답변

5

THintWindow에는이 경우 사용할 수있는 CalcHintRect 기능이 있습니다. HintWindow을 보여주는 때 VCL이 기능을 사용합니다 : TApplication의 액세스 외부는

with HintInfo do 
    HintWinRect := FHintWindow.CalcHintRect(HintMaxWidth, HintStr, HintData); 

FHintWindow으로 임시 인스턴스를 생성 할 필요가있다.

procedure TMyListView.CMHintShow(var Message: TCMHintShow); 
var 
    AHintWindow: THintWindow; 
    AHintWinRect: TRect; 
    ... 
begin 
    AHintWindow := Message.HintInfo.HintWindowClass.Create(nil); 
    try 
    AHintWinRect := AHintWindow.CalcHintRect(...); 
    ... 
    finally 
    AHintWindow.Free; 
    end; 
end; 

정확도는 THintWindowClass의 구현에 따라 다릅니다. 하지만 HintWindow는 신뢰할 수없는 경우 잘못 표시됩니다.

BidiMode이 오른쪽에서 왼쪽 일 때 중간 동부 지역에 잠재적 인 함정이있을 수 있습니다. 그리고 추가로 수행 다음 :

if FHintWindow.UseRightToLeftAlignment then 
    with HintWinRect do 
    begin 
     Delta := MultiLineWidth(HintInfo.HintStr) + 5; 
     Dec(Left, Delta); 
     Dec(Right, Delta); 
    end; 
+0

즉석에서 'THintWindow'를 만들고 myHintWnd.CalcHintRect (...)를 호출했습니다. 멋지게 작동합니다. – AlainD

+0

오, 좋은 지적입니다. 나는'FHintWindow'에 접근 할 수있는 속성이 없다는 것을 몰랐기 때문에 임시 생성이 꼭 필요합니다. – nil

+1

@ AlainD, 어떤 문제를 해결하려고하는지 모르겠지만 IMO가 잘못하고 있다고 생각합니다. 힌트 윈도우의 * dimensions *을 얻을 수 있도록 그냥'THintWindow'를 생성 하시겠습니까? 만약 당신이 * THITWindow.CalcHintRect'에서 구현을 취해야한다면'DT_CALCRECT'로'DrawText'를 사용합니다. 그러나 다시, 제 느낌은 당신이 잘못된 길을 가고 있다는 것입니다. – kobik