我試圖在Delphi XE中實現RTF功能的工具提示窗口。爲了呈現豐富的文字,我使用了屏幕上的TRichEdit。我需要做兩件事:將TRichEdit繪製到畫布上
- 測量文本的大小。
- 繪製文本
要完成這兩項任務,我寫了這個方法:
procedure TLookupHintWindow.CallFormatRange(R: TRect; var Range: TFormatRange;
MustPaint: Boolean);
var
TextRect: TRect;
begin
RichText.SetBounds(R.Left, R.Top, R.Right, R.Bottom);
TextRect := Rect(0, 0,
RichText.Width * Screen.Pixelsperinch,
RichText.Height * Screen.Pixelsperinch);
ZeroMemory(@Range, SizeOf(Range));
Range.hdc := Canvas.Handle;
Range.hdcTarget := Canvas.Handle;
Range.rc := TextRect;
Range.rcpage := TextRect;
Range.chrg.cpMin := 0;
Range.chrg.cpMax := -1;
SendMessage(RichText.Handle, EM_FORMATRANGE,
NativeInt(MustPaint), NativeInt(@Range));
SendMessage(RichText.Handle, EM_FORMATRANGE, 0, 0);
end;
範圍參數傳遞的,這樣我就可以用這個方法以外的計算尺寸。 MustPaint參數確定是應該計算範圍(False)還是繪製(True)。
要計算的範圍內,我調用此方法:
function TLookupHintWindow.CalcRichTextRect(R: TRect; const Rtf: string): TRect;
var
Range: TFormatRange;
begin
LoadRichText(Rtf);
CallFormatRange(R, Range, False);
Result := Range.rcpage;
Result.Right := Result.Right div Screen.PixelsPerInch;
Result.Bottom := Result.Bottom div Screen.PixelsPerInch;
// In my example yields this rect: (0, 0, 438, 212)
end;
漆成:
procedure TLookupHintWindow.DrawRichText(const Text: string; R: TRect);
var
Range: TFormatRange;
begin
CallFormatRange(R, Range, True);
end;
的問題是,雖然它計算一個矩形,它是438個像素寬和212高,它實際上描繪了非常寬的一個(被裁剪)並且只有52個像素高。
我打開了文字包裝,雖然這是我的印象,應該不需要。
任何想法?
您不只是在您的tooltop控件中包含一個只讀的TRichTextEdit。聽起來比你所做的更容易。 – Johan
這是計劃,如果我沒有得到這個策略的工作。原因是一般的工具提示會有一個漸變的背景,這個背景會被控件隱藏起來。這將使RTF工具提示在同一屏幕上與其他人脫穎而出。事情是,我使用相同的電話來進行計算,所以我希望繪畫能夠正常工作。 –
難道你不能讓Richedit透明,並在背景中放一個稍深的漸變?這裏看到一些透明度代碼:http://stackoverflow.com/questions/7750224/how-to-create-child-layered-alpha-transparent-window – Johan